incident module cm work order integrated & improvements.

ui_ux_rollout_merge_audio_video_call
Sikander Saleem 4 weeks ago
parent 417f46d5e7
commit 78e9042bbb

@ -159,6 +159,7 @@ class URLs {
static get assignEngineerToWorkOrderUrl => '$_baseUrl/ServiceRequest/AssignEngineerToWorkOrder'; static get assignEngineerToWorkOrderUrl => '$_baseUrl/ServiceRequest/AssignEngineerToWorkOrder';
static get uploadWorkOrderAttachmentsUrl => '$_baseUrl/ServiceRequest/UploadAttachmentsWorkOrder'; static get uploadWorkOrderAttachmentsUrl => '$_baseUrl/ServiceRequest/UploadAttachmentsWorkOrder';
static get workOrderByAssetIdAutoComplete => '$_baseUrl/ServiceRequest/WorkOrderByAssetIdAutoComplete';
static get getArrivalVerificationTypeUrl => '$_baseUrl/ArrivalVerificationType/GetArrivalVerificationType'; static get getArrivalVerificationTypeUrl => '$_baseUrl/ArrivalVerificationType/GetArrivalVerificationType';

@ -0,0 +1,11 @@
class WoByAssetIdModel {
int? id;
String? workOrderNo;
WoByAssetIdModel({this.id, this.workOrderNo});
WoByAssetIdModel.fromJson(dynamic json) {
id = json['id'];
workOrderNo = json['workOrderNo'];
}
}

@ -17,6 +17,7 @@ import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/spare_parts.dart';
import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/models/wo_by_asset_id_model.dart';
import 'cm_request_utils.dart'; import 'cm_request_utils.dart';
@ -1003,4 +1004,19 @@ class CMDetailProvider extends ChangeNotifier {
return -1; return -1;
} }
} }
Future<List<WoByAssetIdModel>> getWorkOrderByAssetId(String searchText, int assetId) async {
late Response response;
try {
response = await ApiManager.instance.post(URLs.workOrderByAssetIdAutoComplete, body: {"pageSize": 1, "pageNumber": 20, "search": searchText, "assetId": assetId});
List<WoByAssetIdModel> woList = [];
if (response.statusCode >= 200 && response.statusCode < 300) {
List categoriesListJson = json.decode(response.body)["data"];
woList = categoriesListJson.map((wo) => WoByAssetIdModel.fromJson(wo)).toList();
}
return woList;
} catch (error) {
return [];
}
}
} }

