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

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

@ -103,22 +103,23 @@ class IncidentDetailPage extends StatelessWidget {
'Incident Title: ${incidentData.incidentTitle ?? "-"}'.bodyText(context),
'Incident Description: ${incidentData.incidentDescription ?? "-"}'.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),
'Building: ${incidentData.buildingName ?? "-"}'.bodyText(context),
'Floor: ${incidentData.floorName ?? "-"}'.bodyText(context),
'Department: ${incidentData.departmentName ?? "-"}'.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),
if (incidentData.rootCauseValue == 5) 'Root reason: ${incidentData.otherRootCause ?? "-"}'.bodyText(context),
'Comments: ${incidentData.comments ?? "-"}'.bodyText(context),

@ -136,9 +136,9 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
'Requested Quantity: ${data.qty ?? '-'}'.bodyText(context),
],
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,
'What is the current practice?: ${data.currentPractise ?? '-'}'.bodyText(context),
'What is the current practice?:\n${data.currentPractise ?? '-'}'.bodyText(context),
4.height,
'Census Q1: ${data.censusQ1 ?? '-'}'.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/widget_extensions.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/views/app_style/sizing.dart';
@ -17,9 +19,9 @@ import '../../../new_views/app_style/app_text_style.dart';
class WoAutoCompleteField extends StatefulWidget {
final String initialValue;
final num? assetId;
final int? assetId;
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);
@ -28,7 +30,7 @@ class WoAutoCompleteField extends StatefulWidget {
}
class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
late OracleCodeProvider _oracleCodeProvider;
late CMDetailProvider _cmDetailProvider;
late TextEditingController _controller;
@ -38,7 +40,7 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
void initState() {
_controller = TextEditingController(text: widget.initialValue);
super.initState();
_oracleCodeProvider = Provider.of<OracleCodeProvider>(context, listen: false);
_cmDetailProvider = Provider.of<CMDetailProvider>(context, listen: false);
}
@override
@ -64,7 +66,7 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
child: Autocomplete<AssetNDAutoCompleteByDynamicCodesModel>(
child: Autocomplete<WoByAssetIdModel>(
optionsBuilder: (TextEditingValue textEditingValue) async {
if (textEditingValue.text.isEmpty) {
if (loading) {
@ -72,20 +74,21 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
loading = false;
});
}
return const Iterable<AssetNDAutoCompleteByDynamicCodesModel>.empty();
return const Iterable<WoByAssetIdModel>.empty();
}
if (!loading) {
setState(() {
loading = true;
});
}
List<AssetNDAutoCompleteByDynamicCodesModel> workOrders = (await _oracleCodeProvider.getAssetByOracleCode(textEditingValue.text));
List<WoByAssetIdModel> workOrders = (await _cmDetailProvider.getWorkOrderByAssetId(textEditingValue.text, widget.assetId!));
setState(() {
loading = false;
});
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) {
return TextField(
controller: _controller,
@ -106,7 +109,7 @@ class _WoAutoCompleteFieldState extends State<WoAutoCompleteField> {
fillColor: AppColor.fieldBgColor(context),
errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
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)),
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) {
_controller.clear();
} else {
_controller.text = widget.byName ? (selection.displayName ?? "") : (selection.codeValue ?? "");
_controller.text = widget.byName ? (selection.workOrderNo ?? "") : (selection.workOrderNo ?? "");
}
widget.onPick(selection);
},

Loading…
Cancel
Save