Merge remote-tracking branch 'origin/main'

main
王家东 4 months ago
commit 2d39b68515
  1. 3
      jeecg-boot-master/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
  2. 10
      jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/bigScreen/service/CompSystemBigScreenServiceImpl.java
  3. 7
      jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/homepage/controller/UserHomePageController.java
  4. 2
      jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/homepage/service/UserHomePageService.java
  5. 304
      jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/homepage/service/UserHomePageServiceImpl.java
  6. 60
      jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/homepage/vo/ReportCompVo.java
  7. 5
      jeecgboot-vue3-master/.eslintrc.js
  8. 8
      jeecgboot-vue3-master/src/api/common/api.ts
  9. 17
      jeecgboot-vue3-master/src/views/comprehensiveEvaluation/components/cardList7.vue
  10. 48
      jeecgboot-vue3-master/src/views/comprehensiveEvaluation/components/cardList8.vue
  11. 4
      jeecgboot-vue3-master/src/views/comprehensiveEvaluation/comprehensiveReport.vue
  12. 2
      jeecgboot-vue3-master/src/views/comprehensiveEvaluation/department.vue
  13. 2
      jeecgboot-vue3-master/src/views/comprehensiveEvaluation/individual.vue
  14. 291
      jeecgboot-vue3-master/src/views/comprehensiveEvaluation/organizingCommittee.vue
  15. 2
      jeecgboot-vue3-master/src/views/depart/workbench/components/components/cardList.vue
  16. 2
      jeecgboot-vue3-master/src/views/depart/workbench/components/components/cardListThree.vue

