奖学金评估接口

This commit is contained in:
2026-03-29 17:01:10 +08:00
parent d24c3cf269
commit 9b02f55436
3 changed files with 221 additions and 0 deletions

View File

@@ -154,4 +154,12 @@ public interface ICphGoodApplyService extends IService<CphGoodApply> {
* @return
*/
AjaxResult reApplyYxgb(CphApplyYxgb cphApplyYxgb);
/**
* 学业奖学金资格检查
* @param stuNo 学号
* @param typeCode 奖项类型代码(可选,不传则检查所有等级)
* @return 资格检查结果
*/
AjaxResult checkXyjxjEligibility(String stuNo, String typeCode);
}

View File

@@ -1200,4 +1200,207 @@ public class CphGoodApplyServiceImpl extends ServiceImpl<CphGoodApplyMapper, Cph
if (insertAudit <= 0) throw new RuntimeException("添加审核记录失败");
return AjaxResult.success();
}
@Override
public AjaxResult checkXyjxjEligibility(String stuNo, String typeCode) {
try {
SrsStudent student = srsStudentMapper.selectSrsStudentByStuNo(stuNo);
if (student == null) {
return AjaxResult.error("学生不存在");
}
List<CphGoodTypeCode> canTypes = cphGoodApplyMapper.listXyjxjCanType();
if (canTypes == null || canTypes.isEmpty()) {
return AjaxResult.error("当前无可申请的奖项");
}
CphCoursePassCount passCount = cphGoodApplyMapper.getOwnPassCountByCode(stuNo, canTypes.get(0).getTypeCode());
if (passCount == null) {
return AjaxResult.error("无法获取课程成绩信息");
}
if (passCount.unpassCount > 0) {
Map<String, Object> result = buildBaseResult(stuNo, student.getName(), false);
result.put("reason", "您有课程成绩未通过,不能参加评优评先");
result.put("details", buildCoursePassDetails(false, passCount.unpassCount));
return AjaxResult.success(result);
}
CphSearch searchParam = new CphSearch();
searchParam.setStuNo(stuNo);
searchParam.setCode(canTypes.get(0).getTypeCode());
CphClassRankScore rankData = cphGoodApplyMapper.getOwnRankByCode(searchParam);
if (rankData == null) {
return AjaxResult.error("无法获取排名信息");
}
BigDecimal cphPer = new BigDecimal(rankData.cphClassRank)
.divide(new BigDecimal(rankData.classCount), 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
BigDecimal stuPer = new BigDecimal(rankData.stuClassRank)
.divide(new BigDecimal(rankData.classCount), 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
boolean cphPassed = cphPer.compareTo(new BigDecimal(50)) <= 0;
if (!cphPassed) {
Map<String, Object> result = buildBaseResult(stuNo, student.getName(), false);
result.put("reason", "您的综合素质排名不达标,无法申请学业奖学金");
result.put("details", buildRankDetails(rankData, cphPer, stuPer, false, false));
return AjaxResult.success(result);
}
if (typeCode != null && !typeCode.isEmpty()) {
return checkSpecificLevel(stuNo, student.getName(), typeCode, rankData, cphPer, stuPer);
} else {
return checkAllLevels(stuNo, student.getName(), rankData, cphPer, stuPer, canTypes);
}
} catch (Exception ex) {
return AjaxResult.error("资格检查失败:" + ex.getMessage());
}
}
private AjaxResult checkSpecificLevel(String stuNo, String stuName, String typeCode,
CphClassRankScore rankData, BigDecimal cphPer, BigDecimal stuPer) {
BigDecimal maxStuPer;
String typeName;
if (typeCode.contains("YDXYJXJ")) {
maxStuPer = new BigDecimal(3);
typeName = "一等奖学金";
} else if (typeCode.contains("EDXYJXJ")) {
maxStuPer = new BigDecimal(6);
typeName = "二等奖学金";
} else if (typeCode.contains("SDXYJXJ")) {
maxStuPer = new BigDecimal(9);
typeName = "三等奖学金";
} else {
return AjaxResult.error("无效的奖项类型");
}
boolean stuPassed = stuPer.compareTo(maxStuPer) <= 0;
boolean eligible = stuPassed;
Map<String, Object> result = buildBaseResult(stuNo, stuName, eligible);
result.put("typeCode", typeCode);
result.put("typeName", typeName);
result.put("reason", eligible ?
"您符合" + typeName + "申请条件" :
"您不符合" + typeName + "申请条件");
result.put("details", buildRankDetails(rankData, cphPer, stuPer, true, stuPassed, maxStuPer));
return AjaxResult.success(result);
}
private AjaxResult checkAllLevels(String stuNo, String stuName, CphClassRankScore rankData,
BigDecimal cphPer, BigDecimal stuPer, List<CphGoodTypeCode> canTypes) {
List<Map<String, Object>> results = new java.util.ArrayList<>();
String highestEligible = null;
String highestTypeName = null;
String[] typeCodes = {"YDXYJXJ", "EDXYJXJ", "SDXYJXJ"};
String[] typeNames = {"一等奖学金", "二等奖学金", "三等奖学金"};
BigDecimal[] maxStuPers = {new BigDecimal(3), new BigDecimal(6), new BigDecimal(9)};
for (int i = 0; i < typeCodes.length; i++) {
boolean stuPassed = stuPer.compareTo(maxStuPers[i]) <= 0;
boolean eligible = stuPassed;
Map<String, Object> levelResult = new HashMap<>();
levelResult.put("typeCode", typeCodes[i]);
levelResult.put("typeName", typeNames[i]);
levelResult.put("eligible", eligible);
levelResult.put("reason", eligible ?
"您符合" + typeNames[i] + "申请条件" :
"您不符合" + typeNames[i] + "申请条件");
results.add(levelResult);
if (eligible && highestEligible == null) {
highestEligible = typeCodes[i];
highestTypeName = typeNames[i];
}
}
boolean overallEligible = highestEligible != null;
Map<String, Object> result = buildBaseResult(stuNo, stuName, overallEligible);
result.put("highestEligible", highestEligible);
result.put("highestTypeName", highestTypeName);
result.put("reason", overallEligible ?
"您符合" + highestTypeName + "申请条件" :
"您不符合学业奖学金申请条件");
result.put("results", results);
result.put("details", buildRankDetails(rankData, cphPer, stuPer, true, true));
return AjaxResult.success(result);
}
private Map<String, Object> buildBaseResult(String stuNo, String stuName, boolean eligible) {
Map<String, Object> result = new HashMap<>();
result.put("stuNo", stuNo);
result.put("stuName", stuName);
result.put("eligible", eligible);
return result;
}
private Map<String, Object> buildCoursePassDetails(boolean passed, int unpassCount) {
Map<String, Object> details = new HashMap<>();
Map<String, Object> courseCheck = new HashMap<>();
courseCheck.put("passed", passed);
courseCheck.put("message", passed ? "所有课程均已通过" :
"" + unpassCount + "门课程成绩未通过");
details.put("coursePass", courseCheck);
return details;
}
private Map<String, Object> buildRankDetails(CphClassRankScore rankData, BigDecimal cphPer,
BigDecimal stuPer, boolean cphPassed, boolean stuPassed) {
return buildRankDetails(rankData, cphPer, stuPer, cphPassed, stuPassed, null);
}
private Map<String, Object> buildRankDetails(CphClassRankScore rankData, BigDecimal cphPer,
BigDecimal stuPer, boolean cphPassed,
boolean stuPassed, BigDecimal maxStuPer) {
Map<String, Object> details = new HashMap<>();
Map<String, Object> courseCheck = new HashMap<>();
courseCheck.put("passed", true);
courseCheck.put("message", "所有课程均已通过");
details.put("coursePass", courseCheck);
Map<String, Object> cphCheck = new HashMap<>();
cphCheck.put("passed", cphPassed);
cphCheck.put("currentRank", rankData.cphClassRank);
cphCheck.put("classCount", rankData.classCount);
cphCheck.put("percentage", cphPer);
if (maxStuPer != null) {
cphCheck.put("requiredPercentage", 50.0);
cphCheck.put("message", cphPassed ?
"综合素质排名达标(前" + cphPer + "%要求前50%" :
"综合素质排名不达标(前" + cphPer + "%要求前50%");
} else {
cphCheck.put("message", "综合素质排名前" + cphPer + "%");
}
details.put("comprehensiveRank", cphCheck);
Map<String, Object> stuCheck = new HashMap<>();
stuCheck.put("passed", stuPassed);
stuCheck.put("currentRank", rankData.stuClassRank);
stuCheck.put("classCount", rankData.classCount);
stuCheck.put("percentage", stuPer);
if (maxStuPer != null) {
stuCheck.put("requiredPercentage", maxStuPer);
stuCheck.put("message", stuPassed ?
"平均学分绩排名达标(前" + stuPer + "%,要求前" + maxStuPer + "%" :
"平均学分绩排名不达标(前" + stuPer + "%,要求前" + maxStuPer + "%");
} else {
stuCheck.put("message", "平均学分绩排名前" + stuPer + "%");
}
details.put("scoreRank", stuCheck);
return details;
}
}