diff --git a/srs-admin/src/main/java/com/srs/web/controller/comprehensive/CphGoodApplyController.java b/srs-admin/src/main/java/com/srs/web/controller/comprehensive/CphGoodApplyController.java index b63e0e5..0c0a006 100644 --- a/srs-admin/src/main/java/com/srs/web/controller/comprehensive/CphGoodApplyController.java +++ b/srs-admin/src/main/java/com/srs/web/controller/comprehensive/CphGoodApplyController.java @@ -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); + } + } diff --git a/srs-comprehensive/src/main/java/com/srs/comprehensive/service/ICphGoodApplyService.java b/srs-comprehensive/src/main/java/com/srs/comprehensive/service/ICphGoodApplyService.java index c3f3b68..eec713d 100644 --- a/srs-comprehensive/src/main/java/com/srs/comprehensive/service/ICphGoodApplyService.java +++ b/srs-comprehensive/src/main/java/com/srs/comprehensive/service/ICphGoodApplyService.java @@ -154,4 +154,12 @@ public interface ICphGoodApplyService extends IService { * @return */ AjaxResult reApplyYxgb(CphApplyYxgb cphApplyYxgb); + + /** + * 学业奖学金资格检查 + * @param stuNo 学号 + * @param typeCode 奖项类型代码(可选,不传则检查所有等级) + * @return 资格检查结果 + */ + AjaxResult checkXyjxjEligibility(String stuNo, String typeCode); } diff --git a/srs-comprehensive/src/main/java/com/srs/comprehensive/service/impl/CphGoodApplyServiceImpl.java b/srs-comprehensive/src/main/java/com/srs/comprehensive/service/impl/CphGoodApplyServiceImpl.java index 6c72350..c66c6be 100644 --- a/srs-comprehensive/src/main/java/com/srs/comprehensive/service/impl/CphGoodApplyServiceImpl.java +++ b/srs-comprehensive/src/main/java/com/srs/comprehensive/service/impl/CphGoodApplyServiceImpl.java @@ -1200,4 +1200,207 @@ public class CphGoodApplyServiceImpl extends ServiceImpl 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 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 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 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 canTypes) { + List> 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 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 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 buildBaseResult(String stuNo, String stuName, boolean eligible) { + Map result = new HashMap<>(); + result.put("stuNo", stuNo); + result.put("stuName", stuName); + result.put("eligible", eligible); + return result; + } + + private Map buildCoursePassDetails(boolean passed, int unpassCount) { + Map details = new HashMap<>(); + Map courseCheck = new HashMap<>(); + courseCheck.put("passed", passed); + courseCheck.put("message", passed ? "所有课程均已通过" : + "有" + unpassCount + "门课程成绩未通过"); + details.put("coursePass", courseCheck); + return details; + } + + private Map buildRankDetails(CphClassRankScore rankData, BigDecimal cphPer, + BigDecimal stuPer, boolean cphPassed, boolean stuPassed) { + return buildRankDetails(rankData, cphPer, stuPer, cphPassed, stuPassed, null); + } + + private Map buildRankDetails(CphClassRankScore rankData, BigDecimal cphPer, + BigDecimal stuPer, boolean cphPassed, + boolean stuPassed, BigDecimal maxStuPer) { + Map details = new HashMap<>(); + + Map courseCheck = new HashMap<>(); + courseCheck.put("passed", true); + courseCheck.put("message", "所有课程均已通过"); + details.put("coursePass", courseCheck); + + Map 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 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; + } }