奖学金评估接口
This commit is contained in:
@@ -36,6 +36,7 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import io.swagger.annotations.*;
|
||||
import com.srs.comprehensive.domain.CphGoodApply;
|
||||
@@ -729,4 +730,13 @@ public class CphGoodApplyController extends BaseController {
|
||||
return cphGoodApplyService.reApplyYxgb(cphApplyYxgb);
|
||||
}
|
||||
|
||||
@PermitAll
|
||||
@GetMapping("/checkXyjxjEligibility")
|
||||
@ApiOperation("学业奖学金资格检查")
|
||||
public AjaxResult checkXyjxjEligibility(
|
||||
@RequestParam String stuNo,
|
||||
@RequestParam(required = false) String typeCode) {
|
||||
return cphGoodApplyService.checkXyjxjEligibility(stuNo, typeCode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user