Slide 1

Slide 1 text

為醫療加裝Python的引擎 Max Lai 童綜合醫院 2024/09/21 PyConTW 2024

Slide 2

Slide 2 text

About Me • Max Lai • 童綜合醫院資訊部 • 副主任 • 負責智慧醫療系統研發 • 社群經歷 • 2014年6月共同發起「Taichung.py 」Meetup • 2014年12月發起並主持「台中敏捷社群」活動 • 2015~2018年「台中敏捷之旅研討會 」主辦人 • PyCon TW 2018, 2020, 2021, 2022 投稿分享

Slide 3

Slide 3 text

童綜合醫院 • 位於臺中市梧棲區 • 臺中市海線大型區域教學綜合醫院 • 連續6次獲得 JCI 國際醫療認證 • 通過 HIMSS EMRAM 六級國際認證

Slide 4

Slide 4 text

大綱 • 在既有醫療資訊系統加入新功能的挑戰與策略 • 新舊系統資料互通 • 新舊系統無縫串接 • 以Strangler pattern 重構系統

Slide 5

Slide 5 text

醫師 門急住 電子 病歷 護理 收費 行政 管理 藥劑 教學 研究 檢驗 HIS 上百個子功能 !!! 醫院資訊系統 (HIS)

Slide 6

Slide 6 text

• 醫院的資訊系統已運行著許多既有系統 • 有些延用幾10年的技術(ex. Informix DB, Delphi, 4GL); • 新舊系統如何無縫介接通常需要特別設計。 • 因為醫療活動持續24小時在進行 • 全部打掉重練重新開發一套系統, • 依過往業界的案例很難達成無痛轉移, • 對管理階層來說不可能投入如此龐大的資金及人力。 加入新功能或重構的挑戰

Slide 7

Slide 7 text

管路 門診護理(Delphi) 管路 住院護理(Delphi) 管路 急診護理(Delphi) 生命 徵象 管路 整合護理 管路 微服務(Flask+Vue.js) 生命 徵象 生命 徵象 生命 徵象 • Informix + Pyodbc • 中文罕見字編碼 • Repository Pattern • 內嵌Web • 抽取共用元件 • 呼叫Delphi Python Socket Server 批價系統 4GL 部份 負擔 部份 負擔 Informix • 抽取 4GL 模組到 Socket Server Flask + Vue.js • 串連跨系統流程 1.新舊系統資料互通 2.新舊系統無縫串接 逐步增加Python新功能/舊系統抽取共用模組 3.以Strangler Pattern 漸進式重構

Slide 8

Slide 8 text

1.新舊系統資料互通

Slide 9

Slide 9 text

• OpenInformix/IfxPy • 以 pyodbc 連線 Informix DB • IBM Informix ODBC Driver + unixODBC + pyodbc 1)新舊系統資料互通 1.1 如何用 Python 查詢 Infomix DB

Slide 10

Slide 10 text

Informix DB informix client UnixOdbc Pyodbc CP950 codec 0x92D1, '廔' Image source: Text balloon icons created by Md Tanvirul Haque - Flaticon 1)新舊系統資料互通 1.2 中文罕見字自訂編碼之解譯處理

Slide 11

Slide 11 text

Informix DB informix client UnixOdbc Pyodbc tung-big5- codec 0x92D1, '廔' \u5ED4, '廔' 1)新舊系統資料互通 Python App 1.2 中文罕見字自訂編碼之解譯處理 自訂 Big5 UTF8 CNS 0x92D1 \u5ED4 2-4A24 廔 0xFA40 \u26C40 4-346A 𦱀 0x9041 \u741F 3-3D35 琟 reference: 中文全字庫 https://www.cns11643.gov.tw/index.jsp

Slide 12

Slide 12 text

https://github.com/cclai999/pycontw2024/

Slide 13

Slide 13 text

Before After Informix 1)新舊系統資料互通 reference: https://www.cosmicpython.com/book/chapter_02_repository.html 1.3 以 Repository 隔離 Informix 存取 Layer

Slide 14

Slide 14 text

Before Future MariaDB/PostgreSQL 1)新舊系統資料互通 reference: https://www.cosmicpython.com/book/chapter_02_repository.html 1.3 以 Repository 隔離 Informix 存取 Layer

Slide 15

Slide 15 text

https://github.com/cclai999/pycontw2024/

Slide 16

Slide 16 text

https://github.com/cclai999/pycontw2024/

Slide 17

Slide 17 text

2.新舊系統無縫串接 以病人為中心 後端-抽取微服務、前端-界面混搭

Slide 18

Slide 18 text

2)新舊系統無縫串接 APIFlask FastAPI Underlying framework/libs Flask + Marshmallow Starlette + Pydantic HTTP methods @app.input(), @app.output(), @app.get(), @app.post(), etc @app.input(), @app.output(), @app.get(), @app.post(), etc Data validation built-in built-in Error message JSON format JSON format Async support Yes (less performant) Yes OpenAPI document Automatic generation Automatic generation Community Rich Smaller Download(PyPI Stats) last month: 97,448,895 last month: 60,543,770 2.0 Web Framework 的選擇

Slide 19

Slide 19 text

① PACS/影像資料庫 報告資料庫 RIS + 即時輔助診斷 醫師產出報告 HIS Dicom PNG AI Inference AI Model NAS ② ③ ④ ⑤ ⑥ ⑦ PyConTW20 PyConTW22 2)新舊系統無縫串接 Medical AI Inference Pipeline

Slide 20

Slide 20 text

2.1『放射報告系統』 內嵌 『AI 辨識(Web)』 2)新舊系統無縫串接 放射報告系統 AI 辨識結果

Slide 21

Slide 21 text

把 Delphi 核心邏輯抽取成微服務 2)新舊系統無縫串接 2.2『護理執行』 內嵌 『管路資訊 (Web)』 護理執行登錄系統 管路資訊系統 跳窗

Slide 22

Slide 22 text

住院醫囑 2)新舊系統無縫串接 2.2各既有系統內嵌管路微服務(Web) 手術護理 護理過程 整合護理系統

Slide 23

Slide 23 text

麻醉護理 (Web) 病歷查詢(Delphi) 2.3 新Web系統 開啟舊 Delphi APP 2)新舊系統無縫串接

Slide 24

Slide 24 text

報告延遲, 無法追蹤 是否通報, 無法追蹤 報告完成無主動通知:等待 2.4 健檢報告流程事件之串連 2)新舊系統無縫串接 報告延遲, 無法追蹤

Slide 25

Slide 25 text

Kafka Rest Proxy X光報告 系統 Delphi 分派系統 PHP 檢驗報告 系統 報告項目 確認系統 總評報告 系統 PHP PHP 2)新舊系統無縫串接 2.4 以事件訊息串連跨系統醫療流程 事件趨勢架構 ⑴分派X光報告 2023/7/24 16:14 ⑵X光報告完成 2023/7/25 09:43 ⑷檢驗報告完成 2023/8/08 11:09 ⑸各報告確認完成 2023/8/09 10:38 ⑶X光報告翻譯完 2023/7/25 09:45 ⑹總評報告完宬 2023/8/14 16:03 ⑺總評校稿完宬 2023/8/14 16:36 ⑴分派X光報告 2023/7/24 16:14 ⑵X光報告完成 2023/7/25 09:43 ⑷檢驗報告完成 2023/8/08 11:09 ⑸各報告確認完成 2023/8/09 10:38 ⑶X光報告翻譯完 2023/7/25 09:45 ⑹總評報告完宬 2023/8/14 16:03 ⑺總評校稿完宬 2023/8/14 16:36 Python(Web) 事件時序記錄

Slide 26

Slide 26 text

3.以Strangler Pattern 漸進式重構 逐漸抽取 HIS 子功能成為「微服務」

Slide 27

Slide 27 text

https://bit.ly/3KwdvmO 新HIS (微服務) 舊HIS(單體式) 3)以Strangler Pattern 漸進式重構 逐漸抽取 HIS 子功能成為「微服務」

Slide 28

Slide 28 text

上游系統/ 使用者介面 HTTP Proxy 部份負擔 部份負擔 單體系統 上游系統/ 使用者介面 HTTP Proxy 部份負擔 部份負擔 單體系統 H T T P Source: 單體式系統到微服務 Web常見的漸進式轉換 3)以Strangler Pattern 漸進式重構

Slide 29

Slide 29 text

• 介面與DB資料高度耦合 • 大量的 global variables • 不支援 HTTP request 4GL 重構的難題 3)以Strangler Pattern 漸進式重構

Slide 30

Slide 30 text

上游系統/ 使用者介面 部份負擔 部份負擔 共享 資料 4GL 批價系統 global variables db index Socket: function name, db index Python Socket Server global variables db index Informix DB db index 3)以Strangler Pattern 漸進式重構 以Socket Server & 共享表格抽取新模組

Slide 31

Slide 31 text

https://github.com/cclai999/pycontw2024/

Slide 32

Slide 32 text

總結

Slide 33

Slide 33 text

管路 門診護理(Delphi) 管路 住院護理(Delphi) 管路 急診護理(Delphi) 生命 徵象 管路 整合護理 管路 微服務(Flask+Vue.js) 生命 徵象 生命 徵象 生命 徵象 • Informix + Pyodbc • 中文罕見字編碼 • Repository Pattern • 內嵌Web • 抽取共用元件 • 呼叫Delphi Python Socket Server 批價系統 4GL 部份 負擔 部份 負擔 Informix • 抽取 4GL 模組到 Socket Server Flask + Vue.js • 串連跨系統流程 逐步增加Python新功能/舊系統抽取共用模組

Slide 34

Slide 34 text

麻醉 護理 系統 ICU 護理 系統 個案 管理 系統 整合 護理 系統 CXR AI辨識 管路 微服務 輸血 登錄 門診 給藥 健檢 問卷 健檢 總評 整合 醫囑 Python Based 新系統的擴散

Slide 35

Slide 35 text

使用者 滿意度 什麼地方好用 User1 非常滿意 • 這個系統不只是麻醉紀錄,也是一個流程系統, • 而且於個案討論時,可以很清楚的看到處置的時間用藥。 User2 滿意 • 省去手寫診斷跟術式,疾病史自行帶入。 • 免去交接班上一個人字跡潦草看不懂的窘境 • 也會自己累積水量尿量那些,整體來說系統還不錯用 User3 非常滿意 • 不用在手寫診斷跟術式,病人基本資料也都幫我們帶入了,在上小 刀省了很多時間,還不用趁長刀時抓緊寫麻單 User4 滿意 • 不用手寫術式跟診斷,自動帶入病人資料真的很棒 ,對於短刀真 的很方便,也有很多片語可以使用,省去打字紀錄的時間 User5 非常滿意 • 在交班面~版面設計井然有序,交班不掉落 • 在製作PFT檔~異常個素報告字體顯示清晰 User6 滿意 • 接病人時,按照ORMS左側排列順序,一一核對各關卡,井然有序 • 提升病人安全,減少各項疏失的錯誤率 User7 非常滿意 • 節省很多寫麻單的時間, • 一個頁面就可以滿足所有需求,都有各個連結點 麻醉護理系統使用者回饋 一年節省 8人月(護理師)

Slide 36

Slide 36 text

協助醫護的日常工作 讓病人得到更多關注 HIS的價值:

Slide 37

Slide 37 text

歡迎加入 Taichung.py