志愿分配应用到后端数据库

部分代码

从数据库中获取信息转化为符合标准的数组
//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);

试运行

待分配志愿

在这里插入图片描述

运行截图

在这里插入图片描述

控制台输出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分配结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值