@ -16,6 +16,7 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/models/wo_by_asset_id_model.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/incident_module/incident_lookup_provider.dart'; import 'package:test_sa/modules/incident_module/incident_lookup_provider.dart';
@ -65,6 +66,7 @@ class _CreateIncidentRequestPageState extends State<CreateIncidentRequestPage> {
Department? _selectedDepartment; Department? _selectedDepartment;
Asset? device; Asset? device;
WoByAssetIdModel? woByAssetId;
Lookup? incidentType; Lookup? incidentType;
Lookup? ovrSystem; Lookup? ovrSystem;
@ -127,10 +129,10 @@ class _CreateIncidentRequestPageState extends State<CreateIncidentRequestPage> {
borderColor: AppColor.black20, borderColor: AppColor.black20,
onPick: (asset) async { onPick: (asset) async {
device = asset; device = asset;
payload["assetId"] = asset.modelDefinition?.id; payload["assetId"] = asset?.id;
payload["oracleCode"] = asset.modelDefinition?.oracleCodes?.first.codeValue; payload["oracleCode"] = asset.modelDefinition?.oracleCodes?.first.codeValue;
payload["model"] = asset.modelDefinition?.modelName; payload["model"] = asset.modelDefinition?.modelName;
payload["manufacturer"] = asset.modelDefinition?.manufacturerId; payload["manufacturer"] = asset.modelDefinition?.manufacturerName;
payload["assetOrigin"] = asset.modelDefinition?.assetName; payload["assetOrigin"] = asset.modelDefinition?.assetName;
payload["siteId"] = asset.site?.id; payload["siteId"] = asset.site?.id;
payload["buildingId"] = asset.building?.id; payload["buildingId"] = asset.building?.id;
@ -144,11 +146,11 @@ class _CreateIncidentRequestPageState extends State<CreateIncidentRequestPage> {
clearAfterPick: false, clearAfterPick: false,
byName: true, byName: true,
enabled: device != null, enabled: device != null,
assetId: device?.id?.toInt(),
initialValue: "", initialValue: "",
onPick: (asset) { onPick: (asset) {
// trafRequest?.assetNDId = asset.id; woByAssetId = asset;
// model.partCatalogItem = PartCatalogItem(id: part.sparePart?.id, partNumber: part.sparePart?.partNo, partName: part.sparePart?.partName, oracleCode: part.sparePart?.oracleCode); setState(() {});
// setState(() {});
}, },
), ),
], ],
@ -369,6 +371,7 @@ class _CreateIncidentRequestPageState extends State<CreateIncidentRequestPage> {
onSelect: (value) { onSelect: (value) {
incidentType = value; incidentType = value;
payload["incidentClassificationId"] = value?.id; payload["incidentClassificationId"] = value?.id;
payload["workOrderId"] = null;
setState(() {}); setState(() {});
}, },
), ),
@ -690,17 +693,19 @@ class _CreateIncidentRequestPageState extends State<CreateIncidentRequestPage> {
"Please scan or pick asset".showToast; "Please scan or pick asset".showToast;
return; return;
} }
if (incidentType?.value == 1 && device != null && woByAssetId?.id == null) {
"Please choose CM Work Order".showToast;
return;
}
if (ovrSystem?.value == 1 && isOvrVerified == false) { if (ovrSystem?.value == 1 && isOvrVerified == false) {
"Please verify OVR Ticket Number".showToast; "Please verify OVR Ticket Number".showToast;
return; return;
} }
if (occurrenceDate == null) { if (occurrenceDate == null) {
"Please select occurrence Data".showToast; "Please select occurrence Data".showToast;
return; return;
} }
payload["workOrderId"] = woByAssetId?.id;
payload["occurrenceDate"] = occurrenceDate!.toIso8601String(); payload["occurrenceDate"] = occurrenceDate!.toIso8601String();
_formKey.currentState!.save(); _formKey.currentState!.save();

