天天看點

智能配置設定算法

接口比較複雜,還不知道該如何分離,先做記錄,都有詳細的注釋
//智能配置設定 —— 核心功能
        public function intelligentAlloc() {
	$user = $this->auto_login();
	$grade = Db::table('tc_grade')->order('grade desc')->select();
	// $user['department'] = "資訊安全與網絡工程系";
	// $user['workNumber'] = "00001";
	$wishList = ['wishFirst','wishSecond','wishThird','wishForth','wishFifth'];
	$voluntaryNum = Db::table('tc_voluntaryinfosetting')->where('workNumber',$user['workNumber'])->find();

	//擷取未配置設定到導師的學生資訊
	$student = Db::table('user_student_'.$grade[0]['grade'])->where('chosen',0)->where('department',$user['department'])->field('sid,serialNum,gpa,chosen')->select();
	$countStudent = count($student);
	$inputStudent = [];

	for ($i=0; $i <$countStudent ; $i++) {
		//擷取每個學生的志願資訊
		if (Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid', $student[$i]['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find()) { 
			$student[$i]['voluntary'] = Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid', $student[$i]['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find();

		//将每個學生的志願資訊轉換成規定格式的txt檔案
			$inputStudent[$i] = $student[$i]['serialNum'] . ' ' . $student[$i]['gpa'] . PHP_EOL;
	        for ($j=0; $j <$voluntaryNum['voluntaryNum'] ; $j++) {
	            $inputStudent[$i] = $inputStudent[$i] . $student[$i]['voluntary'][$wishList[$j]] . PHP_EOL;
	        }
	        if (($i+1) != $countStudent) {
		        $inputStudent[$i] = $inputStudent[$i] . PHP_EOL;
		    }
	    }
	}

	$countInputStudent = count($inputStudent);
	if ($countInputStudent != 0) {
		//将擷取的學生資訊轉換為.txt檔案
        file_put_contents('student.txt', $inputStudent);

        //擷取導師資訊
        if ($user['department'] == "計算機實驗班") {
        	$teacher = Db::table('user_teacher')->where('isExperial',1)->whereOr('isExperial',3)->select();
        	$countTeacher = count($teacher);

        	for ($i=0; $i <$countTeacher ; $i++) { 
        		//擷取每個老師的目前可帶的計算機實驗班的學生數
        		$teacherIssue[$i] = Db::table('tc_issue_'.$grade[0]['grade'])->where('workNumber', $teacher[$i]['workNumber'])->find();
        		$teacher[$i]['avaliableNumber'] = $teacherIssue[$i]['totalCompExper'] - $teacherIssue[$i]['compExperNow'];

        		//将每個導師的資訊轉換成規定格式的txt檔案
        		$inputTeacher[$i] = $teacher[$i]['workNumber'] . ' ' . $teacher[$i]['avaliableNumber'] . PHP_EOL;
        	}
        } elseif ($user['department'] == "數學實驗班") {
        	$teacher = Db::table('user_teacher')->where('isExperial',2)->whereOr('isExperial',3)->select();
        	$countTeacher = count($teacher);

        	for ($i=0; $i <$countTeacher ; $i++) { 
        		//擷取每個老師的目前可帶的數學實驗班的學生數
        		$teacherIssue[$i] = Db::table('tc_issue_'.$grade[0]['grade'])->where('workNumber', $teacher[$i]['workNumber'])->find();
        		$teacher[$i]['avaliableNumber'] = $teacherIssue[$i]['totalMathExper'] - $teacherIssue[$i]['mathExperNow'];

        		//将每個導師的資訊轉換成規定格式的txt檔案
        		$inputTeacher[$i] = $teacher[$i]['workNumber'] . ' ' . $teacher[$i]['avaliableNumber'] . PHP_EOL;
        	}
        } else {
        	$teacher = Db::table('user_teacher')->where('department',$user['department'])->select();
        	$countTeacher = count($teacher);

        	for ($i=0; $i <$countTeacher ; $i++) { 
        		//擷取每個老師的目前可帶的自然班的學生數
        		$teacherIssue[$i] = Db::table('tc_issue_'.$grade[0]['grade'])->where('workNumber', $teacher[$i]['workNumber'])->find();
        		$teacher[$i]['avaliableNumber'] = $teacherIssue[$i]['totalNatur'] - $teacherIssue[$i]['naturNow'];

        		//将每個導師的資訊轉換成規定格式的txt檔案
        		$inputTeacher[$i] = $teacher[$i]['workNumber'] . ' ' . $teacher[$i]['avaliableNumber'] . PHP_EOL;
        	}
        }
        //将擷取的老師資訊轉換為.txt檔案
        file_put_contents('teacher.txt', $inputTeacher);

        //調用算法進行配置設定
        $fileNameWithParam = 'distribute.exe ' . $countStudent . ' ' . $countTeacher . ' ' . $voluntaryNum['voluntaryNum'];
        system($fileNameWithParam);

        $studentElected = file_get_contents('student_elected.txt');      
        //擷取通過算法得到配置設定的學生的結果,轉換為string

        //分割studentElected字元串,轉換為數組,并存到臨時的結果表中
        if ($studentElected != "") {
	        $studentElected = str_replace("\r\n", '', $studentElected);
	        $studentElectedArr = explode(',', $studentElected);
	        for ($i = 0; $i < count($studentElectedArr); $i++) {
	            $studentElectedArr[$i] = explode(' ', $studentElectedArr[$i]);

	            $studentElectedResult[$i]['serialNum'] = $studentElectedArr[$i][0];
	            $studentElectedResult[$i]['stuInfo'] = Db::table('user_student_'.$grade[0]['grade'])->where('serialNum', $studentElectedResult[$i]['serialNum'])->field('sid,serialNum,name,gpa')->find();
	            $studentElectedResult[$i]['workNumber'] = $studentElectedArr[$i][1];
	            $studentElectedResult[$i]['teaInfo'] = Db::table('user_teacher')->where('workNumber', $studentElectedResult[$i]['workNumber'])->field('workNumber,name')->find();

	            if (Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid',$studentElectedResult[$i]['stuInfo']['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find()) {
		            $vol_num[$i] = array_keys(Db::table('tc_voluntary_'.$grade[0]['grade'])->where('sid',$studentElectedResult[$i]['stuInfo']['sid'])->field('wishFirst,wishSecond,wishThird,wishForth,wishFifth')->find(),$studentElectedResult[$i]['teaInfo']['workNumber']);
		            if ($vol_num[$i][0] == "wishFirst") {
		            	$volOrder = "第一志願";
		            } elseif ($vol_num[$i][0] == "wishSecond") {
		            	$volOrder = "第二志願";
		            } elseif ($vol_num[$i][0] == "wishThird") {
		            	$volOrder = "第三志願";
		            } elseif ($vol_num[$i][0] == "wishForth") {
		            	$volOrder = "第四志願";
		            } elseif ($vol_num[$i][0] == "wishFifth") {
		            	$volOrder = "第五志願";
		            }

		            $insert[$i]['sid'] = $studentElectedResult[$i]['stuInfo']['sid'];
		            $insert[$i]['serialNum'] = $studentElectedResult[$i]['stuInfo']['serialNum'];
		            $insert[$i]['student_name'] = $studentElectedResult[$i]['stuInfo']['name'];
		            $insert[$i]['vol_num'] = $volOrder;
		            $insert[$i]['gpa'] = $studentElectedResult[$i]['stuInfo']['gpa'];
		            $insert[$i]['teacher_name'] = $studentElectedResult[$i]['teaInfo']['name'];
		            $insert[$i]['workNumber'] = $studentElectedResult[$i]['teaInfo']['workNumber'];
		            $insert[$i]['checked'] = 0;

		            if (Db::table('tc_temp_result')->where('sid',$insert[$i]['sid'])->find()) {
		            	Db::table('tc_temp_result')->update($insert[$i]);
		            } else {
		            	Db::table('tc_temp_result')->insert($insert[$i]);
		            }
		        }
	        }
	    }
	    $data['status'] = "success";
	    return json($data);
	} else {
		$data['amount'] = 0;
		$data['msg'] = "所有學生均未填報志願,無法進行智能配置設定";
		$data['student'] = "";
		return json($data);
	}
    // return json($insert);
    $this->assign('user', $user);

}