From dcd20cc64501b74a8bbcc538d3c91bf7274e7e91 Mon Sep 17 00:00:00 2001 From: zhc077 <565291854@qq.com> Date: Thu, 11 Jul 2024 18:05:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B2=B3=E5=8D=97=E6=9C=BA=E7=94=B5=E8=81=8C?= =?UTF-8?q?=E4=B8=9A=E5=AD=A6=E9=99=A2-=E5=A4=A7=E5=B1=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CompSystemBigScreenServiceImpl.java | 144 +++++++++++++++--- 1 file changed, 119 insertions(+), 25 deletions(-) diff --git a/jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/bigScreen/service/CompSystemBigScreenServiceImpl.java b/jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/bigScreen/service/CompSystemBigScreenServiceImpl.java index 15ef2f2b..feb158b2 100644 --- a/jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/bigScreen/service/CompSystemBigScreenServiceImpl.java +++ b/jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/bigScreen/service/CompSystemBigScreenServiceImpl.java @@ -1,6 +1,8 @@ package org.jeecg.modules.demo.bigScreen.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.jeecg.common.util.ComputeUtils; import org.jeecg.common.util.DateUtils; import org.jeecg.modules.demo.abilityEvaluation.entity.DepartAbilityEvaluation; @@ -15,11 +17,12 @@ import org.jeecg.modules.demo.annualCompPoint.entity.AnnualCompPoint; import org.jeecg.modules.demo.annualCompPoint.service.IAnnualCompPointService; import org.jeecg.modules.demo.annualScore.entity.PersonalCompScore; import org.jeecg.modules.demo.annualScore.entity.PersonalCompTotalScore; -import org.jeecg.modules.demo.annualScore.service.IDepartCompTotalScoreService; import org.jeecg.modules.demo.annualScore.service.IPersonalCompScoreService; import org.jeecg.modules.demo.annualScore.service.IPersonalCompTotalScoreService; import org.jeecg.modules.demo.annualcomp.entity.AnnualComp; import org.jeecg.modules.demo.annualcomp.service.IAnnualCompService; +import org.jeecg.modules.demo.annualcompaward.entity.AnnualCompAward; +import org.jeecg.modules.demo.annualcompaward.service.IAnnualCompAwardService; import org.jeecg.modules.demo.annualcompetitionprojectregistration.entity.AnnualCompetitionProjectRegistration; import org.jeecg.modules.demo.annualcompetitionprojectregistration.entity.TeamManagement; import org.jeecg.modules.demo.annualcompetitionprojectregistration.service.IAnnualCompetitionProjectRegistrationService; @@ -30,6 +33,8 @@ import org.jeecg.modules.demo.bigScreen.vo.CompVo; import org.jeecg.modules.demo.bigScreen.vo.Last5YearDataVo; import org.jeecg.modules.demo.comp.entity.Comp; import org.jeecg.modules.demo.comp.service.ICompService; +import org.jeecg.modules.demo.comptype.entity.CompType; +import org.jeecg.modules.demo.comptype.service.ICompTypeService; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.service.ISysDepartService; @@ -54,6 +59,7 @@ import java.util.stream.Collectors; * @Version: 1.0 */ @Service +@Slf4j public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenService { @Autowired @@ -65,11 +71,14 @@ public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenServic @Autowired private ICompService iCompService; + @Autowired + private ICompTypeService iCompTypeService; + @Autowired private ISysDepartService iSysDepartService; @Autowired - private IDepartCompTotalScoreService iDepartCompTotalScoreService; + private IAnnualCompAwardService iAnnualCompAwardService; @Autowired private IAnnualCompetitionProjectRegistrationService iAnnualCompetitionProjectRegistrationService; @@ -104,6 +113,10 @@ public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenServic //二级部门id private final String BASE_PARENT_ID = "1693446350597038081"; + private static final Integer ONE_HUNDRED = 100; + private static final Double ZERO_POINT_FIVE = 0.5; + private static final Double ZERO_POINT_TWO = 0.2; + @Override public List> canSai() { @@ -231,35 +244,112 @@ public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenServic List departList = iSysDepartService.list(new LambdaQueryWrapper().eq(SysDepart::getParentId, BASE_PARENT_ID)); Optional.ofNullable(departList).orElse(new LinkedList<>()).stream().forEach(depart -> { Map resultMap = new LinkedHashMap<>(); - List compList = iCompService.list(new LambdaQueryWrapper().eq(Comp::getCompOrgan, depart.getParentId())); + List compList = iCompService.list(new LambdaQueryWrapper().eq(Comp::getCompOrgan, depart.getId())); //比赛类型 Map> compTypeListMap = Optional.ofNullable(compList).orElse(new LinkedList<>()).stream() .collect(Collectors.groupingBy(Comp::getCompTypeId)); - //TODO - //遍历分组后的结果 -// DecimalFormat decimalFormat = new DecimalFormat(); -// decimalFormat.setMaximumFractionDigits(2); // 保留两位小数 -// decimalFormat.setRoundingMode(RoundingMode.HALF_UP); // 设置具体的进位机制 -// List vos = new ArrayList<>(); -// Optional.ofNullable(compTypeListMap).orElse(new LinkedHashMap<>()).forEach((key, value) -> { -// -// double ratio = ComputeUtils.div2(value.size(), registrationList.size()); -// CompVo vo = new CompVo(); -// vo.setCompOrganId(depart.getId()); -// vo.setCompOrganName(depart.getDepartName()); -// vo.setNumber(registrationList.size()); -// vo.setAwardName(key); -// vo.setAwardNumber(value.size()); -// vo.setAwardRatio(ratio + ""); -// vos.add(vo); -// }); - resultMap.put(depart.getDepartName(), null); + List> vos = new ArrayList<>(); + Optional.ofNullable(compTypeListMap).orElse(new LinkedHashMap<>()).forEach((key, comps) -> { + AtomicReference score4CompType = new AtomicReference<>(new BigDecimal(0)); + CompType compType = iCompTypeService.getById(key.toString()); + Optional.ofNullable(comps).orElse(new ArrayList<>()).stream().forEach(comp -> { + List annualComps = iAnnualCompService.list(new LambdaQueryWrapper().eq(AnnualComp::getCompid, comp.getId())); + Set annualCompIds = Optional.ofNullable(annualComps).orElse(new ArrayList<>()).stream().map(bo -> bo.getAnnualid()).collect(Collectors.toSet()); + if (!ObjectUtils.isEmpty(annualCompIds)) { + List annualCompPointList = iAnnualCompPointService.list(new LambdaQueryWrapper().in(AnnualCompPoint::getAnnualCompId, annualCompIds)); + Optional.ofNullable(annualCompPointList).orElse(new ArrayList<>()).stream().forEach(annualCompPoint -> { + BigDecimal score = convertScore(annualCompPoint, comp); + score4CompType.getAndUpdate(val -> val.add(new BigDecimal(score.toString()))); + }); + } + }); + Map typeMap = new LinkedHashMap<>(); + typeMap.put(compType.getTypeName(), score4CompType.get()); + vos.add(typeMap); + }); + resultMap.put(depart.getDepartName(), vos); resultList.add(resultMap); }); return resultList; } + BigDecimal convertScore(AnnualCompPoint annualCompPoint, Comp comp) { + AtomicReference score4Point = new AtomicReference<>(new BigDecimal(0)); + if (!ObjectUtils.isEmpty(annualCompPoint) && !ObjectUtils.isEmpty(comp)) { + //年度比赛项目 奖项设置 + AnnualCompAward annualCompAward = iAnnualCompAwardService.getOne(new LambdaQueryWrapper() + .eq(AnnualCompAward::getAnnucompid, annualCompPoint.getId())); + + if (ObjectUtils.isEmpty(annualCompAward)) return score4Point.get(); + + //1、根据年度比赛项目id,查询获取管理(award_persion)列表,即参赛人员及获取奖项顺序号 + List awardPersionList = iAwardPersionService.list(new LambdaQueryWrapper() + .eq(AwardPersion::getAnnualCompP, annualCompPoint.getId())); + + //项目分值 + double compweight_val = comp.getCompweight().doubleValue(); + + //2、遍历获奖管理(award_persion)列表,根据奖项id查询比赛奖项设置表(annual_comp_award) + Optional.ofNullable(awardPersionList).orElse(new LinkedList<>()).forEach(en -> { + + //2.1、比赛奖项设置 根据awardsort奖项顺序,获取对应的奖项权重值 + //奖项顺序与奖项权重值映射关系: wardsort(1:first_weight,2:second_weight,3:third_weight,4:fourth_weight,5:fifth_weight) + //奖项权重值 百分比 + String weightVal; + switch (en.getAwardsort()) { + case 1: + weightVal = annualCompAward.getFirstWeight(); + break; + case 2: + weightVal = annualCompAward.getSecondWeight(); + break; + case 3: + weightVal = annualCompAward.getThirdWeight(); + break; + case 4: + weightVal = annualCompAward.getFourthWeight(); + break; + case 5: + weightVal = annualCompAward.getFifthWeight(); + break; + default: + weightVal = "100"; + } + //参与形式 个人、团队,键值对 N-个人 Y-团队 + String entryForm = annualCompPoint.getEntryForm(); + + //2.2 根据报名编号查询参赛者信息 + List managementList = iTeamManagementService.list(new LambdaQueryWrapper() + .eq(TeamManagement::getEnrollCode, en.getEnrollCode()) + ); + if (ObjectUtils.isEmpty(managementList)) return; + + //3、计算积分 项目分值*项目奖项权重值/100 + log.info("***************年度比赛项目-{},项目分值:{},奖项权重值:{}", annualCompPoint.getObjName(), compweight_val, weightVal); + double baseScore = ComputeUtils.mul(compweight_val, ComputeUtils.div2(new Double(weightVal), ONE_HUNDRED)); + AtomicReference score = new AtomicReference<>((double) 0); + if (StringUtils.equals("Y", entryForm)) { //团队赛 + Optional.ofNullable(managementList).orElse(new ArrayList<>()).forEach(e -> { + // 参与形式是团队时,队长积分*0.5,职员积分*0.2 + //captain 是否队长 + if (StringUtils.equals("0", e.getCaptain())) { +// score.set(ComputeUtils.mul(baseScore, ZERO_POINT_FIVE)); + score4Point.getAndUpdate(val -> val.add(new BigDecimal(ComputeUtils.mul(baseScore, ZERO_POINT_FIVE)))); + } else { +// score.set(ComputeUtils.mul(baseScore, ZERO_POINT_TWO)); + score4Point.getAndUpdate(val -> val.add(new BigDecimal(ComputeUtils.mul(baseScore, ZERO_POINT_TWO)))); + } + }); + } else { //个人赛 +// score.set(baseScore); + score4Point.getAndUpdate(val -> val.add(new BigDecimal(baseScore))); + } + }); + } + return score4Point.get(); + } + /** * @description: 单项比赛数据展示 * 使用大数据页面的形式全面展示某项比赛的各种综合数据,包括年度比赛列表、比赛项目数、参赛人数统计、多维度能力评价分析数据、近五年比赛人数对比,比赛获奖列表,参赛人员积分列表。需要提供功能截图。 @@ -459,7 +549,7 @@ public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenServic // compCounts.put("pointCount", pointCount); //总报名数 long count = Optional.ofNullable(compVoList).orElse(new LinkedList<>()).stream().mapToInt(vo -> vo.getNumber()).sum(); - //总报名数 + //总报名人数 compCounts.put("count", count); Long personCount = iAnnualCompetitionProjectRegistrationService.count(new LambdaQueryWrapper() .eq(AnnualCompetitionProjectRegistration::getEntryFormat, "0") @@ -467,8 +557,12 @@ public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenServic //学生人数 compCounts.put("personCompCount", personCount); Long teamCount = count - personCount; - //队伍数 - compCounts.put("teamCompCount", teamCount); + if (count < personCount) { + compCounts.put("teamCompCount", 0);//队伍数 + } else { + //队伍数 + compCounts.put("teamCompCount", teamCount); + } //比赛统计 resultMap.put("compCounts", compCounts);