@ -74,6 +74,8 @@ class IncidentDataModel {
String? occurrenceDate; String? occurrenceDate;
String? createdDate; String? createdDate;
List<IncidentAttachments>? incidentAttachments; List<IncidentAttachments>? incidentAttachments;
int? workOrderId;
String? workOrderNo;
IncidentDataModel( IncidentDataModel(
{this.id, {this.id,
@ -148,6 +150,8 @@ class IncidentDataModel {
this.approvalSignature, this.approvalSignature,
this.occurrenceDate, this.occurrenceDate,
this.createdDate, this.createdDate,
this.workOrderId,
this.workOrderNo,
this.incidentAttachments}); this.incidentAttachments});
IncidentDataModel.fromJson(Map<String, dynamic> json) { IncidentDataModel.fromJson(Map<String, dynamic> json) {
@ -223,6 +227,8 @@ class IncidentDataModel {
approvalSignature = json['approvalSignature']; approvalSignature = json['approvalSignature'];
occurrenceDate = json['occurrenceDate']; occurrenceDate = json['occurrenceDate'];
createdDate = json['createdDate']; createdDate = json['createdDate'];
workOrderId = json['workOrderId'];
workOrderNo = json['workOrderNo'];
if (json['incidentAttachments'] != null) { if (json['incidentAttachments'] != null) {
incidentAttachments = <IncidentAttachments>[]; incidentAttachments = <IncidentAttachments>[];
json['incidentAttachments'].forEach((v) { json['incidentAttachments'].forEach((v) {
@ -305,6 +311,8 @@ class IncidentDataModel {
data['approvalSignature'] = this.approvalSignature; data['approvalSignature'] = this.approvalSignature;
data['occurrenceDate'] = this.occurrenceDate; data['occurrenceDate'] = this.occurrenceDate;
data['createdDate'] = this.createdDate; data['createdDate'] = this.createdDate;
data['workOrderId'] = this.workOrderId;
data['workOrderNo'] = this.workOrderNo;
if (this.incidentAttachments != null) { if (this.incidentAttachments != null) {
data['incidentAttachments'] = this.incidentAttachments!.map((v) => v.toJson()).toList(); data['incidentAttachments'] = this.incidentAttachments!.map((v) => v.toJson()).toList();
} }

@ -103,22 +103,23 @@ class IncidentDetailPage extends StatelessWidget {
'Incident Title: ${incidentData.incidentTitle ?? "-"}'.bodyText(context), 'Incident Title: ${incidentData.incidentTitle ?? "-"}'.bodyText(context),
'Incident Description: ${incidentData.incidentDescription ?? "-"}'.bodyText(context), 'Incident Description: ${incidentData.incidentDescription ?? "-"}'.bodyText(context),
'Exist OVR: ${incidentData.existingOvrTicketName ?? "-"}'.bodyText(context), 'Exist OVR: ${incidentData.existingOvrTicketName ?? "-"}'.bodyText(context),
RichText(
text: TextSpan(text: "CM WorkOrder: ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), children: [
TextSpan(
text: "Privacy Policy",
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline),
recognizer: TapGestureRecognizer()
..onTap = () async {
await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: incidentData.id!, moduleId: 3)));
}),
]),
),
'Site: ${incidentData.siteName ?? "-"}'.bodyText(context), 'Site: ${incidentData.siteName ?? "-"}'.bodyText(context),
'Building: ${incidentData.buildingName ?? "-"}'.bodyText(context), 'Building: ${incidentData.buildingName ?? "-"}'.bodyText(context),
'Floor: ${incidentData.floorName ?? "-"}'.bodyText(context), 'Floor: ${incidentData.floorName ?? "-"}'.bodyText(context),
'Department: ${incidentData.departmentName ?? "-"}'.bodyText(context), 'Department: ${incidentData.departmentName ?? "-"}'.bodyText(context),
'Occurrence Date: ${incidentData.occurrenceDate?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context), 'Occurrence Date: ${incidentData.occurrenceDate?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context),
if (incidentData.workOrderId != null)
RichText(
text: TextSpan(text: "Work Order: ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), children: [
TextSpan(
text: "${incidentData.workOrderNo}",
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline),
recognizer: TapGestureRecognizer()
..onTap = () async {
await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: incidentData.workOrderId!, moduleId: 3)));
}),
]),
),
'Root Cause: ${incidentData.rootCauseName ?? "-"}'.bodyText(context), 'Root Cause: ${incidentData.rootCauseName ?? "-"}'.bodyText(context),
if (incidentData.rootCauseValue == 5) 'Root reason: ${incidentData.otherRootCause ?? "-"}'.bodyText(context), if (incidentData.rootCauseValue == 5) 'Root reason: ${incidentData.otherRootCause ?? "-"}'.bodyText(context),
'Comments: ${incidentData.comments ?? "-"}'.bodyText(context), 'Comments: ${incidentData.comments ?? "-"}'.bodyText(context),

@ -136,9 +136,9 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
'Requested Quantity: ${data.qty ?? '-'}'.bodyText(context), 'Requested Quantity: ${data.qty ?? '-'}'.bodyText(context),
], ],
4.height, 4.height,
'How would the requested technology solve the current situation and/or serve the purpose?: ${data.purposeAnswer ?? '-'}'.bodyText(context), 'How would the requested technology solve the current situation and/or serve the purpose?:\n${data.purposeAnswer ?? '-'}'.bodyText(context),
4.height, 4.height,
'What is the current practice?: ${data.currentPractise ?? '-'}'.bodyText(context), 'What is the current practice?:\n${data.currentPractise ?? '-'}'.bodyText(context),
4.height, 4.height,
'Census Q1: ${data.censusQ1 ?? '-'}'.bodyText(context), 'Census Q1: ${data.censusQ1 ?? '-'}'.bodyText(context),
'Census Q2: ${data.censusQ2 ?? '-'}'.bodyText(context), 'Census Q2: ${data.censusQ2 ?? '-'}'.bodyText(context),

@ -8,6 +8,8 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart';
import 'package:test_sa/models/wo_by_asset_id_model.dart';
import 'package:test_sa/modules/cm_module/cm_detail_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@ -17,9 +19,9 @@ import '../../../new_views/app_style/app_text_style.dart';
class WoAutoCompleteField extends StatefulWidget { class WoAutoCompleteField extends StatefulWidget {
final String initialValue; final String initialValue;
final num? assetId; final int? assetId;
final bool clearAfterPick, byName, enabled; final bool clearAfterPick, byName, enabled;
final Function(AssetNDAutoCompleteByDynamicCodesModel) onPick; final Function(WoByAssetIdModel) onPick;
const WoAutoCompleteField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true, this.enabled = true}) : super(key: key); const WoAutoCompleteField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true, this.enabled = true}) : super(key: key);
@ -28,7 +30,7 @@ class WoAutoCompleteField extends StatefulWidget {
} }
class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> { class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
late OracleCodeProvider _oracleCodeProvider; late CMDetailProvider _cmDetailProvider;
late TextEditingController _controller; late TextEditingController _controller;
@ -38,7 +40,7 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
void initState() { void initState() {
_controller = TextEditingController(text: widget.initialValue); _controller = TextEditingController(text: widget.initialValue);
super.initState(); super.initState();
_oracleCodeProvider = Provider.of<OracleCodeProvider>(context, listen: false); _cmDetailProvider = Provider.of<CMDetailProvider>(context, listen: false);
} }
@override @override
@ -64,7 +66,7 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
), ),
child: Autocomplete<AssetNDAutoCompleteByDynamicCodesModel>( child: Autocomplete<WoByAssetIdModel>(
optionsBuilder: (TextEditingValue textEditingValue) async { optionsBuilder: (TextEditingValue textEditingValue) async {
if (textEditingValue.text.isEmpty) { if (textEditingValue.text.isEmpty) {
if (loading) { if (loading) {
@ -72,20 +74,21 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
loading = false; loading = false;
}); });
} }
return const Iterable<AssetNDAutoCompleteByDynamicCodesModel>.empty(); return const Iterable<WoByAssetIdModel>.empty();
} }
if (!loading) { if (!loading) {
setState(() { setState(() {
loading = true; loading = true;
}); });
} }
List<AssetNDAutoCompleteByDynamicCodesModel> workOrders = (await _oracleCodeProvider.getAssetByOracleCode(textEditingValue.text)); List<WoByAssetIdModel> workOrders = (await _cmDetailProvider.getWorkOrderByAssetId(textEditingValue.text, widget.assetId!));
setState(() { setState(() {
loading = false; loading = false;
}); });
return workOrders; return workOrders;
}, },
displayStringForOption: (AssetNDAutoCompleteByDynamicCodesModel option) => widget.byName ? option.displayName ?? "" : option.codeValue ?? "", displayStringForOption: (WoByAssetIdModel option) => widget.byName ? option.workOrderNo ?? "" : option.workOrderNo ?? "",
fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) {
return TextField( return TextField(
controller: _controller, controller: _controller,
@ -106,7 +109,7 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
fillColor: AppColor.fieldBgColor(context), fillColor: AppColor.fieldBgColor(context),
errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
labelText: "Name/Oracle Code", labelText: "CM Work Order Number",
labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)),
suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null, suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null,
), ),
@ -119,11 +122,11 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
}, },
); );
}, },
onSelected: (AssetNDAutoCompleteByDynamicCodesModel selection) { onSelected: (WoByAssetIdModel selection) {
if (widget.clearAfterPick) { if (widget.clearAfterPick) {
_controller.clear(); _controller.clear();
} else { } else {
_controller.text = widget.byName ? (selection.displayName ?? "") : (selection.codeValue ?? ""); _controller.text = widget.byName ? (selection.workOrderNo ?? "") : (selection.workOrderNo ?? "");
} }
widget.onPick(selection); widget.onPick(selection);
}, },

Loading…
Cancel
Save