working on UCAF get data

merge-requests/235/head
mosazaid 5 years ago
parent 4f1c70a3f4
commit e75e7801aa

@ -42,6 +42,8 @@ class BaseAppClient {
DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile); DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile);
if (body['DoctorID'] == null) if (body['DoctorID'] == null)
body['DoctorID'] = doctorProfile?.doctorID; body['DoctorID'] = doctorProfile?.doctorID;
if (body['DoctorID'] == "")
body['DoctorID'] = null;
body['EditedBy'] = doctorProfile?.doctorID; body['EditedBy'] = doctorProfile?.doctorID;
if (body['ProjectID'] == null) { if (body['ProjectID'] == null) {
body['ProjectID'] = doctorProfile?.projectID; body['ProjectID'] = doctorProfile?.projectID;

@ -527,4 +527,5 @@ const Map<String, Map<String, String>> localizedValues = {
'covered': {'en': "Covered", 'ar':"مغطى" }, 'covered': {'en': "Covered", 'ar':"مغطى" },
'approvalRequired': {'en': "Approval Required", 'ar':"الموافقة مطلوبة" }, 'approvalRequired': {'en': "Approval Required", 'ar':"الموافقة مطلوبة" },
'uncoveredByDoctor': {'en': "Uncovered By Doctor", 'ar':"غير مغطى من قبل الدكتور" }, 'uncoveredByDoctor': {'en': "Uncovered By Doctor", 'ar':"غير مغطى من قبل الدكتور" },
'chiefComplaintEmptyMsg': {'en': "There is no Chief Complaint", 'ar':"ليس هناك شكوى رئيس" },
}; };

@ -1,5 +1,58 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/service/base/base_service.dart'; import 'package:doctor_app_flutter/core/service/base/base_service.dart';
import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintReqModel.dart';
import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintResModel.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/models/patient/vital_sign/patient-vital-sign-data.dart';
class UcafService extends BaseService { class UcafService extends BaseService {
List<GetChiefComplaintResModel> patientChiefComplaintList = [];
VitalSignData patientVitalSigns;
Future getPatientChiefComplaint(PatiantInformtion patient) async {
hasError = false;
Map<String, dynamic> body = Map();
body['PatientMRN'] = patient.patientMRN;
body['AppointmentNo'] = patient.appointmentNo;
body['EpisodeID'] = patient.episodeNo;
body['DoctorID'] = "";
await baseAppClient.post (GET_CHIEF_COMPLAINT,
onSuccess: (dynamic response, int statusCode) {
print("Success");
patientChiefComplaintList.clear();
response['List_ChiefComplaint']['entityList'].forEach((v) {
patientChiefComplaintList.add(GetChiefComplaintResModel.fromJson(v));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
Future getPatientVitalSign(PatiantInformtion patient) async {
patientVitalSigns = null;
hasError = false;
Map<String, dynamic> body = Map();
body['PatientMRN'] = patient.patientMRN;
body['AppointmentNo'] = patient.appointmentNo;
body['EpisodeID'] = patient.episodeNo;
await baseAppClient.post(
GET_PATIENT_VITAL_SIGN_DATA,
onSuccess: (dynamic response, int statusCode) {
if(response['VitalSignsList'] != null){
if(response['VitalSignsList']['entityList'] != null && (response['VitalSignsList']['entityList'] as List).length > 0){
patientVitalSigns = VitalSignData.fromJson(response['VitalSignsList']['entityList'][0]);
}
}
},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error.toString();
},
body: body,
);
}
} }

@ -11,43 +11,8 @@ class VitalSignsService extends BaseService{
List<VitalSignResModel> patientVitalSignOrderdSubList = []; List<VitalSignResModel> patientVitalSignOrderdSubList = [];
VitalSignData patientVitalSigns; VitalSignData patientVitalSigns;
/*Future getPatientVitalSign(patient) async {
hasError = false;
await baseAppClient.post(
GET_PATIENT_VITAL_SIGN,
onSuccess: (dynamic response, int statusCode) {
patientVitalSignList = [];
response['List_DoctorPatientVitalSign'].forEach((v) {
patientVitalSignList.add(new VitalSignResModel.fromJson(v));
});
if (patientVitalSignList.length > 0) {
List<VitalSignResModel> patientVitalSignOrderdSubListTemp = [];
patientVitalSignOrderdSubListTemp = patientVitalSignList;
patientVitalSignOrderdSubListTemp
.sort((VitalSignResModel a, VitalSignResModel b) {
return b.vitalSignDate.microsecondsSinceEpoch -
a.vitalSignDate.microsecondsSinceEpoch;
});
patientVitalSignOrderdSubList.clear();
int length = patientVitalSignOrderdSubListTemp.length >= 20
? 20
: patientVitalSignOrderdSubListTemp.length;
for (int x = 0; x < length; x++) {
patientVitalSignOrderdSubList
.add(patientVitalSignOrderdSubListTemp[x]);
}
}
},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
},
body: patient,
);
} // Vit*/
Future getPatientVitalSign(PatiantInformtion patient) async { Future getPatientVitalSign(PatiantInformtion patient) async {
patientVitalSigns = null;
hasError = false; hasError = false;
Map<String, dynamic> body = Map(); Map<String, dynamic> body = Map();
body['PatientMRN'] = patient.patientMRN; body['PatientMRN'] = patient.patientMRN;

@ -1,9 +1,30 @@
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/patient-ucaf-service.dart'; import 'package:doctor_app_flutter/core/service/patient-ucaf-service.dart';
import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart';
import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintResModel.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/models/patient/vital_sign/patient-vital-sign-data.dart';
import '../../locator.dart'; import '../../locator.dart';
class UcafViewModel extends BaseViewModel { class UcafViewModel extends BaseViewModel {
UcafService _ucafService = locator<UcafService>(); UcafService _ucafService = locator<UcafService>();
List<GetChiefComplaintResModel> get patientChiefComplaintList => _ucafService.patientChiefComplaintList;
VitalSignData get patientVitalSigns => _ucafService.patientVitalSigns;
Future getUCAFData(PatiantInformtion patient) async {
setState(ViewState.Busy);
await _ucafService.getPatientVitalSign(patient);
await _ucafService.getPatientChiefComplaint(patient);
if (_ucafService.hasError) {
error = _ucafService.error;
setState(ViewState.Error);
} else {
setState(ViewState.Idle);
}
}
} }

@ -14,6 +14,7 @@ import 'package:flutter/services.dart';
import 'package:hexcolor/hexcolor.dart'; import 'package:hexcolor/hexcolor.dart';
import '../../../../routes.dart'; import '../../../../routes.dart';
import '../../../QR_reader_screen.dart';
class UCAFInputScreen extends StatefulWidget { class UCAFInputScreen extends StatefulWidget {
@override @override
@ -55,312 +56,338 @@ class _UCAFInputScreenState extends State<UCAFInputScreen> {
final screenSize = MediaQuery.of(context).size; final screenSize = MediaQuery.of(context).size;
return BaseView<UcafViewModel>( return BaseView<UcafViewModel>(
onModelReady: (model) => model.getUCAFData(patient),
builder: (_, model, w) => AppScaffold( builder: (_, model, w) => AppScaffold(
baseViewModel: model, baseViewModel: model,
appBarTitle: TranslationBase.of(context).ucaf, appBarTitle: TranslationBase.of(context).ucaf,
body: SingleChildScrollView( body: model.patientVitalSigns != null &&
child: Column( model.patientChiefComplaintList != null &&
children: [ model.patientChiefComplaintList.length > 0
PatientHeaderWidgetNoAvatar(patient), ? SingleChildScrollView(
Container(
margin: EdgeInsets.symmetric(vertical: 16, horizontal: 16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
CheckboxListTile( PatientHeaderWidgetNoAvatar(patient),
title: AppText(
TranslationBase.of(context).inPatient,
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.1,
),
value: _inPatient,
onChanged: (newValue) {
setState(() {
_inPatient = newValue;
});
},
controlAffinity: ListTileControlAffinity.leading,
contentPadding: EdgeInsets.all(0),
),
CheckboxListTile(
title: AppText(
TranslationBase.of(context).emergencyCase,
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.1,
),
value: _emergencyCase,
onChanged: (newValue) {
setState(() {
_emergencyCase = newValue;
});
},
controlAffinity: ListTileControlAffinity.leading,
contentPadding: EdgeInsets.all(0),
),
Container( Container(
height: screenSize.height * 0.070, margin:
child: TextField( EdgeInsets.symmetric(vertical: 16, horizontal: 16),
decoration: Helpers.textFieldSelectorDecoration( child: Column(
TranslationBase.of(context).durationOfIllness, crossAxisAlignment: CrossAxisAlignment.start,
null, children: [
false), CheckboxListTile(
enabled: true, title: AppText(
controller: _durationOfIllnessController, TranslationBase.of(context).inPatient,
inputFormatters: [ fontWeight: FontWeight.bold,
FilteringTextInputFormatter.allow( fontSize: SizeConfig.textMultiplier * 2.1,
RegExp(ONLY_NUMBERS))
],
keyboardType: TextInputType.number,
)),
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
AppText(
"BP (H/L)",
fontSize: SizeConfig.textMultiplier * 1.8,
color: Colors.black,
fontWeight: FontWeight.w700,
),
SizedBox(
width: 8,
),
AppText(
"120/80",
fontSize: SizeConfig.textMultiplier * 2,
color: Colors.grey.shade800,
fontWeight: FontWeight.normal,
),
],
),
Row(
children: [
AppText(
"${TranslationBase.of(context).temperature}",
fontSize: SizeConfig.textMultiplier * 1.8,
color: Colors.black,
fontWeight: FontWeight.w700,
),
SizedBox(
width: 8,
),
AppText(
"37.5(C), 98.6(F)",
fontSize: SizeConfig.textMultiplier * 2,
color: Colors.grey.shade800,
fontWeight: FontWeight.normal,
),
],
),
],
),
SizedBox(
height: 4,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
AppText(
"${TranslationBase.of(context).pulseBeats} :",
fontSize: SizeConfig.textMultiplier * 1.8,
color: Colors.black,
fontWeight: FontWeight.w700,
),
SizedBox(
width: 8,
), ),
AppText( value: _inPatient,
"80", onChanged: (newValue) {
fontSize: SizeConfig.textMultiplier * 2, setState(() {
color: Colors.grey.shade800, _inPatient = newValue;
fontWeight: FontWeight.normal, });
},
controlAffinity: ListTileControlAffinity.leading,
contentPadding: EdgeInsets.all(0),
),
CheckboxListTile(
title: AppText(
TranslationBase.of(context).emergencyCase,
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.1,
), ),
], value: _emergencyCase,
), onChanged: (newValue) {
], setState(() {
), _emergencyCase = newValue;
SizedBox( });
height: 16, },
), controlAffinity: ListTileControlAffinity.leading,
AppText( contentPadding: EdgeInsets.all(0),
TranslationBase.of(context).chiefComplaintsAndSymptoms, ),
fontWeight: FontWeight.bold, Container(
fontSize: SizeConfig.textMultiplier * 2.5, height: screenSize.height * 0.070,
), child: TextField(
SizedBox( decoration: Helpers.textFieldSelectorDecoration(
height: 8, TranslationBase.of(context)
), .durationOfIllness,
AppText( null,
TranslationBase.of(context) false),
.patientFeelsPainInHisBackAndCough, enabled: true,
fontWeight: FontWeight.normal, controller: _durationOfIllnessController,
fontSize: SizeConfig.textMultiplier * 2.0, inputFormatters: [
), FilteringTextInputFormatter.allow(
SizedBox( RegExp(ONLY_NUMBERS))
height: 8, ],
), keyboardType: TextInputType.number,
Container( )),
child: TextField( SizedBox(
decoration: Helpers.textFieldSelectorDecoration( height: 10,
TranslationBase.of(context).additionalTextComplaints, ),
null, Row(
false), mainAxisAlignment: MainAxisAlignment.spaceBetween,
enabled: true, children: [
controller: _additionalComplaintsController, Row(
keyboardType: TextInputType.text, children: [
minLines: 4, AppText(
maxLines: 6, "BP (H/L)",
)), fontSize: SizeConfig.textMultiplier * 1.8,
SizedBox( color: Colors.black,
height: 16, fontWeight: FontWeight.w700,
), ),
AppText( SizedBox(
TranslationBase.of(context).otherConditions, width: 8,
fontWeight: FontWeight.bold, ),
fontSize: SizeConfig.textMultiplier * 2.0, AppText(
), "${model.patientVitalSigns.bloodPressureHigher}/${model.patientVitalSigns.bloodPressureLower}",
...List.generate( fontSize: SizeConfig.textMultiplier * 2,
conditionsData.length, color: Colors.grey.shade800,
(index) => CheckboxListTile( fontWeight: FontWeight.normal,
title: AppText( ),
conditionsData[index]['name'], ],
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.1,
), ),
value: conditionsData[index]['isChecked'], Row(
onChanged: (newValue) { children: [
setState(() { AppText(
conditionsData[index]['isChecked'] = newValue; "${TranslationBase.of(context).temperature}",
}); fontSize: SizeConfig.textMultiplier * 1.8,
}, color: Colors.black,
controlAffinity: ListTileControlAffinity.leading, fontWeight: FontWeight.w700,
contentPadding: EdgeInsets.all(0), ),
)), SizedBox(
SizedBox( width: 8,
height: 8, ),
), AppText(
Container( "${model.patientVitalSigns.temperatureCelcius}(C), ${model.patientVitalSigns.temperatureCelcius * (9 / 5) + 32}(F)",
height: screenSize.height * 0.070, fontSize: SizeConfig.textMultiplier * 2,
child: TextField( color: Colors.grey.shade800,
decoration: Helpers.textFieldSelectorDecoration( fontWeight: FontWeight.normal,
TranslationBase.of(context).other, ),
null, ],
false), ),
enabled: true, ],
controller: _otherController, ),
keyboardType: TextInputType.text, SizedBox(
)), height: 4,
SizedBox( ),
height: 8, Row(
), mainAxisAlignment: MainAxisAlignment.spaceBetween,
Container( children: [
height: screenSize.height * 0.070, Row(
child: TextField( children: [
decoration: Helpers.textFieldSelectorDecoration( AppText(
TranslationBase.of(context).how, "${TranslationBase.of(context).pulseBeats} :",
null, fontSize: SizeConfig.textMultiplier * 1.8,
false), color: Colors.black,
enabled: true, fontWeight: FontWeight.w700,
controller: _howController, ),
keyboardType: TextInputType.text, SizedBox(
)), width: 8,
SizedBox( ),
height: 8, AppText(
), "${model.patientVitalSigns.pulseBeatPerMinute}",
Row( fontSize: SizeConfig.textMultiplier * 2,
children: [ color: Colors.grey.shade800,
Expanded( fontWeight: FontWeight.normal,
child: Container( ),
],
),
],
),
SizedBox(
height: 16,
),
AppText(
TranslationBase.of(context)
.chiefComplaintsAndSymptoms,
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.5,
),
SizedBox(
height: 8,
),
AppText(
TranslationBase.of(context)
.patientFeelsPainInHisBackAndCough,
fontWeight: FontWeight.normal,
fontSize: SizeConfig.textMultiplier * 2.0,
),
SizedBox(
height: 8,
),
Container(
child: TextField(
decoration: Helpers.textFieldSelectorDecoration(
TranslationBase.of(context)
.additionalTextComplaints,
helpers.parseHtmlString(model
.patientChiefComplaintList[0]
.chiefComplaint),
false),
enabled: false,
controller: _additionalComplaintsController,
keyboardType: TextInputType.text,
/*minLines: 4,
maxLines: 6,*/
)),
SizedBox(
height: 16,
),
AppText(
TranslationBase.of(context).otherConditions,
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.0,
),
...List.generate(
conditionsData.length,
(index) => CheckboxListTile(
title: AppText(
conditionsData[index]['name'],
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.1,
),
value: conditionsData[index]['isChecked'],
onChanged: (newValue) {
setState(() {
conditionsData[index]['isChecked'] =
newValue;
});
},
controlAffinity:
ListTileControlAffinity.leading,
contentPadding: EdgeInsets.all(0),
)),
SizedBox(
height: 8,
),
Container(
height: screenSize.height * 0.070, height: screenSize.height * 0.070,
child: TextField( child: TextField(
decoration: Helpers.textFieldSelectorDecoration( decoration: Helpers.textFieldSelectorDecoration(
TranslationBase.of(context).when, TranslationBase.of(context).other,
null, null,
false), false),
enabled: true, enabled: true,
controller: _whenController, controller: _otherController,
keyboardType: TextInputType.text, keyboardType: TextInputType.text,
)), )),
), SizedBox(
SizedBox( height: 8,
width: 4, ),
), Container(
Expanded(
child: Container(
height: screenSize.height * 0.070, height: screenSize.height * 0.070,
child: TextField( child: TextField(
decoration: Helpers.textFieldSelectorDecoration( decoration: Helpers.textFieldSelectorDecoration(
TranslationBase.of(context).where, TranslationBase.of(context).how,
null, null,
false), false),
enabled: true, enabled: true,
controller: _whereController, controller: _howController,
keyboardType: TextInputType.text, keyboardType: TextInputType.text,
)), )),
), SizedBox(
], height: 8,
), ),
SizedBox( Row(
height: 8, children: [
), Expanded(
Container( child: Container(
child: TextField( height: screenSize.height * 0.070,
decoration: Helpers.textFieldSelectorDecoration( child: TextField(
TranslationBase.of(context).specifyPossibleLineManagement, decoration:
null, Helpers.textFieldSelectorDecoration(
false), TranslationBase.of(context).when,
enabled: true, null,
controller: _managementsLineController, false),
keyboardType: TextInputType.text, enabled: true,
minLines: 4, controller: _whenController,
maxLines: 6, keyboardType: TextInputType.text,
)), )),
SizedBox( ),
height: 16, SizedBox(
), width: 4,
AppText( ),
TranslationBase.of(context) Expanded(
.significantSigns, child: Container(
fontWeight: FontWeight.bold, height: screenSize.height * 0.070,
fontSize: SizeConfig.textMultiplier * 2.0, child: TextField(
), decoration:
SizedBox( Helpers.textFieldSelectorDecoration(
height: 8, TranslationBase.of(context).where,
), null,
Container( false),
child: TextField( enabled: true,
decoration: Helpers.textFieldSelectorDecoration( controller: _whereController,
TranslationBase.of(context).backAbdomen, keyboardType: TextInputType.text,
null, )),
false), ),
enabled: true, ],
controller: _signsController, ),
keyboardType: TextInputType.text, SizedBox(
minLines: 4, height: 8,
maxLines: 6, ),
)), Container(
SizedBox( child: TextField(
height: 16, decoration: Helpers.textFieldSelectorDecoration(
), TranslationBase.of(context)
AppButton( .specifyPossibleLineManagement,
title: TranslationBase.of(context).next, null,
color: HexColor("#B8382B"), false),
onPressed: (){ enabled: true,
Navigator.of(context).pushNamed(PATIENT_UCAF_DETAIL, arguments: {'patient': patient}); controller: _managementsLineController,
}, keyboardType: TextInputType.text,
minLines: 4,
maxLines: 6,
)),
SizedBox(
height: 16,
),
AppText(
TranslationBase.of(context).significantSigns,
fontWeight: FontWeight.bold,
fontSize: SizeConfig.textMultiplier * 2.0,
),
SizedBox(
height: 8,
),
Container(
child: TextField(
decoration: Helpers.textFieldSelectorDecoration(
TranslationBase.of(context).backAbdomen,
null,
false),
enabled: true,
controller: _signsController,
keyboardType: TextInputType.text,
)),
SizedBox(
height: 16,
),
AppButton(
title: TranslationBase.of(context).next,
color: HexColor("#B8382B"),
onPressed: () {
Navigator.of(context).pushNamed(
PATIENT_UCAF_DETAIL,
arguments: {'patient': patient});
},
),
],
),
), ),
], ],
), ),
)
: Container(
child: Center(
child: AppText(
model.patientVitalSigns == null
? TranslationBase.of(context).vitalSignEmptyMsg
: TranslationBase.of(context).chiefComplaintEmptyMsg,
fontWeight: FontWeight.normal,
color: HexColor("#B8382B"),
fontSize: SizeConfig.textMultiplier * 2.5,
),
),
), ),
],
),
),
), ),
); );
} }

