کارها با InterSystems IRIS Workflow Engine – اتصال به برنامه های خارجی انجام می شود

در نهایت و با کمی تأخیر، با نشان دادن مثالی از اتصالی که میتوانیم از یک برنامه تلفن همراه ایجاد کنیم، این سری از مقالات را در مورد موتور گردش کار خود به پایان میرسانیم.
در مقاله قبلی مثالی را نشان دادیم که میخواستیم درباره آن بحث کنیم، برنامهای که امکان کنترل دقیق یک آسیب شناسی مزمن مانند فشار خون را برای بیمار و پزشک مرتبط با او فراهم میکند. در این مثال، بیمار از تلفن همراه خود به یک برنامه وب (اصولاً یک صفحه وب طراحی شده برای پاسخگو بودن با دستگاه) دسترسی خواهد داشت که در آن اعلانهایی را بر اساس اندازهگیریهایی که دستگاه فشارسنج قابل حمل به دستگاه ارسال میکند دریافت میکند. نمونه IRIS.
بنابراین ما دو دسترسی متفاوت به نمونه IRIS خود خواهیم داشت:
- دسترسی کاربر از اپلیکیشن موبایل
- دسترسی به دستگاه برای ارسال قرائت فشار خون.
در این مقاله ما اولین مورد از آنها را خواهیم دید که به بیمار اجازه می دهد وظایفی را که خواندن آنها ایجاد می کند مدیریت کند.
اتصال برنامه تلفن همراه – IRIS
برای این اتصال، ساده ترین کار پیکربندی یک برنامه وب در داخل IRIS است و برای انجام این کار از پورتال مدیریت به آن دسترسی خواهیم داشت. مدیریت سیستم -> امنیت -> برنامه ها -> برنامه های کاربردی وب:
سپس در لیستی که به ما نشان داده شده است، روی آن کلیک می کنیم برنامه جدید ایجاد کنید، که صفحه ای مانند زیر را باز می کند:
در این صفحه بیایید فیلدهای زیر را پیکربندی کنیم:
- نام: که در آن آدرس اینترنتی را که منتشر خواهیم کرد برای دسترسی به عملکرد خود در IRIS تعریف می کنیم.
- فضای نام: فضای نامی که میخواهیم برنامه وب به آن مرتبط شود، این به ما امکان میدهد بعداً از قابلیتهای تولیدات قابلیت همکاری بهره ببریم.
- استراحت: ما این گزینه را انتخاب می کنیم زیرا چیزی که قرار است منتشر کنیم یک REST API است که به اتصالات HTTP اجازه می دهد.
- کلاس اعزام: کلاس ObjectScript که تماس HTTP را دریافت می کند و تصمیم می گیرد که با آن چه کاری انجام دهد.
- از احراز هویت JWT استفاده کنید: با علامت زدن این گزینه، نقاط پایانی /login و /logout در URL که برای برنامه خود تعریف کردهایم فعال میشود، که به ما امکان میدهد تا یک JSON Web Token برای احراز هویت تماسهای خود از طریق IRIS دریافت کنیم.
- تنظیمات امنیتی -> روشهای تأیید اعتبار مجاز: ما یک رمز عبور برای ایمن سازی تماس های خود تعیین می کنیم.
بیایید نگاهی به ما بیندازیم Workflow.WS.Service کلاس:
Class Workflow.WS.Service Extends %CSP.REST
{
Parameter HandleCorsRequest = 0
Parameter CHARSET = "utf-8"
XData UrlMap [ XMLNamespace = "https://www.intersystems.com/urlmap" ]
{
"/getTasks" Method="GET" Call="GetTasks" />
"/saveTask" Method="POST" Call="SaveTask" />
}
ClassMethod OnHandleCorsRequest(url As %String) As %Status
{
set url = %request.GetCgiEnv("HTTP_REFERER")
set origin = $p(url,"https://dev.to/",1,3)
do %response.SetHeader("Access-Control-Allow-Credentials","true")
do %response.SetHeader("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS")
do %response.SetHeader("Access-Control-Allow-Origin",origin)
do %response.SetHeader("Access-Control-Allow-Headers","Access-Control-Allow-Origin, Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control")
quit $$$OK
}
ClassMethod GetTasks() As %Status
{
Try {
Do ##class(%REST.Impl).%SetContentType("application/json")
If '##class(%REST.Impl).%CheckAccepts("application/json") Do ##class(%REST.Impl).%ReportRESTError(..#HTTP406NOTACCEPTABLE,$$$ERROR($$$RESTBadAccepts)) Quit
Do ##class(%REST.Impl).%SetStatusCode("200")
set sql = "SELECT %Actions, %Message, %Priority, %Subject, TaskStatus_TimeCreated, ID FROM EnsLib_Workflow.TaskResponse WHERE TaskStatus_AssignedTo = ? AND TaskStatus_IsComplete = 0"
set statement = ##class(%SQL.Statement).%New(), statement.%ObjectSelectMode = 1
set status = statement.%Prepare(sql)
if ($$$ISOK(status)) {
set resultSet = statement.%Execute($USERNAME)
if (resultSet.%SQLCODE = 0) {
set tasks = []
while (resultSet.%Next() '= 0) {
set task = {"actions": "", "message": "", "priority": "", "subject": "", "creation": "", "id": ""}
set task.actions = resultSet.%GetData(1)
set task.message = resultSet.%GetData(2)
set task.priority = resultSet.%GetData(3)
set task.subject = resultSet.%GetData(4)
set task.creation = resultSet.%GetData(5)
set task.id = resultSet.%GetData(6)
do tasks.%Push(task)
}
}
}
set result = {"username": ""}
set result.username = $USERNAME
Do ##class(%REST.Impl).%WriteResponse(tasks)
} Catch (ex) {
Do ##class(%REST.Impl).%SetStatusCode("400")
return ex.DisplayString()
}
Quit $$$OK
}
ClassMethod SaveTask() As %Status
{
Try {
Do ##class(%REST.Impl).%SetContentType("application/json")
If '##class(%REST.Impl).%CheckAccepts("application/json") Do ##class(%REST.Impl).%ReportRESTError(..#HTTP406NOTACCEPTABLE,$$$ERROR($$$RESTBadAccepts)) Quit
set dynamicBody = {}.%FromJSON(%request.Content)
set task = ##class(EnsLib.Workflow.TaskResponse).%OpenId(dynamicBody.%Get("id"))
set sc = task.CompleteTask(dynamicBody.action)
if $$$ISOK(sc) {
Do ##class(%REST.Impl).%SetStatusCode("200")
Do ##class(%REST.Impl).%WriteResponse({"result": "success"})
}
} Catch (ex) {
Do ##class(%REST.Impl).%SetStatusCode("400")
Do ##class(%REST.Impl).%WriteResponse({"result": "error"})
}
Quit $$$OK
}
}
همانطور که می بینید، از WS خود ما تمام منطق مورد نیاز خود را حل می کنیم، اما انجام این کار را توصیه نمی کنم، زیرا قابلیت ردیابی را که می توانستیم با ارسال درخواست های دریافتی به تولید پیکربندی شده در Namespace به دست آوریم، از دست می دهیم.
با نگاهی به بخش URLMap خواهیم دید که 2 نقطه پایانی در WS خود پیکربندی شدهایم:
- getTasks: برای بازیابی تمام وظایف معلق کاربر (اگر SQL استفاده شده را مشاهده کنید، نام کاربری را مستقیماً از متغیر تولید شده هنگام ورود به سیستم ارسال می کنیم).
- saveTask: که در آن ما پاسخ کاربر به کار را دریافت کرده و با اجرای متد CompleteTaks به اتمام آن می پردازیم. EnsLib.Workflow.TaskResponse کلاس
از طرف IRIS، همه چیز از قبل برای اتصال برنامه خارجی پیکربندی شده است.
آزمایش برنامه خارجی با Workflow Engine
ابتدا ارسال یک پیام از HL7 به تولید خود را با کپی کردن فایل شبیه سازی می کنیم /shared/hl7/message_1_1.hl7 به مسیر /اشتراک گذاری شده/در، بیایید پیامی را که می فرستیم ببینیم:
MSH|^~\&|HIS|HULP|EMPI||20240402111716||ADT^A08|346831|P|2.5.1
EVN|A08|20240402111716
PID|||07751332X^^^MI^NI~900263^^^HULP^PI||LÓPEZ CABEZUELA^ÁLVARO^^^||19560121|F|||PASEO MARIO FERNÁNDEZ 258 1 DERECHA^^MADRID^MADRID^28627^SPAIN||555819817^PRN^^ALVARO.LOPEZ@VODAFONE.COM|||||||||||||||||N|
PV1||N
OBX|1|NM|162986007^Pulso^SNM||72|^bpm|||||F|||20240402111716
OBX|2|NM|105723007^Temperatura^SNM||37|^Celsius|||||F|||20240402111716
OBX|3|NM|163030003^Presión sanguínea sistólica^SNM||142|^mmHg|||||F|||20240402111716
OBX|4|NM|163031004^Presión sanguínea diastólica^SNM||83|^mmHg|||||F|||20240402111716
برای کسانی از شما که مقالات قبلی را به خاطر نمی آورید، ما در BPL خود تعریف کرده بودیم که زمانی که فشار سیستولیک از 140 بیشتر شود یا فشار دیاستولیک از 90 بیشتر شود، یک هشدار ایجاد می شود، بنابراین، این پیام باید یک وظیفه هشدار برای بیمار ما ایجاد کند. DNI (سند ملی شناسایی) 07751332X و یک خودکار دیگر که تا زمان دریافت اعلان جدید IRIS باز می ماند.
بیایید برنامه تلفن همراه خود را بررسی کنیم:
در آنجا ما 2 کار تولید می کنیم، اولی که به صورت دستی تعریف کرده ایم و تکمیل آن به کاربر بستگی دارد و دومی که به صورت خودکار اعلام کرده ایم و برای ناپدید شدن آن کاربر باید یک قرائت جدید با خون خود بگیرد. مانیتور فشار اگر نگاهی به تماس HTTP بیندازیم، میتوانیم ببینیم که چگونه JWT را در آن گنجاندهایم:
اگر کاربر روی دکمه Accept مربوط به کار معلق کلیک کند، جریان در انتظار دریافت قرائت فشارسنج باقی می ماند و به مراحل بعدی نمی رود. هنگامی که کار دستی پذیرفته شد و یک قرائت جدید از مانیتور فشار خون دریافت شد که در آن محدودیت های مشخص شده دوباره تجاوز کرد، سیستم دو وظیفه هشدار جدید ایجاد می کند، یکی برای بیمار و دیگری برای پزشک مرتبط که در آن یک بحران احتمالی وجود دارد. هشدار داده می شود. :
کامل! ما قبلاً سیستم اطلاع رسانی بیمار خود را به روشی ساده و سریع راه اندازی کرده ایم.
نتیجه گیری
همانطور که در این سری از مقالات مشاهده کردید، عملکرد Workflow Engine به همراه قابلیتهای تعاملی InterSystems IRIS پتانسیل باورنکردنی را برای اجرای فرآیندهای تجاری فراهم میکند که راهحلهای تجاری دیگری میتوانند ارائه کنند. درست است که دانش فنی ممکن است برای استفاده حداکثری از آن لازم باشد، اما واقعاً ارزش تلاش لازم را دارد.