@ -104,8 +104,7 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/cms/front/**", "anon"); //cms不拦截
//filterChainDefinitionMap.put("/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/zwhsybsjs", "anon"); //组委会首页接口不拦截
//CMS门户
filterChainDefinitionMap.put("/cms/front/**","anon");
filterChainDefinitionMap.put("/user/login/homepage/**","anon");
filterChainDefinitionMap.put("/", "anon");
filterChainDefinitionMap.put("/doc.html", "anon");

@ -429,8 +429,7 @@ public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenServic
compCounts.put("pointCount", pointCount);
//总报名数
long count = iAnnualCompetitionProjectRegistrationService.count(new LambdaQueryWrapper<AnnualCompetitionProjectRegistration>()
.in(AnnualCompetitionProjectRegistration::getAnnualCompid, annualCompIds)
);
.in(AnnualCompetitionProjectRegistration::getAnnualCompid, annualCompIds));
//总报名数
compCounts.put("count", count);
Long personCount = iAnnualCompetitionProjectRegistrationService.count(new LambdaQueryWrapper<AnnualCompetitionProjectRegistration>()
@ -812,10 +811,11 @@ public class CompSystemBigScreenServiceImpl implements CompSystemBigScreenServic
last5YearDataVo.setCompCount(annualCompList.size());
if (!ObjectUtils.isEmpty(annualCompList)) {
annualCompList.stream().forEach(ac -> {
AnnualCompPoint annualCompPoint = iAnnualCompPointService.getOne(new LambdaQueryWrapper<AnnualCompPoint>().eq(AnnualCompPoint::getAnnualCompId, ac.getId()));
if (!ObjectUtils.isEmpty(annualCompPoint)) {
List<AnnualCompPoint> annualCompPoints = iAnnualCompPointService.list(new LambdaQueryWrapper<AnnualCompPoint>().eq(AnnualCompPoint::getAnnualCompId, ac.getId()));
if (!ObjectUtils.isEmpty(annualCompPoints)) {
Set<String> pids = annualCompPoints.stream().map(e -> e.getId()).collect(Collectors.toSet());
List<AnnualCompetitionProjectRegistration> list = iAnnualCompetitionProjectRegistrationService.list(new LambdaQueryWrapper<AnnualCompetitionProjectRegistration>()
.eq(AnnualCompetitionProjectRegistration::getAnnualCompid, annualCompPoint.getId()));
.in(AnnualCompetitionProjectRegistration::getAnnualCompid, pids));
if (!ObjectUtils.isEmpty(list)) {
Set<String> entryFormats = list.stream().map(bo -> bo.getEnrollCode()).collect(Collectors.toSet());
long personCount4CompTemp = iTeamManagementService.count(new LambdaQueryWrapper<TeamManagement>().in(TeamManagement::getEnrollCode, entryFormats));

@ -41,4 +41,11 @@ public class UserHomePageController {
Map<String, Object> result = homePageService.homePage4Depart(orgCode);
return Result.ok(result);
}
@ApiOperation(value = "河南机电-学校综合报告", notes = "河南机电-学校综合报告")
@GetMapping(value = "/report4School")
public Result report4School(HttpServletRequest req) {
Map<String, Object> result = homePageService.report4School();
return Result.ok(result);
}
}

@ -9,4 +9,6 @@ public interface UserHomePageService {
Map<String, Object> homePage4School();
Map<String, Object> report4School();
Map<String, Object> report4Depart();
}

@ -6,7 +6,9 @@ import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.util.ComputeUtils;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.demo.abilityEvaluation.entity.DepartAbilityEvaluation;
import org.jeecg.modules.demo.abilityEvaluation.entity.PersonalAbilityEvaluationCollect;
import org.jeecg.modules.demo.abilityEvaluation.service.IDepartAbilityEvaluationService;
import org.jeecg.modules.demo.abilityEvaluation.service.IPersonalAbilityEvaluationCollectService;
import org.jeecg.modules.demo.annual.entity.Annual;
import org.jeecg.modules.demo.annual.service.IAnnualService;
import org.jeecg.modules.demo.annualCompPoint.entity.AnnualCompPoint;
@ -19,14 +21,23 @@ 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.annualcompetitionprojectregistration.entity.AnnualCompetitionProjectRegistration;
import org.jeecg.modules.demo.annualcompetitionprojectregistration.entity.TeamManagement;
import org.jeecg.modules.demo.annualcompetitionprojectregistration.service.IAnnualCompetitionProjectRegistrationService;
import org.jeecg.modules.demo.annualcompetitionprojectregistration.service.ITeamManagementService;
import org.jeecg.modules.demo.awardpersion.entity.AwardPersion;
import org.jeecg.modules.demo.awardpersion.service.IAwardPersionService;
import org.jeecg.modules.demo.bigScreen.vo.CompVo;
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.demo.homepage.vo.HomePageCompVo;
import org.jeecg.modules.demo.homepage.vo.ReportCompVo;
import org.jeecg.modules.demo.projectlevel.entity.Projectlevel;
import org.jeecg.modules.demo.projectlevel.service.IProjectlevelService;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.service.ISysDepartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
@ -55,9 +66,8 @@ public class UserHomePageServiceImpl implements UserHomePageService {
@Autowired
private ICompService iCompService;
// @Autowired
// private ICompTypeService iCompTypeService;
//
@Autowired
private ICompTypeService iCompTypeService;
@Autowired
private ISysDepartService iSysDepartService;
@ -67,11 +77,11 @@ public class UserHomePageServiceImpl implements UserHomePageService {
@Autowired
private IAnnualCompetitionProjectRegistrationService iAnnualCompetitionProjectRegistrationService;
// @Autowired
// private ITeamManagementService iTeamManagementService;
@Autowired
private ITeamManagementService iTeamManagementService;
// @Autowired
// private IAwardPersionService iAwardPersionService;
@Autowired
private IAwardPersionService iAwardPersionService;
//
// @Autowired
// private ISysUserService iSysUserService;
@ -85,11 +95,11 @@ public class UserHomePageServiceImpl implements UserHomePageService {
@Autowired
private IDepartAbilityEvaluationService iDepartAbilityEvaluationService;
// @Autowired
// @Autowired
// private IPersonalAbilityEvaluationService iPersonalAbilityEvaluationService;
//
// @Autowired
// private IPersonalAbilityEvaluationCollectService iPersonalAbilityEvaluationCollectService;
@Autowired
private IPersonalAbilityEvaluationCollectService iPersonalAbilityEvaluationCollectService;
@Autowired
private IAnnualService iAnnualService;
@ -346,6 +356,247 @@ public class UserHomePageServiceImpl implements UserHomePageService {
return resultMap;
}
@Override
public Map<String, Object> report4School() {
Map<String, Object> resultMap = new LinkedHashMap<>();
int currentYear = DateUtils.getCurrentYear();
//当前年度
Annual annual = iAnnualService.getOne(new LambdaQueryWrapper<Annual>().eq(Annual::getAnnualName, currentYear + ""));
List<AnnualComp> annualCompList = iAnnualCompService.list(new LambdaQueryWrapper<AnnualComp>()
.eq(AnnualComp::getAnnualid, annual.getId()));
Set<String> compIds = Optional.ofNullable(annualCompList).orElse(new LinkedList<>()).stream().map(obj -> obj.getId()).collect(Collectors.toSet());
List<AnnualCompPoint> annualCompPointList = iAnnualCompPointService.list(new LambdaQueryWrapper<AnnualCompPoint>().in(!ObjectUtils.isEmpty(compIds), AnnualCompPoint::getAnnualCompId, compIds));
//当前年,所有项目id
Set<String> annualCompPointIds = Optional.ofNullable(annualCompPointList).orElse(new ArrayList<>()).stream().map(annualCompPoint -> annualCompPoint.getId()).collect(Collectors.toSet());
//未评奖的项目为进行中
List<AnnualCompPoint> pj0PointList = Optional.ofNullable(annualCompPointList).orElse(new LinkedList<>()).stream().filter(bo -> "0".equals(bo.getIsPj())).collect(Collectors.toList());
Map<String, Object> countMap = this.convertProjectLevel(annualCompPointList);
countMap.put("本年度已开展比赛项目数", annualCompPointList.size());
countMap.put("本年度参加比赛队伍数", 0);
countMap.put("正在进行的比赛数", pj0PointList.size());
int donePointCount = annualCompPointList.size() - pj0PointList.size();
countMap.put("已完成的比赛", donePointCount);
countMap.put("未完成的比赛", pj0PointList.size());
if (donePointCount > 0) {
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumFractionDigits(2); // 保留两位小数
decimalFormat.setRoundingMode(RoundingMode.HALF_UP); // 设置具体的进位机制
double val = ComputeUtils.div2(donePointCount, annualCompPointList.size());
countMap.put("已完成比赛比率", val);
} else {
countMap.put("已完成比赛比率", 0);
}
List<PersonalAbilityEvaluationCollect> evaluationCollects = iPersonalAbilityEvaluationCollectService
.list(new LambdaQueryWrapper<PersonalAbilityEvaluationCollect>()
.orderByDesc(PersonalAbilityEvaluationCollect::getCreateTime)
.last(" limit 60"));
resultMap.put("前60名学生能力值", evaluationCollects);
List<PersonalAbilityEvaluationCollect> vos = new LinkedList<>();
Map<String, List<PersonalAbilityEvaluationCollect>> capacityIdListMap = Optional.ofNullable(evaluationCollects).orElse(new LinkedList<>()).stream()
.collect(Collectors.groupingBy(PersonalAbilityEvaluationCollect::getCapacityId));
//遍历分组后的结果
Optional.ofNullable(capacityIdListMap).orElse(new LinkedHashMap<>()).forEach((key, value) -> {
List<PersonalAbilityEvaluationCollect> departAbilityEvaluationList = value;
double sum = departAbilityEvaluationList.stream().mapToDouble(obj -> obj.getValue()).sum();
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumFractionDigits(2); // 保留两位小数
decimalFormat.setRoundingMode(RoundingMode.HALF_UP); // 设置具体的进位机制
double val = ComputeUtils.div2(sum, departAbilityEvaluationList.size());
PersonalAbilityEvaluationCollect vo = new PersonalAbilityEvaluationCollect();
vo.setValue(val);
vo.setCapacityId(key);
vo.setCapacityName(departAbilityEvaluationList.get(0).getCapacityName());
vos.add(vo);
});
resultMap.put("前60名学生能力平均值", vos);
List<Map<String, Object>> abilityList = new LinkedList<>();
List<Integer> years = DateUtils.getLastxYear(2);
List<Annual> annualList = iAnnualService.list(new LambdaQueryWrapper<Annual>().in(Annual::getAnnualName, years).orderByAsc(Annual::getAnnualName));
Optional.ofNullable(annualList).orElse(new LinkedList<>()).stream().forEach(bo -> {
Map<String, Object> abilityResultMap = new LinkedHashMap<>();
List<DepartAbilityEvaluation> departAbilityEvaluations = iDepartAbilityEvaluationService.list(new LambdaQueryWrapper<DepartAbilityEvaluation>()
.eq(DepartAbilityEvaluation::getAnnualId, bo.getId()));
List<DepartAbilityEvaluation> voList = new LinkedList<>();
Map<String, List<DepartAbilityEvaluation>> capacityIdListMap2 = Optional.ofNullable(departAbilityEvaluations).orElse(new LinkedList<>()).stream()
.collect(Collectors.groupingBy(DepartAbilityEvaluation::getCapacityId));
//遍历分组后的结果
Optional.ofNullable(capacityIdListMap2).orElse(new LinkedHashMap<>()).forEach((key, value) -> {
List<DepartAbilityEvaluation> departAbilityEvaluationList = value;
double sum = departAbilityEvaluationList.stream().mapToDouble(obj -> obj.getValue()).sum();
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumFractionDigits(2); // 保留两位小数
decimalFormat.setRoundingMode(RoundingMode.HALF_UP); // 设置具体的进位机制
double val = ComputeUtils.div2(sum, departAbilityEvaluationList.size());
DepartAbilityEvaluation vo = new DepartAbilityEvaluation();
vo.setAnnualId(bo.getId());
vo.setValue(val);
vo.setCapacityId(key);
vo.setCapacityName(departAbilityEvaluationList.get(0).getCapacityName());
voList.add(vo);
});
abilityResultMap.put(bo.getAnnualName(), voList);
abilityList.add(abilityResultMap);
});
resultMap.put("近2年能力分析", abilityList);
resultMap.put("比赛类型占比", convertCompType(iCompService.list()));
List<AnnualCompPoint> pointList = iAnnualCompPointService.list(new LambdaQueryWrapper<AnnualCompPoint>()
.eq(AnnualCompPoint::getRequireApply, "Y"));
List<ReportCompVo> compVoList = new LinkedList<>();
Optional.ofNullable(pointList).orElse(new LinkedList<>()).stream().forEach(p -> {
ReportCompVo compVo = new ReportCompVo();
BeanUtils.copyProperties(p, compVo);
compVo.setPointName(p.getObjName());
AnnualComp annualComp = iAnnualCompService.getById(p.getAnnualCompId());
if (!ObjectUtils.isEmpty(annualComp)) {
Comp comp = iCompService.getById(annualComp.getCompid());
compVo.setCompName(comp.getCompName());
CompType compType = iCompTypeService.getById(comp.getCompTypeId());
compVo.setTypeName(compType.getTypeName());
Projectlevel projectlevel = iProjectlevelService.getById(p.getObjLevel());
compVo.setProjectLevel(projectlevel.getName());
}
List<AnnualCompetitionProjectRegistration> list = iAnnualCompetitionProjectRegistrationService.list(new LambdaQueryWrapper<AnnualCompetitionProjectRegistration>()
.eq(AnnualCompetitionProjectRegistration::getAnnualCompid, p.getId()));
if (!ObjectUtils.isEmpty(list)) {
Set<String> entryFormats = list.stream().map(bo -> bo.getEnrollCode()).collect(Collectors.toSet());
Long count = iTeamManagementService.count(new LambdaQueryWrapper<TeamManagement>().in(TeamManagement::getEnrollCode, entryFormats));
compVo.setNumber(count.intValue());
}
compVoList.add(compVo);
});
resultMap.put("学生参赛情况", compVoList);
List<AwardPersion> awardPersionList = iAwardPersionService.list();
Map<String, List<AwardPersion>> awardIdListMap = Optional.ofNullable(awardPersionList).orElse(new LinkedList<>()).stream()
.collect(Collectors.groupingBy(AwardPersion::getAwardname));
Map<String, Object> awardTypeMap = new LinkedHashMap<>();
//遍历分组后的结果
Optional.ofNullable(awardIdListMap).orElse(new LinkedHashMap<>()).forEach((key, value) -> {
Map<String, Object> awardIdMap = new LinkedHashMap<>();
awardIdMap.put(key, value.size());
awardTypeMap.putAll(awardIdMap);
});
resultMap.put("比赛获奖占比", awardTypeMap);
List<ReportCompVo> awareVos = new ArrayList<>();
Optional.ofNullable(awardPersionList).orElse(new LinkedList<>()).stream().forEach(p -> {
ReportCompVo compVo = new ReportCompVo();
compVo.setStuName(p.getStudentname());
// BeanUtils.copyProperties(p, compVo);
AnnualCompPoint point = iAnnualCompPointService.getById(p.getAnnualCompP());
if (!ObjectUtils.isEmpty(point)) {
compVo.setPointName(point.getObjName());
Projectlevel projectlevel = iProjectlevelService.getById(point.getObjLevel());
compVo.setProjectLevel(projectlevel.getName());
}
AnnualComp annualComp = iAnnualCompService.getById(p.getAnnalComp());
if (!ObjectUtils.isEmpty(annualComp)) {
Comp comp = iCompService.getById(annualComp.getCompid());
compVo.setCompName(comp.getCompName());
CompType compType = iCompTypeService.getById(comp.getCompTypeId());
compVo.setTypeName(compType.getTypeName());
}
awareVos.add(compVo);
});
resultMap.put("比赛获奖情况列表", awareVos);
List<Map<String, Object>> canSaiList = new LinkedList<>();
List<Map<String, Object>> huoJiangList = new LinkedList<>();
//二级部门
final String BASE_PARENT_ID = "1693446350597038081";
List<SysDepart> departList = iSysDepartService.list(new LambdaQueryWrapper<SysDepart>().eq(SysDepart::getParentId, BASE_PARENT_ID));
Optional.ofNullable(departList).orElse(new LinkedList<>()).stream().forEach(depart -> {
List<AnnualCompPoint> pointList4Depart = convertPoint4Depart(depart);
Set<String> pointIds4Depart = Optional.ofNullable(pointList4Depart).orElse(new ArrayList<>()).stream().map(obj -> obj.getId()).collect(Collectors.toSet());
Map<String, Object> departMap = new LinkedHashMap<>();
departMap.put("部门名称", depart.getDepartName());
//报名列表
List<AnnualCompetitionProjectRegistration> registrationList = iAnnualCompetitionProjectRegistrationService.list(new LambdaQueryWrapper<AnnualCompetitionProjectRegistration>()
.in(AnnualCompetitionProjectRegistration::getAnnualCompid, pointIds4Depart));
if (!ObjectUtils.isEmpty(registrationList)) {
//报名编号
Set<String> enrollCodes = Optional.ofNullable(registrationList).orElse(new LinkedList<>()).stream().map(bo -> bo.getEnrollCode()).collect(Collectors.toSet());
Long count = iTeamManagementService.count(new LambdaQueryWrapper<TeamManagement>().in(TeamManagement::getEnrollCode, enrollCodes));
departMap.put("参加比赛数", count);
//个人赛报名数
List<AnnualCompetitionProjectRegistration> registrationList4Stu = registrationList.stream().filter(b -> b.getEntryFormat().equals("0")).collect(Collectors.toList());
Set<String> enrollCodes4Stu = Optional.ofNullable(registrationList).orElse(new LinkedList<>()).stream().map(bo -> bo.getEnrollCode()).collect(Collectors.toSet());
Long count4Stu = iTeamManagementService.count(new LambdaQueryWrapper<TeamManagement>().in(TeamManagement::getEnrollCode, enrollCodes4Stu));
//学生人数
departMap.put("参加学生数", count4Stu);
departMap.put("队伍数", registrationList.size() - registrationList4Stu.size());
}
canSaiList.add(departMap);
List<AwardPersion> awardPersionList4Depart = iAwardPersionService.list(new LambdaQueryWrapper<AwardPersion>().eq(AwardPersion::getAnnualCompP, pointIds4Depart));
Map<String, Object> departHuoJiangMap = new LinkedHashMap<>();
departHuoJiangMap.put("部门名称", depart.getDepartName());
departHuoJiangMap.put("获取人数", awardPersionList4Depart.size());
Map<String, List<AwardPersion>> awardNameMap = Optional.ofNullable(awardPersionList4Depart).orElse(new LinkedList<>()).stream()
.collect(Collectors.groupingBy(AwardPersion::getAwardname));
//遍历分组后的结果
Optional.ofNullable(awardNameMap).orElse(new LinkedHashMap<>()).forEach((key, value) -> {
Map<String, Object> awardTypeMap2 = new HashMap<>();
awardTypeMap2.put(key, value.size());
departHuoJiangMap.putAll(awardTypeMap2);
});
huoJiangList.add(departHuoJiangMap);
});
resultMap.put("部门参赛情况列表", canSaiList);
resultMap.put("部门获奖情况列表", huoJiangList);
List<HomePageCompVo> scoreList4Point = new LinkedList<>();
List<PersonalCompScore> personalCompScores = iPersonalCompScoreService.list(new LambdaQueryWrapper<PersonalCompScore>().eq(PersonalCompScore::getAnnualCompP, annualCompPointIds));
Map<String, List<PersonalCompScore>> AnnualCompPointIdsMap = Optional.ofNullable(personalCompScores).orElse(new LinkedList<>()).stream()
.collect(Collectors.groupingBy(PersonalCompScore::getAnnualCompP));
Optional.ofNullable(AnnualCompPointIdsMap).orElse(new LinkedHashMap<>()).forEach((key, value) -> {
double sum = value.stream().mapToDouble(obj -> obj.getScore()).sum();
HomePageCompVo vo = new HomePageCompVo();
AnnualCompPoint point = iAnnualCompPointService.getById(key);
vo.setAnnualCompPointName(point.getObjName());
vo.setAnnualCompPointId(key);
AnnualComp annualComp = iAnnualCompService.getById(point.getAnnualCompId());
if (!ObjectUtils.isEmpty(annualComp)) {
Comp comp = iCompService.getById(annualComp.getCompid());
if (!ObjectUtils.isEmpty(comp)) {
vo.setCompName(comp.getCompName());
}
}
vo.setTotalScore(sum);
scoreList4Point.add(vo);
});
scoreList4Point.stream().sorted(Comparator.comparing(HomePageCompVo::getTotalScore)).collect(Collectors.toList());
resultMap.put("比赛学生积分况分析", scoreList4Point);
return resultMap;
}
private List<AnnualCompPoint> convertPoint4Depart(SysDepart depart) {
List<Comp> compList = iCompService.list(new LambdaQueryWrapper<Comp>().eq(Comp::getCompOrgan, depart.getId()));
Set<String> compIds = Optional.ofNullable(compList).orElse(new ArrayList<>()).stream().map(comp -> comp.getId()).collect(Collectors.toSet());
List<AnnualComp> annualCompList = iAnnualCompService.list(new LambdaQueryWrapper<AnnualComp>().in(!ObjectUtils.isEmpty(compIds),AnnualComp::getCompid, compIds));
Set<String> annualCompIds = Optional.ofNullable(annualCompList).orElse(new ArrayList<>()).stream().map(annualComp -> annualComp.getId()).collect(Collectors.toSet());
return iAnnualCompPointService.list(new LambdaQueryWrapper<AnnualCompPoint>().in(!ObjectUtils.isEmpty(annualCompIds),AnnualCompPoint::getAnnualCompId, annualCompIds));
}
@Override
public Map<String, Object> report4Depart() {
return null;
}
Map<String, Object> convertProjectLevel(List<AnnualCompPoint> annualCompPointList) {
Map<String, Object> map = new LinkedHashMap<>();
Map<String, List<AnnualCompPoint>> objLevelIdsMap = Optional.ofNullable(annualCompPointList).orElse(new LinkedList<>()).stream()
@ -359,4 +610,35 @@ public class UserHomePageServiceImpl implements UserHomePageService {
return map;
}
Map<String, Object> convertCompType(List<Comp> compList) {
Map<String, Object> map = new LinkedHashMap<>();
Map<String, List<Comp>> typeIdsMap = Optional.ofNullable(compList).orElse(new LinkedList<>()).stream()
.collect(Collectors.groupingBy(Comp::getCompTypeId));
Optional.ofNullable(typeIdsMap).orElse(new LinkedHashMap<>()).forEach((key, value) -> {
Map<String, Object> levelMap = new LinkedHashMap<>();
CompType compType = iCompTypeService.getById(key);
levelMap.put(compType.getTypeName(), value.size());
map.putAll(levelMap);
});
return map;
}
List<CompVo> getCompList() {
List<AnnualCompPoint> annualCompPointList = iAnnualCompPointService.list(new LambdaQueryWrapper<AnnualCompPoint>()
.eq(AnnualCompPoint::getRequireApply, "Y"));
List<CompVo> compVoList = new LinkedList<>();
Optional.ofNullable(annualCompPointList).orElse(new LinkedList<>()).stream().forEach(p -> {
CompVo compVo = new CompVo();
BeanUtils.copyProperties(p, compVo);
List<AnnualCompetitionProjectRegistration> list = iAnnualCompetitionProjectRegistrationService.list(new LambdaQueryWrapper<AnnualCompetitionProjectRegistration>()
.eq(AnnualCompetitionProjectRegistration::getAnnualCompid, p.getId()));
if (!ObjectUtils.isEmpty(list)) {
Set<String> entryFormats = list.stream().map(bo -> bo.getEnrollCode()).collect(Collectors.toSet());
Long count = iTeamManagementService.count(new LambdaQueryWrapper<TeamManagement>().in(TeamManagement::getEnrollCode, entryFormats));
compVo.setNumber(count.intValue());
}
});
return compVoList;
}
}

@ -0,0 +1,60 @@
package org.jeecg.modules.demo.homepage.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Description: TODO
* @Author: Z.H.C
* @CreateTime: 2024-07-28 17:10
* @Version: 1.0
*/
@Data
public class ReportCompVo {
@ApiModelProperty(value = "比赛id")
private String compId;
@ApiModelProperty(value = "年度比赛项目名称")
private String pointName;
@ApiModelProperty(value = "比赛类型")
private String typeName;
@ApiModelProperty(value = "比赛层次")
private String projectLevel;
@ApiModelProperty(value = "学生名称")
private String stuName;
/**
* 比赛名称
*/
@ApiModelProperty(value = "比赛名称")
private String compName;
@ApiModelProperty(value = "部门id")
private String compOrganId;
@ApiModelProperty(value = "部门名称")
private String compOrganName;
@ApiModelProperty(value = "奖项名称")
private java.lang.String awardName;
@ApiModelProperty(value = "参数人数")
private Integer number;
@ApiModelProperty(value = "年度比赛项目数")
private Integer annualCompPointNumber;
@ApiModelProperty(value = "获取人数")
private Integer awardNumber;
@ApiModelProperty(value = "获取比率")
private String awardRatio;
@ApiModelProperty(value = "年度比赛状态")
private String status;
}

@ -7,6 +7,11 @@ module.exports = defineConfig({
node: true,
es6: true,
},
globals: {
// 在这里声明html2canvas为全局变量
html2canvas: 'readonly',
},
parser: 'vue-eslint-parser',
parserOptions: {
parser: '@typescript-eslint/parser',

@ -181,3 +181,11 @@ export const getStudent = () => {
url:'/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/xssybsjs'
})
}
// 组委会报告
// /annualcompetitionprojectregistration/annualCompetitionProjectRegistration/zwhfxbg
export const getOrganizingCommitteeReport = () => {
return defHttp.get({
url:'/annualcompetitionprojectregistration/annualCompetitionProjectRegistration/zwhfxbg'
})
}

@ -5,16 +5,18 @@
<div class="table">
<div class="t_item t_head">
<div class="name">获奖等级</div>
<div class="total">项目名称</div>
<div class="name">获奖名称</div>
<div class="total">年度比赛名称</div>
<div class="total">年度比赛项目名称</div>
<div class="total">所在小队</div>
<div class="operate">积分</div>
</div>
<div class="t_item t_con" v-for="(i) in 20" :key="i">
<div class="name">一等奖</div>
<div class="total">项目一</div>
<div class="total">一路向北</div>
<div class="operate">121</div>
<div class="t_item t_con" v-for="(item,index) in props.data" :key="index">
<div class="name">{{ item.jxname }}</div>
<div class="total">{{item.ndbs}}</div>
<div class="total">{{ item.ndbsxm }}</div>
<div class="total">{{ item.dwname }}</div>
<div class="operate">{{ item.jf }}</div>
</div>
</div>
</div>
@ -26,6 +28,7 @@
const props = defineProps({
data: {
type: Array,
default:[]
},
});

