약품 투여 빈도와 치료 차트 연결
목적과 이점
이 설정을 사용하면 Medication에 월요일·수요일·금요일 같은 사용자 정의 약품 투여 빈도를 추가할 수 있습니다. 사용자 정의 표시 컨트롤이 설정된 빈도에 따라 정보를 보여주도록 Treatment Chart도 구성할 수 있습니다.
단계
치료 차트는 입원 환자의 방문 대시보드에서 사용할 수 있습니다.

visit.json 구성
apps/clinical/visit.json에 다음 설정이 필요합니다.
"sections": {
"Custom Treatment Chart": {
"type": "custom",
"displayOrder": 1,
"config": {
"title": "Custom Treatment Chart",
"template": "<custom-treatment-chart config=config visit-summary=visitSummary></custom-treatment-chart>",
"showOtherActive": true,
"frequenciesToBeHandled": [
"Monday, Wednesday, Friday",
"Tuesday, Thursday, Saturday",
"Monday, Sunday, Wednesday"
]
}
},
"Treatments": {
"type": "treatment",
"title": "Treatments",
"displayOrder": 6,
"config": {
"translationKey": "VISIT_TITLE_TREATMENTS_KEY",
"showFlowSheet": false,
"showListView": true,
"showOtherActive": false,
"showDetailsButton": true,
"showRoute": true,
"showDrugForm": true,
"showProvider" : true
}
}
}customControl.js 구성
apps/customDisplayControl/js/customControl.js에서 구성합니다(js 디렉터리에 이 파일이 없으면 만듭니다).
customControl.js가 이미 있으면 이 설정을 파일 끝에 추가하고 다른 지시문과 병합하지 마십시오.
.directive('customTreatmentChart', ['appService', 'treatmentConfig', 'treatmentService', 'spinner', '$q', function(appService, treatmentConfig, treatmentService, spinner, $q) {
var link = function($scope) {
var Constants = Bahmni.Clinical.Constants;
var days = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
];
$scope.contentUrl = appService.configBaseUrl() + "/customDisplayControl/views/customTreatmentChart.html";
$scope.atLeastOneDrugForDay = function(day) {
var atLeastOneDrugForDay = false;
$scope.ipdDrugOrders.getIPDDrugs().forEach(function(drug) {
if (drug.isActiveOnDate(day.date)) {
atLeastOneDrugForDay = true;
}
});
return atLeastOneDrugForDay;
};
$scope.getVisitStopDateTime = function() {
return $scope.visitSummary.stopDateTime || Bahmni.Common.Util.DateUtil.now();
};
$scope.getStatusOnDate = function(drug, date) {
var activeDrugOrders = _.filter(drug.orders, function(order) {
if ($scope.config.frequenciesToBeHandled.indexOf(order.getFrequency()) !== -1) {
return getStatusBasedOnFrequency(order, date);
} else {
return drug.getStatusOnDate(date) === 'active';
}
});
if (activeDrugOrders.length === 0) {
return 'inactive';
}
if (_.every(activeDrugOrders, function(order) {
return order.getStatusOnDate(date) === 'stopped';
})) {
return 'stopped';
}
return 'active';
};
var getStatusBasedOnFrequency = function(order, date) {
var activeBetweenDate = order.isActiveOnDate(date);
var frequencies = order.getFrequency().split(",").map(function(day) {
return day.trim();
});
var dayNumber = moment(date).day();
return activeBetweenDate && frequencies.indexOf(days[dayNumber]) !== -1;
};
var init = function() {
var getToDate = function() {
return $scope.visitSummary.stopDateTime || Bahmni.Common.Util.DateUtil.now();
};
var programConfig = appService.getAppDescriptor().getConfigValue("program") || {};
var startDate = null,
endDate = null,
getEffectiveOrdersOnly = false;
if (programConfig.showDetailsWithinDateRange) {
startDate = $stateParams.dateEnrolled;
endDate = $stateParams.dateCompleted;
if (startDate || endDate) {
$scope.config.showOtherActive = false;
}
getEffectiveOrdersOnly = true;
}
return $q.all([treatmentConfig(), treatmentService.getPrescribedAndActiveDrugOrders($scope.config.patientUuid, $scope.config.numberOfVisits,
$scope.config.showOtherActive, $scope.config.visitUuids || [], startDate, endDate, getEffectiveOrdersOnly)])
.then(function(results) {
var config = results[0];
var drugOrderResponse = results[1].data;
var createDrugOrderViewModel = function(drugOrder) {
return Bahmni.Clinical.DrugOrderViewModel.createFromContract(drugOrder, config);
};
for (var key in drugOrderResponse) {
drugOrderResponse[key] = drugOrderResponse[key].map(createDrugOrderViewModel);
}
var groupedByVisit = _.groupBy(drugOrderResponse.visitDrugOrders, function(drugOrder) {
return drugOrder.visit.startDateTime;
});
var treatmentSections = [];
for (var key in groupedByVisit) {
var values = Bahmni.Clinical.DrugOrder.Util.mergeContinuousTreatments(groupedByVisit[key]);
treatmentSections.push({
visitDate: key,
drugOrders: values
});
}
if (!_.isEmpty(drugOrderResponse[Constants.otherActiveDrugOrders])) {
var mergedOtherActiveDrugOrders = Bahmni.Clinical.DrugOrder.Util.mergeContinuousTreatments(drugOrderResponse[Constants.otherActiveDrugOrders]);
treatmentSections.push({
visitDate: Constants.otherActiveDrugOrders,
drugOrders: mergedOtherActiveDrugOrders
});
}
$scope.treatmentSections = treatmentSections;
if ($scope.visitSummary) {
$scope.ipdDrugOrders = Bahmni.Clinical.VisitDrugOrder.createFromDrugOrders(drugOrderResponse.visitDrugOrders, $scope.visitSummary.startDateTime, getToDate());
}
});
};
spinner.forPromise(init());
};
return {
restrict: 'E',
link: link,
scope: {
config: "=",
visitSummary: '='
},
template: '<ng-include src="contentUrl"/>'
}
}]);화면 관련 구성
apps/customDislayControl/views에 HTML 파일을 만들고 이름을 "customTreatmentChart.html"로 지정한 다음 아래 설정을 추가합니다.
xmlCode Snippettrue
{{config.title}}
{{::(visitSummary.startDateTime | bahmniDate) + ' - '+ (getVisitStopDateTime() | bahmniDate)}}
{{drug.orders[0].getDisplayName()}}
{{day.date | bahmniDate}}
]]>
<section class="block ipd-treatment-section" ng-if="::visitSummary.isAdmitted() && !print">
<h2 class="section-title">{{config.title}}</h2>
<table class="h-scroll">
<thead>
<tr>
<th>
<span>{{::(visitSummary.startDateTime | bahmniDate) + ' - '+ (getVisitStopDateTime() | bahmniDate)}}</span>
</th>
<th ng-repeat="drug in ::ipdDrugOrders.getIPDDrugs()" class="drug" ng-class="{active: drug.isActive()}">{{drug.orders[0].getDisplayName()}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="day in ::ipdDrugOrders.ipdDrugSchedule.days" ng-if="atLeastOneDrugForDay(day)">
<td>
<span>
<!-- D{{day.dayNumber}} ({{day.date | bahmniDate}}) -->
{{day.date | bahmniDate}}
</span>
</td>
<td ng-switch="getStatusOnDate(drug, day.date)" ng-repeat="drug in ::ipdDrugOrders.ipdDrugSchedule.drugs">
<span class="fa fa-ok" ng-switch-when="active"></span>
<span class="fa fa-stop" ng-switch-when="stopped"></span>
</td>
</tr>
</tbody>
</table>
</section>OpenMRS 구성
OpenMRS에서 클래스가 frequency이고 데이터 유형이 N/A인 개념을 추가합니다. 아래 화면의 개념 이름은 "Monday, Wednesday, Friday"입니다. Bahmni UI가 빈도 선택 항목에 이 개념 이름을 표시하므로 이해하기 쉬운 이름을 사용해야 합니다.

Medication 탭의 빈도 드롭다운에 이 빈도를 표시하려면 OpenMRS DB의 order_frequency 테이블에 위에서 만든 개념의 Concept ID를 포함하는 행을 삽입합니다.

Bahmni Wiki · CC BY-SA 4.0