@ -548,6 +548,7 @@ class TranslationBase {
String get covered => localizedValues['covered'][locale.languageCode]; String get covered => localizedValues['covered'][locale.languageCode];
String get approvalRequired => localizedValues['approvalRequired'][locale.languageCode]; String get approvalRequired => localizedValues['approvalRequired'][locale.languageCode];
String get uncoveredByDoctor => localizedValues['uncoveredByDoctor'][locale.languageCode]; String get uncoveredByDoctor => localizedValues['uncoveredByDoctor'][locale.languageCode];
String get chiefComplaintEmptyMsg => localizedValues['chiefComplaintEmptyMsg'][locale.languageCode];
} }
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> { class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -503,7 +503,7 @@ packages:
name: meta name: meta
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0-nullsafety.4" version: "1.3.0-nullsafety.3"
mime: mime:
dependency: transitive dependency: transitive
description: description:
@ -760,7 +760,7 @@ packages:
name: stack_trace name: stack_trace
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0-nullsafety.2" version: "1.10.0-nullsafety.1"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
@ -895,5 +895,5 @@ packages:
source: hosted source: hosted
version: "2.2.1" version: "2.2.1"
sdks: sdks:
dart: ">=2.10.0 <=2.11.0-213.1.beta" dart: ">=2.10.0 <2.11.0"
flutter: ">=1.22.0 <2.0.0" flutter: ">=1.22.0 <2.0.0"

Loading…
Cancel
Save