部分代码
从数据库中获取信息转化为符合标准的数组
//get到教务ID
Jiaowu jiaowu = jiaowuService.checkJiaowu(request,response);
if(jiaowu == null){
return ResponseResult.ACCOUNT_NOT_LOGIN();
}
if(jiaowu.getJiaowuId() == null){
return ResponseResult.ACCOUNT_NOT_LOGIN();
}
String jiaowuId = jiaowu.getJiaowuId();
log.info("教务 "+jiaowuId+" 正在分配实训 "+trainingId+" 的志愿");
//检查教务是否有权操作
Training trainingById = trainingDao.findByTrainingId(trainingId);
if(!trainingById.getJiaowuId().equals(jiaowuId)){
log.info("无权操作此实训");
return ResponseResult.FAILED("教务无权操作");
}
//查出所有的志愿
List<Map<String,Object>> result = expectationDao.listEByTraining(trainingId);
long[][] data1 = new long[result.size()][7];
log.info("总条目: "+result.size());
for(int i = 0; i < result.size(); i ++){
data1[i][0] =Long.parseLong(result.get(i).get("studentId").toString().trim());
data1[i][1] =Long.parseLong(result.get(i).get("e1").toString());
data1[i][2] =Long.parseLong(result.get(i).get("e2").toString());
data1[i][3] =Long.parseLong(result.get(i).get("e3").toString());
data1[i][4] =Long.parseLong(result.get(i).get("e4").toString());
data1[i][5] =Long.parseLong(result.get(i).get("e5").toString());
data1[i][6] =0;
}
//查出可以报名的项目和最大人数
List<Project> projects = projectDao.listProjectCanChoose(trainingId);
int[][] projectDataByDb= new int[projects.size()][2];
for(int j = 0;j < projects.size();j ++){
projectDataByDb[j][0] = projects.get(j).getProjectId();
Map<String,Object> temp = studentProjectGradeDao.SumNumOfProject(projectDataByDb[j][0]);
int existNum =Integer.parseInt(temp.get("SumNum").toString());
projectDataByDb[j][1] = projects.get(j).getProjectMaxNum() - existNum;
}
//项目数组转换成需要的格式
int[][] projectData = new int[projects.size()][3];
for(int j = 0;j<projects.size();j++){
projectData[j][0] = projectDataByDb[j][1];
projectData[j][1] = 0;
projectData[j][2] = projects.get(j).getProjectId();
log.info("项目 "+projects.get(j).getProjectId()+ "("+j+")"+ " \t最大人数 "+projectDataByDb[j][1]);
}
//志愿数组转换成需要的格式
int[][] stuData = new int[result.size()][6];
for(int k = 0;k < result.size();k ++){//遍历学生
for(int m = 0;m < 5;m ++){//遍历5个志愿
for(int n = 0;n < projects.size();n ++){//把志愿中的项目ID映射为从0开始
if( (int)data1[k][m+1] == projectData[n][2]){
stuData[k][m] = n;
}
}
}
log.info("学生 "+result.get(k).get("studentId").toString()+"\t"+data1[k][1]+"("+stuData[k][0]+")\t"+data1[k][2]+"("+stuData[k][1]+")\t"+data1[k][3]+"("+stuData[k][2]+")\t"+data1[k][4]+"("+stuData[k][3]+")\t"+data1[k][5]+"("+stuData[k][4]+")");
stuData[k][5] = -1;
}
对数组进行处理
log.info("执行分配算法");
int[][] stuDataResult = AllocationUtils.allocate1(stuData,projectData);
log.info("结果");
for(int i = 0;i < result.size();i ++){
log.info(stuDataResult[i][0]+"\t"+stuDataResult[i][1]+"\t"+stuDataResult[i][2]+"\t"+stuDataResult[i][3]+"\t"+stuDataResult[i][4]+"\t最终"+stuDataResult[i][5]);
}
//输出projectData
log.info("输出projectData");
for(int i= 0;i < projects.size();i ++){
log.info("第 "+i+" 行: "+projectData[i][0]+"\t"+projectData[i][1]+"\t"+projectData[i][2]);
}
//把结果转换为真正的项目ID
for(int i = 0;i < result.size();i ++){
log.info("学生 "+data1[i][0]+" 的最终志愿为 "+projectData[stuDataResult[i][5]][2]);
data1[i][6] = projectData[stuDataResult[i][5]][2];
stuDataResult[i][5] = (int) data1[i][6];
}
log.info("映射后结果");
for(int i = 0;i < result.size();i ++){
log.info(stuDataResult[i][0]+"\t"+stuDataResult[i][1]+"\t"+stuDataResult[i][2]+"\t"+stuDataResult[i][3]+"\t"+stuDataResult[i][4]+"\t最终"+stuDataResult[i][5]);
}
log.info("开始存入数据库");
List<Map<String,Object>> NoAllotResult = new ArrayList<>();
for(int i = 0;i < result.size();i++){
if(stuDataResult[i][5] != -1){
StudentProjectGrade spgTemp = new StudentProjectGrade();
spgTemp.setStudentId(result.get(i).get("studentId").toString());
spgTemp.setProjectId((int)data1[i][6]);
spgTemp.setGrades100Points(-1);
spgTemp.setGrades5Points(-1);
spgTemp.setIsleader(0);
spgTemp.setIsjointed(1);
spgTemp.setTrainingId(trainingId);
log.info("studentId "+spgTemp.getStudentId()+" projectId "+spgTemp.getProjectId());
studentProjectGradeDao.save(spgTemp);
}else {
log.info("学生 "+result.get(i).get("studentId").toString()+" 没有分配到志愿");
Map<String,Object> mapTemp = new HashMap<>();
mapTemp.put("studentId",result.get(i).get("studentId").toString());
NoAllotResult.add(mapTemp);
}
}
log.info("分配完成!");
查找可选项目
@Query(value = "select new Project(p.projectId,p.projectMaxNum)from Project as p where p.trainingId=:trainingId and p.projectApplicantType='教师'")
List<Project> listProjectCanChoose(int trainingId);
查出指定项目报名人数
@Query(value = "SELECT COUNT(student_id) SumNum FROM student_project_grade WHERE project_id = :projectId",nativeQuery = true)
Map<String,Object> SumNumOfProject(int projectId);
查出待分配志愿
@Query(value = "SELECT student.student_id studentId,expectation_1 e1,expectation_2 e2,expectation_3 e3,expectation_4 e4,expectation_5 e5 " +
"FROM student,expectation " +
"WHERE student.student_id = expectation.student_id AND student.training_id = :trainingId AND " +
"student.student_id NOT IN (SELECT student_id FROM student_project_grade)",nativeQuery = true)
List<Map<String,Object>> listEByTraining(int trainingId);
试运行
待分配志愿
运行截图
控制台输出