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.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.vo.*; import com.ycl.platform.mapper.CheckRuleMapper; import com.ycl.platform.mapper.CheckScoreMapper; import com.ycl.platform.mapper.CheckTemplateMapper; import com.ycl.platform.mapper.CheckTemplateRuleMapper; 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.PublishType; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; 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.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; /** * 查询考核积分指标 * * @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 checkScore) { //区县只能看已发布 roleControl(checkScore); // 获取数据日期时间 Calendar calendar = Calendar.getInstance(); getCheckScore(checkScore, calendar); // 一号查询之前的数据 if (LocalDateTime.now().getDayOfMonth() == 1) { calendar.add(Calendar.DAY_OF_MONTH, -1); } List checkScores = scoreMapper.selectCheckScoreMap(checkScore); // 如果数据为空,则查询之前的数据 if (checkScores.isEmpty()) { CheckScore one = scoreMapper.getLast(checkScore); if (Objects.nonNull(one)) { calendar.setTime(one.getCreateTime()); getCheckScore(checkScore, calendar); checkScores = scoreMapper.selectCheckScoreMap(checkScore); } } return checkScores.stream().collect(Collectors.groupingBy(CheckScore::getDeptId)); } private void getCheckScore(CheckScore checkScore, Calendar calendar) { // 0 省厅月度 1 市局月度 2 省厅季度 3 市局季度 switch (checkScore.getExamineTag()) { case 0, 1: checkScore.setEndDate(calendar.getTime()); calendar.set(Calendar.DAY_OF_MONTH, 1); checkScore.setStartDate(calendar.getTime()); break; case 2, 3: checkScore.setStartDate(DateUtils.getQuarterStart(calendar).getTime()); checkScore.setEndDate(DateUtils.getQuarterEnd(calendar).getTime()); checkScore.setExamineTag(checkScore.getExamineTag() == 2 ? 0 : 1); break; } } /** * 查询考核积分卡片列表 * * @param checkScore 考核积分 * @return 考核积分 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public Map> 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); return checkScores.stream().collect(Collectors.groupingBy(CheckScore::getDeptId)); } /** * 区县详情 * * @param checkScore 考核积分 * @return 考核积分 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List page(CheckScore checkScore) { //区县只能看已发布 roleControl(checkScore); return scoreMapper.selectCheckScoreList(checkScore); } /** * 发布考核积分信息 * * @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 { String date = exportDTO.getDate(); //如果请求参数时间为空,查这条记录的时间 if (StringUtils.isEmpty(exportDTO.getDate()) && CollectionUtils.isEmpty(exportDTO.getQuarter())) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); if (exportDTO.getId() != null) { CheckScore checkScore = getById(exportDTO.getId()); Date createTime = checkScore.getCreateTime(); date = formatter.format(createTime); } else { //防止卡片页面导出不传scoreId,导致报错 date = formatter.format(new Date()); } } /** 导三张sheet */ //车辆 CheckIndexCar checkIndexCar = new CheckIndexCar(); checkIndexCar.setDate(date); checkIndexCar.setQuarter(exportDTO.getQuarter()); checkIndexCar.setDeptId(exportDTO.getDeptId()); checkIndexCar.setDeptIds(exportDTO.getDeptIds()); checkIndexCar.setExamineTags(exportDTO.getExamineTags()); //权限控制 只能查看已发布 roleControl(checkIndexCar); List checkIndexCars = indexCarService.selectCheckIndexCarList(checkIndexCar); //计算平均值放在excel最后 if (exportDTO.getAverage() && !CollectionUtils.isEmpty(checkIndexCars)) { //先区分各个区县,再区分考核标签 Map> carMap = checkIndexCars.stream().collect(Collectors.groupingBy(CheckIndexCar::getDeptId)); carMap.forEach((deptId,list)->{ List provinceList = list.stream().filter(car -> CheckConstants.Examine_Tag_Province.equals(car.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(provinceList)) { checkIndexCars.add(CheckIndexCar.calculateAverage(provinceList)); } List countyList = list.stream().filter(car -> CheckConstants.Examine_Tag_County.equals(car.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(countyList)) { checkIndexCars.add(CheckIndexCar.calculateAverage(countyList)); } }); } List checkIndexCarVOS = new ArrayList<>(); for (CheckIndexCar indexCar : checkIndexCars) { CheckIndexCarVO excelVo = CheckIndexCar.getExcelVo(indexCar); checkIndexCarVOS.add(excelVo); } ExcelExp e1 = new ExcelExp("车辆考核指标数据", checkIndexCarVOS, CheckIndexCarVO.class); //人脸 CheckIndexFace checkIndexFace = new CheckIndexFace(); checkIndexFace.setDate(date); checkIndexFace.setQuarter(exportDTO.getQuarter()); checkIndexFace.setDeptId(exportDTO.getDeptId()); checkIndexFace.setDeptIds(exportDTO.getDeptIds()); checkIndexFace.setExamineTags(exportDTO.getExamineTags()); //权限控制 只能查看已发布 roleControl(checkIndexFace); List checkIndexFaces = indexFaceService.selectCheckIndexFaceList(checkIndexFace); //计算平均值放在excel最后 if (exportDTO.getAverage() && !CollectionUtils.isEmpty(checkIndexFaces)) { //先区分各个区县,再区分考核标签 Map> faceMap = checkIndexFaces.stream().collect(Collectors.groupingBy(CheckIndexFace::getDeptId)); faceMap.forEach((deptId,list)->{ List provinceList = list.stream().filter(face -> CheckConstants.Examine_Tag_Province.equals(face.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(provinceList)) { checkIndexFaces.add(CheckIndexFace.calculateAverage(provinceList)); } List countyList = list.stream().filter(face -> CheckConstants.Examine_Tag_County.equals(face.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(countyList)) { checkIndexFaces.add(CheckIndexFace.calculateAverage(countyList)); } }); } List checkIndexFaceVOS = new ArrayList<>(); for (CheckIndexFace indexFace : checkIndexFaces) { CheckIndexFaceVO excelVo = CheckIndexFace.getExcelVo(indexFace); checkIndexFaceVOS.add(excelVo); } ExcelExp e2 = new ExcelExp("人脸考核指标数据", checkIndexFaceVOS, CheckIndexFaceVO.class); //视频 CheckIndexVideo checkIndexVideo = new CheckIndexVideo(); checkIndexVideo.setDate(date); checkIndexVideo.setQuarter(exportDTO.getQuarter()); checkIndexVideo.setDeptId(exportDTO.getDeptId()); checkIndexVideo.setDeptIds(exportDTO.getDeptIds()); checkIndexVideo.setExamineTags(exportDTO.getExamineTags()); //权限控制 只能查看已发布 roleControl(checkIndexVideo); List checkIndexVideos = indexVideoService.selectCheckIndexVideoList(checkIndexVideo); //计算平均值放在excel最后 if (exportDTO.getAverage() && !CollectionUtils.isEmpty(checkIndexVideos)) { //先区分各个区县,再区分考核标签 Map> videoMap = checkIndexVideos.stream().collect(Collectors.groupingBy(CheckIndexVideo::getDeptId)); videoMap.forEach((deptId,list)->{ List provinceList = list.stream().filter(video -> CheckConstants.Examine_Tag_Province.equals(video.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(provinceList)) { checkIndexVideos.add(CheckIndexVideo.calculateAverage(provinceList)); } List countyList = list.stream().filter(video -> CheckConstants.Examine_Tag_County.equals(video.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(countyList)) { checkIndexVideos.add(CheckIndexVideo.calculateAverage(countyList)); } }); } 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() { return baseMapper.home(); } @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); } // /** // * 新增考核积分 // * // * @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); // } }