快速開啓舊影像及複製報告

昨天一次進了兩百多份的 plain film,打著打著忽然覺得我為什麼一直在做重複的動作

  • 切換至歷史報告
  • 點最新的報告
  • 開啟舊片
  • 複製報告
  • 切換回報告區

輸入報告流程示意圖

這好像也是可以自動化的事情吧!所以研究了一下如何利用 AutoHotKey 來幫我完成這件事。

一開始很單純的就是用滑鼠動作來模擬,只要把我點選的坐標依順序輸入:

MouseGetPos, xpos,ypos
Click 700, 180 ; 歷史報告
Click 270, 325 ; 開影像
Click 1080, 759 ; 複製報告
Click 300, 180 ; 回報告區
MouseMove, %xpos%, %ypos%
後來發現會因為醫囑的長度不同,而影響到複製報告這個 button 的坐標,所以我只好把它可能出現的位置都標上,全部 Click 一次總會中吧!

MouseGetPos, xpos,ypos
Click 700, 180 ; 歷史報告
Click 270, 325 ; 開影像
Click 1080, 741 ; 複製報告
Click 1080, 759 ; 複製報告
Click 1080, 777 ; 複製報告
Click 1080, 795 ; 複製報告
Click 1080, 813 ; 複製報告
Click 1080, 831 ; 複製報告
Click 300, 180 ; 回報告區
MouseMove, %xpos%, %ypos%
但這還是有點蠢。後來發現其實 AutoHotKey 似乎可以透過 IE 和控制 COM (Component Object Model) 來做網頁的 navigation

於是研究了一下報告系統的網頁結構,把這個 Hotkey 改成這樣:

; HotKey
;; for SmartWonder
#IfWinActive, tedpc-
IEGet(Name="") ;Retrieve pointer to existing IE window/tab
{
IfEqual, Name,, WinGetTitle, Name, ahk_class IEFrame
Name := ( Name="New Tab - Windows Internet Explorer" ) ? "about:Tabs"
: RegExReplace( Name, " - (Windows|Microsoft) Internet Explorer" )
For wb in ComObjCreate( "Shell.Application" ).Windows
If ( wb.LocationName = Name ) && InStr( wb.FullName, "iexplore.exe" )
Return wb
} ;written by Jethrow
$^0::
wb := IEGet()
frmWork := wb.document.frames["frameWork"]
frmTabIframe2 := frmWork.document.frames["tabIframe2"]
tabEditReport := frmWork.document.getElementById("tabCaption0").children[1]
tabPrevReport := frmWork.document.getElementById("tabCaption0").children[7]
; 切換至歷史報告頁
tabPrevReport.click()
Loop ;optional check to wait for the page to completely load
Sleep, 100
Until (frmTabIframe2.document && frmTabIframe2.document.readyState = "complete")
;; get current exam date and time
frmHistory2 := frmTabIframe2.frames["History2"]
Loop ;optional check to wait for the page to completely load
Sleep, 100
Until (frmHistory2.document && frmHistory2.document.readyState = "complete")
currExamName := frmHistory2.document.getElementById("BodyPart").innerText
currExamDate := frmHistory2.document.getElementById("StudyDate").innerText
currExamTime := frmHistory2.document.getElementById("StudyTime").innerText
; 檢查是否有歷史報告
prevReportLists := frmTabIframe2.document.getElementById("lstBdyQuery")
isNoPrevReport := (prevReportLists.children.length = 0)
tdMsgMore := frmTabIframe2.document.frames["History1"].document.getElementById("tdMsgMore")
If !isNoPrevReport ; 有一筆以上的歷史報告
{
; 參考用的 pattern
patternCXR := "i)chest (pa|ap)"
patternKUB := "i)kub"
; 分析目前為何種檢查
If RegExMatch(currExamName, patternCXR)
currPattern := patternCXR
Else If RegExMatch(currExamName, patternKUB)
currPattern := patternKUB
Else
currPattern := ""
If (currPattern = "")
MsgBox % "AHK-SmartWonder: Currently, only CXR and KUB are supported."
Else { ; 找到最近相關報告
prevReportListsLength := prevReportLists.children.length
getPrevReport := 0
Loop %prevReportListsLength% {
If RegExMatch(prevReportLists.children[A_Index].children[7].innerText, currPattern) {
; 必須要是比當前報告早的報告
prevExamDate := prevReportLists.children[A_Index].children[4].innerText
prevExamTime := prevReportLists.children[A_Index].children[5].innerText
;; convert string to int for date and time
StringReplace prevExamDate, prevExamDate, -,, All
StringReplace currExamDate, currExamDate, -,, All
prevExamTime := prevExamTime + 0
currExamTime := currExamTime + 0
If (currExamDate > prevExamDate || (currExamDate = prevExamDate && currExamTime > prevExamTime)) {
getPrevReport := A_Index
break
}
}
}
If (getPrevReport > 0) { ; 有找到相關的報告
latestRelatedReport := prevReportLists.children[getPrevReport].children[1]
latestRelatedReport.click() ; 點最近報告、開影像
frmPrevReport := frmTabIframe2.document.frames["History3"]
Loop ;optional check to wait for the page to completely load
Sleep, 100
Until (frmPrevReport.document && frmPrevReport.document.readyState = "complete")
btnCopyReport := frmPrevReport.document.getElementsByName("copyReport")[0]
btnCopyReport.click() ; 複製報告
}
}
}
; 切回報告編輯頁
tabEditReport.click()
If isNoPrevReport ; 完全沒有歷史報告
MsgBox % tdMsgMore.innerText
If (getPrevReport = 0) ; 有找到相關的報告,顯示訊息
MsgBox % "AHK-SmartWonder: No related report found."
return
#IfWinActive
運作的模式和滑鼠點選其實一樣,只不過透過網頁的元件,可以精確的點選到目標,而不需要亂槍打鳥的重複點選,另外也可以偵測網頁是否已經讀取完畢,而不用做無謂的 sleep 等待。

安裝與使用

有兩種不同的安裝方式:

  1. 直接將上面那段 code 貼到 AutoHotKey 的設定檔中
  2. 將這段 code 存成另一個 .ahk 的 script 檔,利用 #Include 的方式載入

目前預設的快速鍵是 Ctrl + 0,如果想要更改或是有相衝突的話,可以將

$^0::

中的 0 改成其他想要設定的按鍵。

Indication

想要簡單的開啟舊影像和複製報告的人

限制

目前 script 只設計到可以辨識 Chest X-ray 和 KUB,未來可能會加入其他種類的檢查。

開發

目前我把這個 script 和一些自己有在用的 Hotstrings 放到 Github 上: tsaiid / ahk-smartwonder,有需要的人歡迎取用或 fork,未來的更新也會持續發佈於此。

替代方案

某日和學長討論後才發現,其實現在的報告系統有提供類似的功能,可以在進入編輯報告頁面的同時,把過去的影像讀出來(需指定特定種類),而歷史報告的部分則是以新視窗的方式開啟。

雖然我的 script 不是什麼新鮮玩意兒,不過可以自動比對檢查,以及可以自動複製先前報告,應該還算是方便一些啦!另外,用自己寫的東西才爽啊!歐耶~


2 Comments

Leave a Reply