添加按批次对比分析两个接口 #5

Merged
Cool merged 8 commits from YuNan/CET-cmd-2.0:dev into dev 2024-10-17 15:31:36 +08:00
7 changed files with 215 additions and 0 deletions

View File

@ -1,8 +1,11 @@
package org.jeecg.modules.controller; package org.jeecg.modules.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result; import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.dto.getRateByEntryDateDto;
import org.jeecg.modules.dto.getRateByMajorAndLastestBatchDto;
import org.jeecg.modules.entity.Cet_6; import org.jeecg.modules.entity.Cet_6;
import org.jeecg.modules.service.CenterService; import org.jeecg.modules.service.CenterService;
import org.jeecg.modules.service.ICet_4Service; import org.jeecg.modules.service.ICet_4Service;
@ -12,6 +15,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/cet") @RequestMapping("/cet")
@ -26,6 +30,8 @@ public class CenterController {
/** /**
* 统计四级表和六级表中存在的年级 * 统计四级表和六级表中存在的年级
*
* @return {@link Result }<{@link JSONObject }>
*/ */
@GetMapping(value = "/getEntrydate") @GetMapping(value = "/getEntrydate")
public Result<JSONObject> getEntrydate() { public Result<JSONObject> getEntrydate() {
@ -58,6 +64,11 @@ public class CenterController {
/** /**
* 依据学院和年级获取四级和六级通过数据 * 依据学院和年级获取四级和六级通过数据
*
* @param college
* @param major
* @param entrydate
* @return {@link Result }<{@link JSONObject }>
*/ */
@GetMapping(value = "/getData") @GetMapping(value = "/getData")
// @Cacheable(cacheNames = "getData", key = "#college+#major+#entrydate") // @Cacheable(cacheNames = "getData", key = "#college+#major+#entrydate")
@ -101,16 +112,42 @@ public class CenterController {
return null; return null;
} }
} }
@GetMapping("/getRateByBatch") @GetMapping("/getRateByBatch")
public Result<JSONObject> getRateByBatch(@RequestParam("batch")String batch, @RequestParam("college") String college, @RequestParam("level")String level){ public Result<JSONObject> getRateByBatch(@RequestParam("batch")String batch, @RequestParam("college") String college, @RequestParam("level")String level){
if (level.equals("cet4")){ if (level.equals("cet4")){
return cet4Service.getRateByBatch(college,batch); return cet4Service.getRateByBatch(college,batch);
}else return null; }else return null;
} }
@PostMapping("/getRateByMajor") @PostMapping("/getRateByMajor")
public Result<JSONObject> getRateByMajor(@RequestBody JSONObject webData){ public Result<JSONObject> getRateByMajor(@RequestBody JSONObject webData){
return cet4Service.getRateByMajor(webData); return cet4Service.getRateByMajor(webData);
} }
/**
* @param getRateByMajorAndLastestBatchParam
* @return {@link Result }<{@link JSONObject }>
*/
@PostMapping("/getRateByMajorAndLastestBatch")
@ApiOperation(value = "根据专业获取每个年级最新批次的通过率")
public Result<JSONObject> getRateByMajorAndLastestBatch(@Valid @RequestBody getRateByMajorAndLastestBatchDto getRateByMajorAndLastestBatchParam) {
log.info("根据专业获取最新批次的通过率入参:{}", JSONObject.toJSONString(getRateByMajorAndLastestBatchParam));
return cet4Service.getRateByMajorAndLastestBatch(getRateByMajorAndLastestBatchParam);
}
/**
* @param getRateByEntryDateDtoParams
* @return {@link Result }<{@link JSONObject }>
*/
@PostMapping( "/getRateByEntryDate")
@ApiOperation(value = "根据学院/专业的每个年级的通过率")
public Result<JSONObject> getRateByEntryDate(@RequestBody getRateByEntryDateDto getRateByEntryDateDtoParams) {
log.info("根据学院/专业的每个年级的通过率: {}", JSONObject.toJSONString(getRateByEntryDateDtoParams));
return cet4Service.getRateByEntryDate(getRateByEntryDateDtoParams);
}
@GetMapping("/getTest") @GetMapping("/getTest")
public Result<JSONObject> getTest() { public Result<JSONObject> getTest() {
return centerService.getTest(); return centerService.getTest();

View File

@ -0,0 +1,22 @@
package org.jeecg.modules.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@ApiModel(value = "根据专业获取每个年级最新批次的通过率")
@Data
public class getRateByEntryDateDto {
// @ApiModelProperty(value = "年级")
// @NotBlank
// String entrydate;
@ApiModelProperty(value = "学院")
@NotBlank
private String college;
@ApiModelProperty(value = "专业")
private String major;
}

View File

@ -0,0 +1,25 @@
package org.jeecg.modules.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
*
* @author NanYu
* @date 2024/10/13
*/
@ApiModel(value = "根据专业获取每个年级最新批次的通过率")
@Data
public class getRateByMajorAndLastestBatchDto implements Serializable {
@ApiModelProperty(value = "学院")
@NotBlank
private String college;
@ApiModelProperty(value = "专业")
private String major;
}

View File

@ -4,6 +4,7 @@ import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.entity.Cet_4; import org.jeecg.modules.entity.Cet_4;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -13,5 +14,6 @@ import java.util.List;
* @Version: V1.0 * @Version: V1.0
*/ */
public interface Cet_4Mapper extends BaseMapper<Cet_4> { public interface Cet_4Mapper extends BaseMapper<Cet_4> {
Date lastestDate();
} }

View File

@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mapper.Cet_4Mapper"> <mapper namespace="org.jeecg.modules.mapper.Cet_4Mapper">
<select id="lastestDate" resultType="java.util.Date">
SELECT MAX(batch) AS latest_batch FROM cet_4;
</select>
</mapper> </mapper>

View File

@ -3,6 +3,8 @@ package org.jeecg.modules.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.jeecg.common.api.vo.Result; import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.dto.getRateByEntryDateDto;
import org.jeecg.modules.dto.getRateByMajorAndLastestBatchDto;
import org.jeecg.modules.entity.Cet_4; import org.jeecg.modules.entity.Cet_4;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
@ -25,4 +27,8 @@ public interface ICet_4Service extends IService<Cet_4> {
Result<JSONObject> getDataByStudent(JSONObject jsonObject); Result<JSONObject> getDataByStudent(JSONObject jsonObject);
boolean cleanData(); boolean cleanData();
Result<JSONObject> getRateByMajorAndLastestBatch(getRateByMajorAndLastestBatchDto getRateByMajorAndLastestBatchParam);
Result<JSONObject> getRateByEntryDate(getRateByEntryDateDto getRateByEntryDateDtoParams);
} }

View File

@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.jeecg.common.api.vo.Result; import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.dto.getRateByEntryDateDto;
import org.jeecg.modules.dto.getRateByMajorAndLastestBatchDto;
import org.jeecg.modules.entity.Cet4_major; import org.jeecg.modules.entity.Cet4_major;
import org.jeecg.modules.entity.CetClean; import org.jeecg.modules.entity.CetClean;
import org.jeecg.modules.entity.Cet_4; import org.jeecg.modules.entity.Cet_4;
@ -22,6 +24,7 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -553,6 +556,123 @@ public class Cet_4ServiceImpl extends ServiceImpl<Cet_4Mapper, Cet_4> implements
return remove(cet4Wrapper); return remove(cet4Wrapper);
} }
@Override
public Result<JSONObject> getRateByMajorAndLastestBatch(getRateByMajorAndLastestBatchDto getRateByMajorAndLastestBatchParam) {
LambdaQueryWrapper<Cet_4> cet4Wrapper = new LambdaQueryWrapper<>();
Date lastestBatch = cet4Mapper.lastestDate();
cet4Wrapper.eq(Cet_4::getCollege, getRateByMajorAndLastestBatchParam.getCollege());
cet4Wrapper.eq(Cet_4::getBatch, lastestBatch);
//根据前端数据是否传major 判断是否添加 sql 条件
if (getRateByMajorAndLastestBatchParam.getMajor() != null && !getRateByMajorAndLastestBatchParam.getMajor().isEmpty()) {
cet4Wrapper.eq(Cet_4::getMajorname, getRateByMajorAndLastestBatchParam.getMajor());
}
long allStudentCount = cet4Mapper.selectCount(cet4Wrapper);
//创建所以年级的list
List<Map<String, Object>> maps = cet4Mapper.selectMaps(cet4Wrapper);
cet4Wrapper.select(Cet_4::getEntrydate).groupBy(Cet_4::getEntrydate);
List<Map<String, Object>> entryDateList = cet4Mapper.selectMaps(cet4Wrapper);
JSONArray ansArray = new JSONArray();
for (Map<String, Object> Date : entryDateList) {
// 统计当前 entryDate 下的通过人数
//所有参加过四级考试的学生
Map<String, Integer> attendMap4 = new HashMap<>();
String currentEntryDate = (String) Date.get("entrydate");
for (Map<String, Object> map : maps) {
String studentEntryDate = (String) map.get("entrydate");
String str = (String) map.get("id");
// 仅处理当前 entryDate 下的学生数据
if (currentEntryDate.equals(studentEntryDate)) {
if ((int) map.get("result") >= 425) {
attendMap4.put(str, 1);
} else {
if (!attendMap4.containsKey(str)) {//排除已经通过的人
attendMap4.put(str, 0);
}
}
}
}
//累计通过的人数
int passNumber = (int) attendMap4.values().stream().filter(value -> value == 1).count();
//每个年级的累计通过率保留三位小数
double passRate = passNumber / (double) allStudentCount;
// passRate = passRate * 100;
//保留三位小数
DecimalFormat df = new DecimalFormat("#.###");
JSONObject json = new JSONObject();
json.put("entryDate", currentEntryDate);
json.put("passRate", df.format(passRate));
ansArray.add(json);
}
JSONObject result = new JSONObject();
result.put("data", ansArray);
return Result.ok(result);
}
@Override
public Result<JSONObject> getRateByEntryDate(getRateByEntryDateDto getRateByEntryDateDtoParams) {
LambdaQueryWrapper<Cet_4> cet4Wrapper = new LambdaQueryWrapper<>();
cet4Wrapper.eq(Cet_4::getCollege, getRateByEntryDateDtoParams.getCollege());
//根据前端数据是否传major 判断是否添加 sql 条件
if (getRateByEntryDateDtoParams.getMajor() != null && !getRateByEntryDateDtoParams.getMajor().isEmpty()) {
cet4Wrapper.eq(Cet_4::getMajorname, getRateByEntryDateDtoParams.getMajor());
}
//创建所以年级的list
List<Map<String, Object>> maps = cet4Mapper.selectMaps(cet4Wrapper);
cet4Wrapper.select(Cet_4::getEntrydate).groupBy(Cet_4::getEntrydate);
List<Map<String, Object>> entryDateList = cet4Mapper.selectMaps(cet4Wrapper);
JSONArray ansArray = new JSONArray();
for (Map<String, Object> Date : entryDateList) {
//当前年纪的总人数
LambdaQueryWrapper<Cet_4> cet4StudentCount = new LambdaQueryWrapper<>();
cet4StudentCount.eq(Cet_4::getCollege, getRateByEntryDateDtoParams.getCollege())
.eq(Cet_4::getEntrydate, Date.get("entrydate"));
if (getRateByEntryDateDtoParams.getMajor() != null && !getRateByEntryDateDtoParams.getMajor().isEmpty()) {
cet4StudentCount.eq(Cet_4::getMajorname, getRateByEntryDateDtoParams.getMajor());
}
long allStudentCount = cet4Mapper.selectCount(cet4StudentCount);
// 统计当前 entryDate 下的通过人数
//所有参加过四级考试的学生
Map<String, Integer> attendMap4 = new HashMap<>();
String currentEntryDate = (String) Date.get("entrydate");
for (Map<String, Object> map : maps) {
String studentEntryDate = (String) map.get("entrydate");
String str = (String) map.get("id");
// 仅处理当前 entryDate 下的学生数据
if (currentEntryDate.equals(studentEntryDate)) {
if ((int) map.get("result") >= 425) {
attendMap4.put(str, 1);
} else {
if (!attendMap4.containsKey(str)) {//排除已经通过的人
attendMap4.put(str, 0);
}
}
}
}
//累计通过的人数
int passNumber = (int) attendMap4.values().stream().filter(value -> value == 1).count();
//每个年级的累计通过率保留三位小数
double passRate = passNumber / (double) allStudentCount;
//百分比
passRate = passRate * 100;
//保留两位小数
DecimalFormat df = new DecimalFormat("#.##");
JSONObject json = new JSONObject();
json.put("entryDate", currentEntryDate);
json.put("passRate", df.format(passRate));
ansArray.add(json);
}
JSONObject result = new JSONObject();
result.put("data", ansArray);
return Result.ok(result);
}
/** /**
* 依据学生id和姓名获取四级数据 * 依据学生id和姓名获取四级数据
*/ */