作者:鄭彥宏 / 臺灣大學計算機及資訊網路中心程式設計組/事
前言
今年(109)農曆春節過後,隨著嚴重特殊傳染性肺炎(Coronavirus disease 2019,COVID-19)疫情日漸嚴峻,本校除提前於1月底成立「校級防疫小組」[1]外,並於2月初建立全校防疫聯絡網及著手建置校園內相關防疫配套措施;同時,配合「國立臺灣大學系統」將本學期的開學日延後至3月2日[2],以妥善規劃開學後校內各項防疫工作。
以資訊工程的角度出發,觀察過去網路關鍵字搜尋趨勢也可發現(如圖1),隨著全球疫情於3月中旬時逐漸上升,網際網路上與「COVID-19、新型冠狀、武漢肺炎及口罩」等相關搜尋關鍵字也同時遞增,可見,全球各地民生活動皆受此期間疫情爆發有一定的影響;於此同時,臺大校內防疫措施如校園進出管制等亦是為此也逐步加以限縮,除將「臺大杜鵑花節」以線上直播方式舉辦外,影響校園日常生活甚巨者莫過於3月2日發佈之「館舍進出管制」措施[3];實施初期以各館舍原有之門禁裝置刷卡紀錄,配合每日上班期間(08:30至17:30時)值班人員實施體溫量測,除容易造成各主要教學館舍入口處大排長龍外,在未裝設門禁裝置的館舍更是一時難以施行。
圖1:全球過去90天有關COVID-19關鍵字搜尋趨勢(來源:Google搜尋趨勢)
為此,本校計資中心立即於實施初期著手開發「防疫管控系統」,以落實校園防疫政策為目標,並實地考察研擬簡化作業流程。「防疫管控系統」可將各管制點所量測得體溫數據及進入館舍足跡資訊傳送到資料庫,亦能即時共享各館舍體溫量測數據。除減少教職員工生每日進入館舍體溫量測次數外,以數位化感應刷卡足跡紀錄亦超前部署作到「實名制」管制追蹤,以備後續可能的疫情調查所需之用;此外,因周邊學校及密切往來之機關陸續傳出確診案例,系統一併啟動隔離名單過濾機制(含:居家檢疫、居家隔離、自主健康管理),以最嚴謹的態度執行館舍進出管制,確保人員的健康安全。
圖2:防疫一號升級版(來源:本校電機系-防疫森友會)
除軟體系統的建置,計資中心偕同總務處及電機系師生團隊,應用電機系所研發的「防疫一號」,於4月下旬完成「防疫一號升級版」硬體換裝(如圖2);於5月8日記者會上公開宣佈將無償釋出開發技術(防疫一號升級版硬體開源:https://github.com/TobyChen0106/Automatic-Forehead-Thermometer),本文便是延續該硬體開源,將「防疫管制系統」軟體開發技術及整體系統架構作說明,唯因需遵守ISO27001相關規範,無法公開程式代碼,僅就系統架構及開發流程說明如下:
Step.0 Html網頁開發工具及NFC無線感應(條碼)讀卡機
本文所談之「防疫管制系統」係以Html5、JavaScript、jQuery、Bootstrap與ajax等前端及C#後端網頁技術開發而成,相關之程式語法使用及教學大多可於網路上尋得線上課程抑或是在資訊類書籍中學習到,本文不另贅述。
圖3:管制位置設備擺設實例
登入系統使用時,在各管制位置前端設備上裝設NFC讀卡機或條碼掃描器(如圖3),用以讀取IC卡資訊轉為鍵盤輸入後,傳送至系統輸入框內轉至後端作查詢及寫入紀錄。
Step.1資料表(Table)建置
表1:資料庫總表
No.
|
TableName
|
Note
|
1
|
Log_signIn
|
入館紀錄
|
2
|
tempCardUser
|
臨時卡資訊檔
|
3
|
unitGates
|
管制點設定
|
4
|
userMapping
|
卡片對應
|
5
|
warningList
|
隔離管制名單
|
6
|
stationGates
|
防疫一號設定
|
於資料庫內建立資料表(如表1),透過前端所傳送之IC卡資訊以資料庫預存程序完成人員資料查詢及足跡紀錄,各個資料表欄位及資料型態分別設置如下(如表2至表7):
表2:入館紀錄(Log_signIn)
No.
|
ColumnName
|
Type
|
Note
|
1
|
入館記錄流水號 signRef
|
bigint(8)
|
|
2
|
入館日期 signDate
|
date
|
|
3
|
入館時間 signTime
|
datetime
|
|
4
|
體溫 bTemp
|
int(4)
|
防疫一號回傳體溫數據
|
5
|
使用者類別 userType
|
int(1)
|
教職員/學生/校友…
|
6
|
校內編號 seq
|
varchar(50)
|
人員代號/學號
|
7
|
發燒註記 msg
|
nvarchar(MAX)
|
|
8
|
管控點流水號 gateRef
|
int(4)
|
|
9
|
紀錄上傳IP ip
|
varchar(50)
|
|
10
|
紀錄上傳UID lastupdUser
|
varchar(50)
|
|
11
|
紀錄上傳時間 lastupdDate
|
datetime
|
|
表3:臨時卡資訊檔(tempCardUser)
No.
|
ColumnName
|
Type
|
Note
|
1
|
流水號 cardRef
|
int(4)
|
|
2
|
身分證字號 idNo
|
varchar(50)
|
|
3
|
姓名 cName
|
nvarchar(30)
|
|
4
|
臨時卡號 cardId
|
varchar(10)
|
|
5
|
電話號碼 phone
|
varchar(32)
|
|
6
|
部門代碼 dptCode
|
varchar(30)
|
|
7
|
部門名稱 cDptName
|
nvarchar(30)
|
|
8
|
登錄時間 createDate
|
datetime
|
|
9
|
狀態值 statusRef
|
int(4)
|
|
10
|
狀態碼 statusCode
|
varchar(30)
|
|
11
|
異動IP ip
|
varchar(50)
|
|
12
|
異動者UID lastupdUser
|
varchar(50)
|
|
13
|
最後異動時間 lastupdDate
|
datetime
|
|
表4:管制點設定(unitGates)
No.
|
ColumnName
|
Type
|
Note
|
1
|
流水號 gateRef
|
int(4)
|
|
2
|
管制點名稱 gateName
|
varchar(128)
|
|
3
|
部門代碼 dptCode
|
varchar(64)
|
|
4
|
部門名稱 cDptName
|
nvarchar(128)
|
|
5
|
與他館資料比對否 oDptGate
|
int(1)
|
0 or 1,預設為1
|
6
|
容許時間 fHours
|
int(1)
|
1-8小時,預設為8
|
7
|
登入驗證碼 RandomCode
|
varchar(6)
|
|
8
|
狀態值 statusRef
|
int(4)
|
啟用/停用
|
9
|
狀態碼 statusCode
|
varchar(30)
|
啟用/停用
|
10
|
異動IP ip
|
varchar(50)
|
|
11
|
異動者UID lastupdUser
|
varchar(50)
|
新增/異動者帳號UID
|
12
|
最後異動時間 lastupdDate
|
datetime
|
|
表5:卡片對應(userMapping)
No.
|
ColumnName
|
Type
|
Note
|
1
|
流水號 uRef
|
int(4)
|
|
2
|
校內編號EmpNo
|
varchar(50)
|
人員代號/學號/臨時卡證號
|
3
|
卡號雜湊值 CardNoMD5
|
nvarchar(32)
|
卡號經雜湊(HASH)編碼值
|
表6:隔離管制名單(warningList)
No.
|
ColumnName
|
Type
|
Note
|
1
|
流水號 listRef
|
int(4)
|
|
2
|
校內編號 seq
|
varchar(50)
|
人員代號/學號
|
3
|
身分證字號 idNo
|
varchar(50)
|
|
4
|
管制說明 msg
|
nvarchar(MAX)
|
居家隔離/居家檢疫…
|
5
|
管制起日 startDate
|
date
|
|
6
|
管制迄日 endDate
|
date
|
|
7
|
異動者UID lastupdUser
|
varchar(50)
|
|
8
|
最後異動時間 lastupdDate
|
datetime
|
|
表7:防疫一號設定(stationGates)
No.
|
ColumnName
|
Type
|
Note
|
1
|
流水號 gateRef
|
int(4)
|
|
2
|
防疫一號名稱 gateName
|
varchar(128)
|
|
3
|
部門代碼 dptCode
|
varchar(64)
|
|
4
|
部門名稱 cDptName
|
nvarchar(128)
|
|
5
|
與他館資料比對否 oDptGate
|
int(1)
|
0 or 1,預設為1
|
6
|
容許時間 fHours
|
int(1)
|
1-8小時,預設為8
|
7
|
狀態值 statusRef
|
int(4)
|
啟用/停用
|
8
|
狀態碼 statusCode
|
varchar(30)
|
啟用/停用
|
9
|
異動IP ip
|
varchar(50)
|
|
10
|
異動者UID lastupdUser
|
varchar(50)
|
新增/異動者帳號UID
|
11
|
最後異動時間 lastupdDate
|
datetime
|
|
Step.2預存程序(Stored Procedure)建置
為使前端IC卡資訊刷入時,人員資料查詢與紀錄具有一致性(Consistency),系統內主要係透過資料庫交易(Transaction)機制完成ㄧ系列的作動,包含由下列兩個主要的預存程序完成:
- 人員資料查詢(SP_AI_selectUser)預存程序(如表8):
- 傳入相關參數,依各種身分別作查詢:
- 教職員工、
- 學生、
- 臨時卡人員、
- 校友、
- 訪客證、工作證。
- 回傳查詢出之人事資料。
表8:人員資料查詢(SP_AI_selectUser)
Parameter
|
Type
|
Note
|
cardId
|
VARCHAR(10)
|
xxxxxxxxxx(數字共10碼)
|
gateRef
|
INT
|
管制點流水號
|
IP
|
VARCHAR(14)
|
管制點IP
|
UID
|
VARCHAR(64)
|
管制點登入帳號
|
bTemp
|
INT
|
體溫*10,防疫一號傳入
|
hCode
|
VARCHAR(32)
|
Hash值,防疫一號驗證用
|
- 刷入足跡紀錄(SP_AI_logSignIn)預存程序(如表9):
- 傳入相關資訊;
- 回傳含:
- 自動量測溫度紀錄、
- 隔離管制紀錄、
- 刷卡入館紀錄、
- 發燒註記紀錄。
表9:刷入足跡紀錄(SP_AI_logSignIn)
Parameter
|
Type
|
Note
|
bTemp
|
INT
|
體溫*10,防疫一號傳入
|
userType
|
INT
|
教職員/學生/校友…
|
idNo
|
VARCHAR(10)
|
身分證字號
|
gateRef
|
INT
|
管制點流水號
|
IP
|
VARCHAR(64)
|
管制點IP
|
UID
|
VARCHAR(64)
|
管制點登入帳號
|
Step.3系統前、後端功能
資料表及資料庫預存程序建立完成後,即可完成系統內應有(僅供參考,非完全必要)的各項功能設計,分別為後端管理介面及前端刷卡介面如下:
- 後端管理介面(圖4至圖6):
圖4:後端管理介面:管控位置設定
圖5:後端管理介面:臨時卡設定
圖6:後端管理介面:臨時卡匯入
- 前端刷卡介面(如圖7):
圖7:前端刷卡介面:IC卡資訊刷入畫面
後記
臺灣此次防疫策略執行效果顯著全球有目共睹,無論從政府由上而下相關的管制措施及防疫物資控管上,抑或是各級機關學校內之防疫舉措同樣都能帶給其他國家、姊妹校等有所效仿。對於臺大而言,除全校之教職員工生數居全國之最,每日進出校園人流(如圖8)亦能反映出面對疫情嚴峻時校內的健康安全將是何等難以維護。
圖8:臺大校園單日之刷卡數及單一人次統計
回想3月初時,正當國內外疫情逐漸升溫之際,本專案從需求討論到初版開發,完成送至校級防疫小組提案簡報,僅短短不到兩週時間,計資中心本著IT資訊技術專長,以網路傳輸及數位電子化的方式建立館舍進出防疫管控機制,除了落實校級防疫政策外,更是期望能作到全面性的校園安全,以保障所有的教職員工生有健全的教學與習環境。
圖9:「防疫一號升級版」硬體開發-防疫森友會(左至右):吳兩原、黃世丞、徐子程、施力維、陳柏志、施貽仁及劉昀昇等同學
「你的歲月能如此靜好,是因為有人替你負重前行」,每每遇天災事變時,您我總能以自身的力量發揮「人飢己飢,人溺己溺」的精神,作到無私的奉獻與互助合作,僅以本文紀錄這段期間因應防疫而生的開發歷程,也對一同參與本專案包含:防疫森友會(如圖9)、電機系與總務處師長同仁及在各館舍第一線執勤的人員們致上最高的感謝!
參考資料
- 因應武漢疫情 本校成立校級防疫小組
https://www.ntu.edu.tw/spotlight/2020/1798_20200201.html
- 因應嚴重特殊傳染性肺炎疫情發展,臺灣大學系統三校,開學日延後2周
https://www.ntu.edu.tw/spotlight/2020/1800_20200203.html
- 因應疫情發展,本校防疫措施升級
https://www.ntu.edu.tw/spotlight/2020/1810_20200302.html
- 防疫一號升級版硬體開源
https://github.com/TobyChen0106/Automatic-Forehead-Thermometer
- 校園抗疫實例:臺灣大學
https://www.ithome.com.tw/news/136562
- 資料庫交易
https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1
- 交易 (Transact-SQL):
https://docs.microsoft.com/zh-tw/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver15