This commit is contained in:
zhouwentao 2025-05-04 22:39:55 +08:00
parent 469b41d533
commit 2d466cf943
7 changed files with 90 additions and 43 deletions

View File

@ -42,11 +42,11 @@ import java.util.*;
@Slf4j @Slf4j
@RequestMapping("/mini/major") @RequestMapping("/mini/major")
public class MiniMajorController { public class MiniMajorController {
@Autowired @Resource
private IYxMajorService yxMajorService; private IYxMajorService yxMajorService;
@Autowired @Resource
private IYxCalculationMajorService yxCalculationMajorService; private IYxCalculationMajorService yxCalculationMajorService;
@Autowired @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Resource @Resource
private MiniTestCulturalService testCulturalService; private MiniTestCulturalService testCulturalService;
@ -116,11 +116,11 @@ public class MiniMajorController {
String str = null; String str = null;
List<String> notList= Arrays.asList("文7专3","专过文排","文8专2","文6专4","文5专5"); List<String> notList= Arrays.asList("文7专3","专过文排","文8专2","文6专4","文5专5");
if (queryRecommendMajorVO.getProfessionalCategory().equals("音乐类")) { if (queryRecommendMajorVO.getProfessionalCategory().equals("音乐类")) {
str = "[\"文过专排主科\",\"文过专排\",\"专过文排\",\"文1专1\",\"文3专7\",\"文3专10\",\"文4专10\",\"文4专6\",\"文5专10\",\"文5专5\",\"文6专10\",\"文6专4\",\"文7专3\"]"; str = "[\"文过专排主科\",\"文过专排\",\"专过文排\",\"文1专1\",\"文3专7\",\"文3专10\",\"文4专10\",\"文4专6\",\"文5专10\",\"文5专5\",\"文6专10\",\"文6专4\",\"文7专3\",\"文8专2\"]";
} else if (queryRecommendMajorVO.getProfessionalCategory().equals("体育类")) { } else if (queryRecommendMajorVO.getProfessionalCategory().equals("体育类")) {
str = "[\"文过专排\",\"专过文排\",\"文3专7\",\"文5专5\",\"文7专3\"]"; str = "[\"专过文排\",\"文7专3\" ,\"文5专5\",\"文3专7\",\"文过专排\"]";
} else { } else {
str = "[\"文过专排\",\"专过文排\",\"文1专1\",\"文3专7\",\"文3专10\",\"文4专10\",\"文4专6\",\"文5专10\",\"文5专5\",\"文6专10\",\"文6专4\",\"文7专3\"]"; str = "[\"文过专排\",\"专过文排\",\"文1专1\",\"文3专7\",\"文3专10\",\"文4专10\",\"文4专6\",\"文5专10\",\"文5专5\",\"文6专10\",\"文6专4\",\"文7专3\",\"文8专2\"]";
}//277 }//277
JSONArray objects = JSONArray.parseArray(str); JSONArray objects = JSONArray.parseArray(str);
List<String> javaList = objects.toJavaList(String.class); List<String> javaList = objects.toJavaList(String.class);
@ -146,7 +146,7 @@ public class MiniMajorController {
String schoolCode = queryRecommendMajorVO.getSchoolCode(); String schoolCode = queryRecommendMajorVO.getSchoolCode();
String year = queryRecommendMajorVO.getYear(); String year = queryRecommendMajorVO.getYear();
AssertUtils.notNull(loginUser, "未获取到登录信息"); AssertUtils.notNull(loginUser, "未获取到登录信息");
AssertUtils.notNull(year, "请选择年份"); // AssertUtils.notNull(year, "请选择年份");
return Result.OK(testCulturalService.testCultural(schoolCode)); return Result.OK(testCulturalService.testCultural(schoolCode));
} }

View File

@ -15,24 +15,24 @@ public class YxConstant {
/** /**
* 当前年 * 当前年
*/ */
public static final String nowYear = "2024"; public static final String nowYear = "2025";
/** /**
* 使用省控线年份 * 使用省控线年份
*/ */
public static String historyControlLineYear = "2023"; public static String historyControlLineYear = "2025";
/** /**
* 旧日期 * 旧日期
*/ */
public static final List<String> oldYearList = Arrays.asList("2023", "2022", "2021", "2020"); public static final List<String> oldYearList = Arrays.asList("2024", "2023", "2022", "2021");
public static final List<String> showOldYearList = Arrays.asList("2024", "2023", "2022", "2021", "2020"); public static final List<String> showOldYearList = Arrays.asList("2024", "2023", "2022", "2021");
public static List<String> cankaoMajorTypeList = Arrays.asList("音乐类", "舞蹈类", "播音与主持类", "表演类", "戏曲类"); public static List<String> cankaoMajorTypeList = Arrays.asList("音乐类", "舞蹈类", "播音与主持类", "表演类", "戏曲类");
public static List<String> betaMajorTypeList = Arrays.asList("美术与设计类", "书法类", "体育类"); public static List<String> betaMajorTypeList = Arrays.asList("美术与设计类", "书法类", "体育类");
public static List<String> cankaoYearList = Arrays.asList("2023", "2022"); public static List<String> cankaoYearList = Arrays.asList("2024", "2023");
public static String w1z1 = "文1专1"; public static String w1z1 = "文1专1";
public static String w1jiaz1 = "文1+专1"; public static String w1jiaz1 = "文1+专1";

View File

@ -444,16 +444,13 @@ public class YxHistoryMajorEnrollController extends JeecgController<YxHistoryMaj
AssertUtils.notNull(major, String.format("行[%s],专业未在系统中找到", index)); AssertUtils.notNull(major, String.format("行[%s],专业未在系统中找到", index));
yxHistoryMajorEnroll.setMajorCode(major.getMajorCode()); yxHistoryMajorEnroll.setMajorCode(major.getMajorCode());
if (index==11) {
System.out.println("1");
}
if ("提前批".equals(batch)) { if ("提前批".equals(batch)) {
batch = "本科提前批"; batch = "本科提前批";
} }
//省控线 //省控线
//文科_本科A段_美术与设计_2023 //文科_本科A段_美术与设计_2023
if ("舞蹈类".equals(majorType)) { if ("舞蹈类".equals(majorType) && Integer.parseInt(year) <= 2023) {
AssertUtils.notEmpty(mainSubjects, String.format("行[%s],未识别到舞蹈类型", index)); AssertUtils.notEmpty(mainSubjects, String.format("行[%s],未识别到舞蹈类型", index));
if (mainSubjects.contains("艺术舞蹈")) { if (mainSubjects.contains("艺术舞蹈")) {
key = category + "_" + batch + "_" + "艺术舞蹈类" + "_" + year; key = category + "_" + batch + "_" + "艺术舞蹈类" + "_" + year;

View File

@ -69,9 +69,11 @@ public class YxScoreController {
String professionalCategoryChildren = userScoreUpdateDTO.getProfessionalCategoryChildren(); String professionalCategoryChildren = userScoreUpdateDTO.getProfessionalCategoryChildren();
AssertUtils.notNull(professionalCategory, "请选择[专业类别]"); AssertUtils.notNull(professionalCategory, "请选择[专业类别]");
AssertUtils.notNull(cognitioPolyclinic, "请选择[选考科目]"); AssertUtils.notNull(cognitioPolyclinic, "请选择[选考科目]");
AssertUtils.hasSize(userScoreUpdateDTO.getSubjectList(),"请选择[选考科目]");
AssertUtils.notTrue(userScoreUpdateDTO.getSubjectList().size() != 2,"选考科目必须选两项");
if("表演类".equals(professionalCategory) || "音乐类".equals(professionalCategory)){
AssertUtils.hasSize(userScoreUpdateDTO.getSubjectList(),"请选择[专业选课]");
AssertUtils.notTrue(userScoreUpdateDTO.getSubjectList().size() != 2,"选考科目必须选两项");
}
AssertUtils.notTrue(culturalScore.compareTo(YxConstant.bigDecimal750) > 0, "[文化成绩]最高分为750"); AssertUtils.notTrue(culturalScore.compareTo(YxConstant.bigDecimal750) > 0, "[文化成绩]最高分为750");
AssertUtils.notTrue(culturalScore.compareTo(YxConstant.bigDecimal0) < 0, "[文化成绩]最低分为0"); AssertUtils.notTrue(culturalScore.compareTo(YxConstant.bigDecimal0) < 0, "[文化成绩]最低分为0");

View File

@ -1,12 +1,10 @@
package org.jeecg.modules.yx.service.impl; package org.jeecg.modules.yx.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.web.dto.ArtRecommendMajorBaseDTO; import org.jeecg.modules.web.dto.ArtRecommendMajorBaseDTO;
import org.jeecg.modules.web.dto.RecommendMajorDTO; import org.jeecg.modules.web.dto.RecommendMajorDTO;
import org.jeecg.modules.web.vo.QueryRecommendMajorVO; import org.jeecg.modules.web.vo.QueryRecommendMajorVO;
@ -54,8 +52,6 @@ public class YxCalculationMajorServiceImpl extends ServiceImpl<YxCalculationMajo
private YxSchoolMajorMapper yxSchoolMajorMapper; private YxSchoolMajorMapper yxSchoolMajorMapper;
@Resource @Resource
private YxSchoolMapper yxSchoolMapper; private YxSchoolMapper yxSchoolMapper;
@Resource
private RedisUtil redisUtil;
@Override @Override
public List<RecommendMajorDTO> calculationMajor(YxUserScore userScore) { public List<RecommendMajorDTO> calculationMajor(YxUserScore userScore) {
@ -556,6 +552,11 @@ public class YxCalculationMajorServiceImpl extends ServiceImpl<YxCalculationMajo
continue; continue;
} }
// 判断 schoolCode 6110
if ("6110".equals(recommendMajorDTO.getSchoolCode()) && "动画".equals(recommendMajorDTO.getMajorName())) {
System.out.println("qvq");
}
//不是体育类的专业如果是文过专排并且没有录取计算运算符时文过专排是文*0+*1,专过文排是文*1+*0 //不是体育类的专业如果是文过专排并且没有录取计算运算符时文过专排是文*0+*1,专过文排是文*1+*0
if ("文过专排".equals(rulesEnrollProbability) && StringUtils.isBlank(probabilityOperator)) { if ("文过专排".equals(rulesEnrollProbability) && StringUtils.isBlank(probabilityOperator)) {
probabilityOperator = "文*0+专*1"; probabilityOperator = "文*0+专*1";
@ -581,8 +582,8 @@ public class YxCalculationMajorServiceImpl extends ServiceImpl<YxCalculationMajo
} }
} }
//算分用 //算分用
// 当前学生的分数折合
studentScore = ScoreUtil.convertIntoScore(rulesEnrollProbability, activeCurrentUserScore.getCulturalScore(), activeCurrentUserScore.getProfessionalScore(), recommendMajorDTO.getFirstLevelDiscipline(), probabilityOperator); studentScore = ScoreUtil.convertIntoScore(rulesEnrollProbability, activeCurrentUserScore.getCulturalScore(), activeCurrentUserScore.getProfessionalScore(), recommendMajorDTO.getFirstLevelDiscipline(), probabilityOperator);
recommendMajorDTO.setPrivateStudentScore(studentScore); recommendMajorDTO.setPrivateStudentScore(studentScore);
if (StringUtils.isNotBlank(recommendMajorDTO.getRulesEnrollProbability())) { if (StringUtils.isNotBlank(recommendMajorDTO.getRulesEnrollProbability())) {

View File

@ -1,6 +1,7 @@
package org.jeecg.modules.yx.service.impl; package org.jeecg.modules.yx.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
@ -8,6 +9,7 @@ import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.AssertUtils; import org.jeecg.common.util.AssertUtils;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.yx.dto.ProfessionalCategoryChildrenDTO; import org.jeecg.modules.yx.dto.ProfessionalCategoryChildrenDTO;
import org.jeecg.modules.yx.dto.UserScoreUpdateDTO; import org.jeecg.modules.yx.dto.UserScoreUpdateDTO;
import org.jeecg.modules.yx.entity.YxCalculationMajor; import org.jeecg.modules.yx.entity.YxCalculationMajor;
@ -38,6 +40,9 @@ import java.util.stream.Collectors;
public class YxUserScoreServiceImpl extends ServiceImpl<YxUserScoreMapper, YxUserScore> implements IYxUserScoreService { public class YxUserScoreServiceImpl extends ServiceImpl<YxUserScoreMapper, YxUserScore> implements IYxUserScoreService {
@Autowired @Autowired
private IYxVipCardService yxVipCardService; private IYxVipCardService yxVipCardService;
@Resource
private RedisUtil redisUtil;
@Override @Override
public YxUserScore getActiveUserScore(String createBy) { public YxUserScore getActiveUserScore(String createBy) {
LambdaQueryWrapper<YxUserScore> queryWrapper=new LambdaQueryWrapper<>(); LambdaQueryWrapper<YxUserScore> queryWrapper=new LambdaQueryWrapper<>();
@ -52,8 +57,15 @@ public class YxUserScoreServiceImpl extends ServiceImpl<YxUserScoreMapper, YxUse
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
AssertUtils.notNull(sysUser,"请先登录!"); AssertUtils.notNull(sysUser,"请先登录!");
String userId = sysUser.getId(); String userId = sysUser.getId();
// 获取redis中的成绩缓存
String scoreKey = "USER:SCORE:"+ userId;
YxUserScore userScore = null;
if(redisUtil.hasKey(scoreKey)){
userScore = JSONObject.parseObject((String)redisUtil.get(scoreKey), YxUserScore.class);
return userScore;
}
//查询成绩 //查询成绩
YxUserScore userScore = getActiveUserScore(userId); userScore = getActiveUserScore(userId);
if (userScore==null) { if (userScore==null) {
return null; return null;
} }
@ -82,6 +94,9 @@ public class YxUserScoreServiceImpl extends ServiceImpl<YxUserScoreMapper, YxUse
} }
} }
userScore.setProfessionalCategoryChildrenList(professionalCategoryChildrenList); userScore.setProfessionalCategoryChildrenList(professionalCategoryChildrenList);
// 将成绩记录缓存
redisUtil.set(scoreKey, JSONObject.toJSONString(userScore), 3600);
} }
return userScore; return userScore;
} }

View File

@ -74,10 +74,59 @@ public class ScoreUtil {
return sum; return sum;
} }
/**
* 计算历年录取分差录取线 - 省控线并返回平均分差
* @param rulesEnrollProbability 当前录取方式"文过专排"
* @param historyMajorEnrollList 历年录取数据
* @return Map<String, Object> 包含平均分差scoreDifference
*/
public static Map<String, Object> computeHistoryMajorEnrollScoreLineDifferenceWithRulesEnrollProbability(
String rulesEnrollProbability,
List<YxHistoryMajorEnroll> historyMajorEnrollList) {
// 1. 提前返回空结果避免后续空指针
if (CollectionUtils.isEmpty(historyMajorEnrollList)) {
return Collections.singletonMap("scoreDifference", BigDecimal.ZERO);
}
// 2. 使用更高效的累加方式避免频繁BigDecimal运算
BigDecimal sum = BigDecimal.ZERO;
int validYearCount = 0;
for (YxHistoryMajorEnroll enrollData : historyMajorEnrollList) {
BigDecimal admissionLine = enrollData.getAdmissionLine();
BigDecimal controlLine = enrollData.getControlLine();
// 3. 跳过无效数据录取线0
if (admissionLine.signum() <= 0) {
continue;
}
// 4. 计算当前年份分差录取线 - 省控线
BigDecimal currentDiff = admissionLine.subtract(controlLine);
// 5. 特殊逻辑高职高专非体育类需计算分差率分差/省控线
boolean isVocationalCollege = "高职高专".equals(enrollData.getBatch());
boolean isSportsMajor = "体育类".equals(enrollData.getMajorType());
if (isVocationalCollege && !isSportsMajor) {
currentDiff = currentDiff.divide(controlLine, 6, RoundingMode.HALF_UP);
}
// 6. 非高职高专 or 体育类检查录取方式是否一致 validYearCount >= 1 &&
else if (!rulesEnrollProbability.equals(enrollData.getRulesEnrollProbability())) {
continue; // 录取方式不一致跳过
}
sum = sum.add(currentDiff);
validYearCount++;
}
// 7. 计算平均分差避免除零错误
BigDecimal averageDiff = validYearCount > 0
? sum.divide(new BigDecimal(validYearCount), 4, RoundingMode.HALF_UP)
: BigDecimal.ZERO;
return Collections.singletonMap("scoreDifference", averageDiff);
}
/** /**
* 根据 当前年一致的录取方式计算 往年分数差之和 (往年的录取线-省控线) * 根据 当前年一致的录取方式计算 往年分数差之和 (往年的录取线-省控线)
*/ */
public static Map<String,Object> computeHistoryMajorEnrollScoreLineDifferenceWithRulesEnrollProbability(String rulesEnrollProbability,List<YxHistoryMajorEnroll> historyMajorEnrollList){ public static Map<String,Object> computeHistoryMajorEnrollScoreLineDifferenceWithRulesEnrollProbability_old(String rulesEnrollProbability,List<YxHistoryMajorEnroll> historyMajorEnrollList){
BigDecimal sum=new BigDecimal("0");//历年分差之和 BigDecimal sum=new BigDecimal("0");//历年分差之和
BigDecimal nowSum=new BigDecimal("0"); BigDecimal nowSum=new BigDecimal("0");
Map<String,Object> data=new LinkedHashMap<>(); Map<String,Object> data=new LinkedHashMap<>();
@ -88,10 +137,10 @@ public class ScoreUtil {
int yearNum=0; int yearNum=0;
BigDecimal controlLine = null;//文科-省控线 BigDecimal controlLine = null;//文科-省控线
BigDecimal admissionLine = null;//文科-录取线 BigDecimal admissionLine = null;//文科-录取线
YxHistoryMajorEnroll yxHistoryMajorEnroll1 = historyMajorEnrollList.get(0);
for (YxHistoryMajorEnroll yxHistoryMajorEnroll : historyMajorEnrollList) { for (YxHistoryMajorEnroll yxHistoryMajorEnroll : historyMajorEnrollList) {
controlLine = yxHistoryMajorEnroll.getControlLine(); controlLine = yxHistoryMajorEnroll.getControlLine();
admissionLine = yxHistoryMajorEnroll.getAdmissionLine(); admissionLine = yxHistoryMajorEnroll.getAdmissionLine();
// 如果录取分数线(admissionLine)小于等于0就直接跳过当前循环处理下一条数据
if (admissionLine.compareTo(YxConstant.bigDecimal0) <=0) { if (admissionLine.compareTo(YxConstant.bigDecimal0) <=0) {
continue; continue;
} }
@ -106,9 +155,6 @@ public class ScoreUtil {
// 分差/省控线 // 分差/省控线
nowSum = nowSum.divide(yxHistoryMajorEnroll.getControlLine(),6,RoundingMode.HALF_UP); nowSum = nowSum.divide(yxHistoryMajorEnroll.getControlLine(),6,RoundingMode.HALF_UP);
} }
/*if (!sum.equals(BigDecimal.ZERO)) {
// 判断 两年分差double v = sum.subtract(nowSum).doubleValue();if (v <=2 || v>=2) { //历年分差 2 至上时将用户当前年分差-2 data.put("flag",true);}
}*/
sum=sum.add(nowSum);//录取线-省控线 sum=sum.add(nowSum);//录取线-省控线
yearNum++; yearNum++;
} }
@ -117,20 +163,6 @@ public class ScoreUtil {
data.put("scoreDifference",divide); data.put("scoreDifference",divide);
} }
return data; return data;
/*if (wenFlag) {
//文科生
}else{
//理科生
BigDecimal scienceControlLine=null;//理科-省控线
BigDecimal scienceAdmissionLine=null;//理科-录取线
for (YxHistoryMajorEnroll yxHistoryMajorEnroll : historyMajorEnrollList) {
scienceControlLine = yxHistoryMajorEnroll.getScienceControlLine();
scienceAdmissionLine = yxHistoryMajorEnroll.getScienceAdmissionLine();
sum=sum.add(scienceAdmissionLine.subtract(scienceControlLine));//录取线-省控线
yearNum++;
}
}*/
//return sum;
} }