(武漢工程科技學院信息工程學院,湖北武漢 430200)
教務管理系統(以下簡稱教務系統)是目前幾乎所有高校都在使用的一種管理信息系統,作為數字化校園中最重要的核心系統之一,教務系統與其它系統之間通常都存在不同程度上的聯系[1-7]。其中,教務系統中學籍信息的基礎數據來源通常都是招生管理系統(以下簡稱招生系統),一般由招生系統提供當年招生錄取數據,教務系統在此基礎上生成學籍信息[8-20]。在常見設計方案中,教務系統與招生系統對接模塊的數據結構通常被設置成固定的,學籍生成模塊通常只是根據新生專業分配學籍[21-26]。隨著時代發展,招生工作模式在不斷發生變化,各高校招生部門紛紛為新生提供各種便利化服務,使得有些原本在新生獲得學籍后才安排的工作被提前到招生錄取工作中,從而導致招生部門最終提交給教務處的新生基礎數據常包含一些約束性因素,這給教務學籍管理工作帶來了新的挑戰,傳統教務管理系統學籍生成模塊已難以適用于這類數據結構。因此,設計一種能夠適應新形勢下需求的學籍自適應生成模塊成為教務系統開發的重要內容。
本文通過分析招生數據中與專業字段組合后對學籍分配構成約束性影響的字段特性,提出以專業為單位構建學生與約束因素組合數據集,將約束因素值排序后以連續首尾取值方式為學生分配學籍,從而實現約束因素下的學籍自適應生成。
目前,高校教務管理系統中常見的學籍生成模塊通常是通過統計各專業新生人數并根據預設的班級人數上限,自動生成各專業班級信息和各班學生信息,從而生成學籍數據。該模式在基于傳統僅以專業為學籍分配要素的招生數據環境下能夠高效運作。
然而,在筆者主持的一個教務系統開發項目中,遇到了一個新問題。學校原本招生處向教務處提供的數據只包含學生基本信息和錄取專業,教務處根據該數據設置班級并為學生分配學號和所屬班級,以生成學籍信息,再由后勤部門根據學生分班情況分配宿舍,宿舍分配遵循“同班新生盡量集中”原則,以便于日后管理。此時,教務處在分配學籍時相對簡單,只需考慮同專業的各班級人數和男、女生比例盡量均衡即可。但由于招生處又為新生提供了一項新服務——新生來校之前即可在網上自行選擇并確認宿舍,由此帶來的改變是新生在還未獲得學籍的情況下就已確定了宿舍??紤]到“同班新生宿舍盡量集中”原則,此時教務處在分配學籍時必須考慮兩個要素:①同專業的各班級人數和男、女生比例盡量均衡;②同宿舍同專業的新生盡量安排在一個班,以便于管理。該校原有教務系統僅根據新生專業分配學籍的模式已無法生成符合要求的學籍信息,教務處不得不依靠人工方式分配學籍后再導入系統,效率極大降低。為此,學校教務處希望新教務系統的學籍生成模塊能夠基于新的招生數據結構自適應生成學籍和班級信息。
通過分析不難發現,學籍分配是以專業為中心點展開,因此應考察招生數據中其它相應字段與專業字段組合后是否對學籍分配產生影響,如果產生了影響,則說明該字段是影響學籍分配的一個約束因素,這樣的約束因素可能有若干個。在項目需求中,要求同專業同宿舍的新生盡量分配到一個班,故該約束因素就是新生宿舍。本文以宿舍要素為例,闡述主要設計思路。
提取招生數據中部分字段加以說明,其結構如表1 所示。

Table 1 Some fields in enrollment data表1 招生數據中部分字段
在設計時,可按以下步驟進行:
(1)預設班級年份(入學年份,例如20 級)以及各專業班級人數上限(不同專業的班級人數上限可能不同)。
(2)統計表1 中所有專業及各專業男、女生人數和總人數等數據,生成按專業進行統計的數據集,其中邏輯數據表結構如表2 所示。

Table 2 Structure of professional statistical data table表2 專業統計數據表結構
表2 中的“學生組合x”和“宿舍組合x”均為字符串形式,分別表示該專業具體的學生數據和與學生數據對應的宿舍數據,結構分別為“學生1;學生2;學生3;……;學生n”和“宿舍1;宿舍2;宿舍3;……;宿舍n”,宿舍與學生數據之間是一一對應關系(學生1 對應宿舍1,學生2 對應宿舍2,其它依此類推)。以C#語言(下同)描述此算法:首先創建數據集DataSet 對象ds_zy,并增加數據表和表中字段列,用于存儲按專業進行統計后的數據,代碼如下:


讀取表1,逐行掃描每行記錄,取出“專業”字段的值zy,判斷在ds_zy.Tables[0]中是否存在“專業”字段的值為zy 的記錄,如果不存在,則新增一條記錄將當前學生的相關信息錄入ds_zy.Tables[0],各字段的值分別為:zy、0 或1(取決于性別)、0 或1(取決于性別)、當前學生(姓名—性別—身份證號)、對應宿舍(樓棟—宿舍)、當前專業層次、當前專業所屬學院;若存在,則修改ds_zy.Tables[0]中該專業記錄,此處算法如下:
Step1:判斷當前學生性別,若為男,則將該記錄“男生人數”和“總人數”字段的數字分別加1,否則將“女生人數”和“總人數”字段的數字分別加1。代碼如下:

Step2:在“學生”字段中的字符串末尾追加當前學生信息,追加的字符串格式為“;姓名—性別—身份證號”。代碼如下:

Step3:在“宿舍”字段中的字符串末尾追加當前學生所在宿舍,追加的字符串格式為“;樓棟—宿舍”。代碼如下:


(3)根據表2 和系統中已存在的專業信息(編號、名稱)以及(1)設置,生成按班級統計的數據集,其中數據表結構如表3 所示。

Table 3 Structure of class statistical data table表3 班級統計數據表結構
表3 學生字段的值“學生組合x”表示該班級的學生數據,其字符串結構為“學生1、學生2、學生3、……、學生n”。為達到此設計目標,可按如下算法進行:
Step1:創建數據集DataSet 對象ds_bj,并增加數據表和表中字段列,用于存儲按班級進行統計后的數據,代碼如下:

Step2:遍歷ds_zy.Tables[0]中的所有記錄,根據(1)中設置的當前專業班級人數上限確定該專業班級數量以及每個班的男、女生人數和總人數。根據系統中已存在的專業信息(編號、名稱)和已設置好的年份生成班級編號、名稱和所屬專業(專業編號)。
Step3:以表2 中的學生和宿舍字段為基礎,將男、女生分組并進行如下操作:查找當前專業每個宿舍中的學生,并按學生人數由多到少對宿舍進行排序。例如:宿舍1(5人),宿舍2(3 人),宿舍3(4 人),宿舍4(3 人),宿舍5(5人),宿舍6(2 人),宿舍7(2 人),宿舍8(1 人)。因此,按順序可生成宿舍序列:
宿舍1;宿舍5;宿舍3;宿舍4;宿舍2;宿舍6;宿舍7;宿舍8
在該序列中,將各宿舍內的本專業學生之間以“、”作為間隔符,可生成如下結構的字符串(以下稱為“學生&宿舍字符串”):
學生1、學生2、學生3、學 生4、學生5;學生6、學 生7、……;學生n
Step4:在該字符串中,以宿舍為單位按其順序采取首尾結合的方式生成各班學生。當人數達到當前班級上限時,若當前宿舍的學生未分配完,則將剩下的學生分配到下一個班。例如當前專業總人數為25 人,若班級人數上限為10 人,則分成3 個班,人數分別為9 人、8 人、8 人。因此,一班學生包括:宿舍1、宿舍8 中的9 人和宿舍5 中的3 人,二班學生包括:宿舍5 中剩下的2 人和宿舍7、宿舍3 中的6人,三班學生包括:宿舍4、宿舍6、宿舍2 中的8 人。按此方法分別生成各班男生組和女生組的數據,再將各班男、女生組合生成各班所包含的學生。以男生組為例,在確定“學生&宿舍字符串”和當前班級男生人數的前提下,生成本班男生數據的算法代碼如下:



生成該班男生數據后,按照“學生&宿舍字符串”的結構將剩余未分配班級的男生數據重新組合,以便生成該專業下一個班的男生數據。重復該操作,直到該專業所有班級都分配完畢。
Step5:完成ds_bj.Tables[0]中所有數據生成后,將其中數據綁定到視圖層供用戶查看和微調,并將最終確定的班級和該班學生數據存儲于數據庫中。
通過上述算法,成功實現了教務系統在入住宿舍約束因素下的新生學籍自適應生成。
通過在項目中實施該方案,較好地解決了含約束因素的學籍自適應生成問題,之前依靠人工需要約一周時間完成學籍分配工作,現在只需幾分鐘即可實現,極大地提高了工作效率。隨著高校信息化建設推進及招生工作流程變更,各高校教務系統都可能面臨同類問題,本文研究成果具有較好的應用推廣意義。同時,研究成果還可應用于其它具有類似需求的模塊或系統,具有較好的通用性,在實施這類項目時可作為參考,并以此為基礎,根據自身實際情況作進一步擴展。