@ -1,48 +1,39 @@
<template>
<div class="foo_card8">
<div class="title"> 比赛获奖情况<div class="log-btn" @click="unfold"><SvgIcon class="icon" name="zhedie" /></div
></div>
<div class="foo_card">
<!-- <div class="title"> 部门学生积分排名 </div> -->
<div class="table">
<div class="t_item t_head">
<div class="name">部门名称</div>
<div class="total">参赛人数</div>
<div class="operate">队伍量</div>
<div class="ranking">排名</div>
<div class="name">参赛院系</div>
<!-- <div class="total">报名数</div> -->
<div class="operate">报名数</div>
</div>
<div class="t_item t_con" v-for="(i) in 20" :key="i">
<div class="name">机电学院</div>
<div class="total">2121</div>
<div class="operate">121</div>
<div class="t_item t_con" v-for="(i,index) in props.data" :key="index">
<div class="ranking">
<div class="ol" :class="{ ac: index <= 3 }">{{ i.pm}}</div>
</div>
<div class="name">{{ i.csyxname }}</div>
<div class="operate">{{ i.bms }}</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { SvgIcon } from '/@/components/Icon';
const props = defineProps({
data: {
type: Array,
default: [],
},
});
let falg = false;
const unfold = () => {
const dom: any = document.querySelector('.foo_card8') as Element;
falg = !falg;
if (falg) {
dom.style.height = 'auto';
} else {
dom.style.height = '500px';
}
};
</script>
<style lang="less" scoped>
.foo_card8 {
.foo_card {
width: 100%;
height: 500px;
height: calc(502px - 58px);
overflow: auto;
background: #ffffff;
// box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
@ -50,19 +41,12 @@
.title {
width: 100%;
text-align: center;
padding-left: 23px;
height: 57px;
line-height: 57px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
position: relative;
.icon {
position: absolute;
right: 20px;
top: 20px;
cursor: pointer;
}
&::before {
content: '';

@ -185,8 +185,8 @@
await clickDom();
// return
var canvas = document.createElement('canvas');
var w = parseInt(document.querySelector('.container').clientWidth);
var h = parseInt(document.querySelector('.container').clientHeight);
var w = parseInt((document.querySelector('.container') as Element).clientWidth);
var h = parseInt((document.querySelector('.container') as Element).clientHeight);
console.log(w, h);
canvas.width = w;

@ -1,6 +1,6 @@
<template>
<div class="container">
<div class="title">河南机电学院比赛综合报告</div>
<div class="title">河南机电学院比赛部门报告</div>
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>

@ -1,7 +1,7 @@
<template>
<div class="personage">
<h1 class="title">机电学院比赛综合报告</h1>
<h1 class="title">机电学院比赛个人报告</h1>
<p class="paragraph">
我是比赛综述全面落实立德树人根本任务依据CDIO工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力具有终身学习和创新创业意识国际交流能力团队合作精神等良好素养能适应产业与社会变革的国际化应用型人
</p>

@ -1,158 +1,175 @@
<template>
<div class="container">
<div class="title">河南机电学院比赛综组委会报告</div>
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="card-content">
<div class="item" v-for="(item,index) in 4" :key="item">
<div class="top-title">{{ formatTitle(index) }}</div>
<div class="sum">{{ index === 0 ? '第八届': '88' }}</div>
</div>
<div class="container">
<div class="title">河南机电学院比赛 {{data.annualCompName}} 组委会报告</div>
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="card-content">
<div class="item">
<div class="top-title">当前届数</div>
<div class="sum">{{data.sum}}</div>
</div>
<cardTitle title="参赛学生综合能力评价分析" />
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="year-content">
<div class="left border-000">
<div class="border-title">年度维度分析</div>
<randerChart />
</div>
<div class="right border-000">
<cardList />
</div>
<div class="item">
<div class="top-title">参赛报名数</div>
<div class="sum">{{ data.bmNumber }}</div>
</div>
<cardTitle title="比赛学生获奖情况分析" />
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="participation-status-content">
<div class="right border-000">
<cardList7 />
</div>
<div class="item">
<div class="top-title">参赛人数</div>
<div class="sum">{{ data.csNumber }}</div>
</div>
<cardTitle title="部门参赛情况分析" />
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="participation-status-content">
<div class="right border-000">
<cardList8 />
</div>
<div class="item">
<div class="top-title">比赛项目数</div>
<div class="sum">{{ data.bsxmSum }}</div>
</div>
</div>
<cardTitle title="参赛学生综合能力评价分析" />
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="year-content">
<div class="left border-000">
<div class="border-title">年度维度分析</div>
<randerChart />
</div>
<div class="right border-000">
<cardList />
</div>
</div>
<cardTitle title="比赛学生获奖情况分析" />
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="participation-status-content">
<div class="right border-000">
<cardList7/>
</div>
</div>
<cardTitle title="部门参赛情况分析" />
<p class="description"
>我是比赛综述:全面落实立德树人根本任务依据CDI0工程教育理念培养德劳全面发展掌握软件工程专业所需的数学与自然科学基础知识专业基础理论知识;在企业级软件开发和工业智能软件开发方向能承担软件分析设计开发项目管理等任务具备解决复杂工程问题的能力;具有终身学习和创新创业意识国际交流能力团队合作精神等良好案养能适应产业与社会变革的国际化应用型人才<br />本专业毕业生经过五年左右的实际工作能够达到以下目标:</p
>
<div class="participation-status-content">
<div class="right border-000">
<cardList8 :data="data.csyxbmpm"/>
</div>
</div>
</template>
</div>
</template>
<script lang="ts" setup>
import cardTitle from './components/cardTitle.vue';
import cardList from './components/cardList.vue';
import cardList7 from './components/cardList7.vue';
import cardList8 from './components/cardList8.vue';
import randerChart from './components/randerChart.vue';
<script lang="ts" setup>
import cardTitle from './components/cardTitle.vue';
import cardList from './components/cardList.vue';
import cardList7 from './components/cardList7.vue';
import cardList8 from './components/cardList8.vue';
import randerChart from './components/randerChart.vue';
import { getOrganizingCommitteeReport } from '/@/api/common/api';
import {ref} from 'vue'
const data = ref<any>({})
const getOrganizingCommitteeReportEvent = async () => {
const res = await getOrganizingCommitteeReport()
data.value = res
console.log(res);
// import { onMounted, reactive, ref, toRefs, watch } from 'vue'
const formatTitle = (index:number) => {
const arr:any = ['当前届数','参赛人数','参赛队伍数','比赛项目数']
return arr[index]
}
</script>
}
getOrganizingCommitteeReportEvent()
const formatTitle = (index: number) => {
const arr: any = ['当前届数', '参赛人数', '参赛队伍数', '比赛项目数'];
return arr[index];
};
</script>
<style lang="less" scoped>
.container {
width: 1200px;
margin: 0 auto;
// height: 100vh;
padding-bottom: 30px;
.title {
width: 100%;
font-size: 36px;
text-align: center;
font-weight: 700;
}
.description {
text-indent: 2em;
margin: 30px 0;
}
.card-content {
<style lang="less" scoped>
.container {
width: 1200px;
margin: 0 auto;
// height: 100vh;
padding-bottom: 30px;
.title {
width: 100%;
font-size: 36px;
text-align: center;
font-weight: 700;
}
.description {
text-indent: 2em;
margin: 30px 0;
}
.card-content {
display: flex;
.item {
width: 25%;
height: 100px;
border: 1px solid #000;
margin-right: 10px;
display: flex;
.item {
width: 25%;
height: 100px;
border: 1px solid #000;
margin-right: 10px;
flex-direction: column;
justify-content: space-between;
padding: 10px 15px;
.top-title {
font-size: 12px;
color: #aaa;
}
.sum {
font-size: 36px;
font-weight: 700;
}
.content {
display: flex;
flex-direction: column;
width: 100%;
justify-content: space-between;
padding: 10px 15px;
.top-title {
font-size: 12px;
color: #aaa;
}
.sum {
font-size: 36px;
font-weight: 700;
}
.content {
display: flex;
width: 100%;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: #999;
}
}
.item:nth-child(4) {
margin: 0;
align-items: center;
font-size: 12px;
color: #999;
}
}
.year-content {
width: 100%;
height: auto;
display: flex;
justify-content: space-between;
.left {
width: 500px;
height: 500px;
}
.right {
flex: 1;
height: auto;
margin-left: 50px;
}
.item:nth-child(4) {
margin: 0;
}
.participation-status-content {
width: 100%;
height: auto;
display: flex;
justify-content: space-between;
.left {
width: 500px;
height: 500px;
margin-left: 50px;
}
.right {
flex: 1;
height: auto;
}
}
.year-content {
width: 100%;
height: auto;
display: flex;
justify-content: space-between;
.left {
width: 500px;
height: 500px;
}
.footer{
width: 100%;
margin: 30px 0;
.right {
flex: 1;
height: auto;
margin-left: 50px;
}
}
.border-000 {
border: 1px solid #000;
.participation-status-content {
width: 100%;
height: auto;
display: flex;
justify-content: space-between;
.left {
width: 500px;
height: 500px;
margin-left: 50px;
}
.right {
flex: 1;
height: auto;
}
}
.border-title {
.footer {
width: 100%;
border-bottom: 1px solid #000;
height: 50px;
line-height: 50px;
font-size: 14px;
padding: 0 20px;
margin: 30px 0;
}
</style>
}
.border-000 {
border: 1px solid #000;
}
.border-title {
width: 100%;
border-bottom: 1px solid #000;
height: 50px;
line-height: 50px;
font-size: 14px;
padding: 0 20px;
}
</style>

@ -6,7 +6,7 @@
<div class="t_item t_head">
<div class="ranking">排名</div>
<div class="name">参赛院系</div>
<div class="total">报名</div>
<div class="total">报名数</div>
<div class="operate">操作</div>
</div>
<div class="t_item t_con" v-for="(i,index) in props.data" :key="index">

@ -6,7 +6,7 @@
<div class="t_item t_head">
<!-- <div class="ranking">排名</div> -->
<div class="name">项目名称</div>
<div class="total">报名</div>
<div class="total">报名数</div>
<div class="total">队伍数</div>
<div class="operate">所在院系</div>
</div>

Loading…
Cancel
Save