一次大的提交
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:maibu_satabot_v2/core/error/failure.dart';
|
||||
import 'package:maibu_satabot_v2/features/v2/work_order/data/models/work_order_model.dart';
|
||||
|
||||
abstract class WorkOrderRemoteDataSource {
|
||||
Future<Either<Failure, List<WorkOrderModel>>> getWorkOrderList(
|
||||
Map<String, dynamic> params,
|
||||
);
|
||||
|
||||
Future<Either<Failure, WorkOrderModel>> getWorkOrderDetail(int id);
|
||||
|
||||
Future<Either<Failure, bool>> dispatchWorkOrder(Map<String, dynamic> params);
|
||||
|
||||
Future<Either<Failure, bool>> suspendWorkOrder(int id);
|
||||
|
||||
Future<Either<Failure, bool>> completeWorkOrder(Map<String, dynamic> params);
|
||||
|
||||
Future<Either<Failure, bool>> startWorkOrder(Map<String, dynamic> params);
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:http_parser/http_parser.dart';
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:maibu_satabot_v2/core/consts/http_api_consts.dart';
|
||||
import 'package:maibu_satabot_v2/core/error/failure.dart';
|
||||
import 'package:maibu_satabot_v2/features/v2/work_order/data/models/work_order_model.dart';
|
||||
import 'package:maibu_satabot_v2/features/v2/work_order/data/datasources/work_order_remote_datasource.dart';
|
||||
|
||||
class WorkOrderRemoteDataSourceImpl implements WorkOrderRemoteDataSource {
|
||||
WorkOrderRemoteDataSourceImpl(this._dio);
|
||||
|
||||
final Dio _dio;
|
||||
|
||||
@override
|
||||
Future<Either<Failure, List<WorkOrderModel>>> getWorkOrderList(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
HttpApiConsts.workOrderList,
|
||||
queryParameters: params,
|
||||
);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final data = response.data as Map<String, dynamic>;
|
||||
final code = data['code'];
|
||||
if (code != null && code.toString() == '200') {
|
||||
final rows = data['rows'] as List<dynamic>? ?? [];
|
||||
final list = rows
|
||||
.map(
|
||||
(item) => WorkOrderModel.fromJson(item as Map<String, dynamic>),
|
||||
)
|
||||
.toList();
|
||||
list.sort((a, b) {
|
||||
final timeA = a.planStartTime ?? '';
|
||||
final timeB = b.planStartTime ?? '';
|
||||
return timeA.compareTo(timeB);
|
||||
});
|
||||
return right(list);
|
||||
} else {
|
||||
return left(Failure(data['msg'] ?? '获取工单列表失败'));
|
||||
}
|
||||
} else {
|
||||
return left(Failure('HTTP错误: ${response.statusCode}'));
|
||||
}
|
||||
} catch (e) {
|
||||
return left(Failure('获取工单列表异常: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, WorkOrderModel>> getWorkOrderDetail(int id) async {
|
||||
try {
|
||||
final response = await _dio.get('${HttpApiConsts.workOrderDetail}/$id');
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final data = response.data as Map<String, dynamic>;
|
||||
final code = data['code'];
|
||||
if (code != null && code.toString() == '200') {
|
||||
final result = data['result'] as Map<String, dynamic>? ?? {};
|
||||
return right(WorkOrderModel.fromJson(result));
|
||||
} else {
|
||||
return left(Failure(data['msg'] ?? '获取工单详情失败'));
|
||||
}
|
||||
} else {
|
||||
return left(Failure('HTTP错误: ${response.statusCode}'));
|
||||
}
|
||||
} catch (e) {
|
||||
return left(Failure('获取工单详情异常: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> dispatchWorkOrder(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
try {
|
||||
final response = await _dio.put(
|
||||
HttpApiConsts.workOrderDispat,
|
||||
data: params,
|
||||
);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final data = response.data as Map<String, dynamic>;
|
||||
final code = data['code'];
|
||||
if (code != null && code.toString() == '200') {
|
||||
return right(true);
|
||||
} else {
|
||||
return left(Failure(data['msg'] ?? '派发工单失败'));
|
||||
}
|
||||
} else {
|
||||
return left(Failure('HTTP错误: ${response.statusCode}'));
|
||||
}
|
||||
} catch (e) {
|
||||
return left(Failure('派发工单异常: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> suspendWorkOrder(int id) async {
|
||||
try {
|
||||
final response = await _dio.post('${HttpApiConsts.workOrderSuspend}/$id');
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final data = response.data as Map<String, dynamic>;
|
||||
final code = data['code'];
|
||||
if (code != null && code.toString() == '200') {
|
||||
return right(true);
|
||||
} else {
|
||||
return left(Failure(data['msg'] ?? '挂起工单失败'));
|
||||
}
|
||||
} else {
|
||||
return left(Failure('HTTP错误: ${response.statusCode}'));
|
||||
}
|
||||
} catch (e) {
|
||||
return left(Failure('挂起工单异常: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> completeWorkOrder(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
try {
|
||||
final formData = FormData.fromMap({
|
||||
'workOrder': MultipartFile.fromString(
|
||||
jsonEncode(params),
|
||||
contentType: MediaType.parse('application/json'),
|
||||
),
|
||||
});
|
||||
final response = await _dio.post(
|
||||
HttpApiConsts.workOrderComplete,
|
||||
data: formData,
|
||||
);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final data = response.data as Map<String, dynamic>;
|
||||
final code = data['code'];
|
||||
if (code != null && code.toString() == '200') {
|
||||
return right(true);
|
||||
} else {
|
||||
return left(Failure(data['msg'] ?? '完成工单失败'));
|
||||
}
|
||||
} else {
|
||||
return left(Failure('HTTP错误: ${response.statusCode}'));
|
||||
}
|
||||
} catch (e) {
|
||||
return left(Failure('完成工单异常: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> startWorkOrder(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
try {
|
||||
final response = await _dio.post(
|
||||
HttpApiConsts.workOrderStart,
|
||||
data: params,
|
||||
);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final data = response.data as Map<String, dynamic>;
|
||||
final code = data['code'];
|
||||
if (code != null && code.toString() == '200') {
|
||||
return right(true);
|
||||
} else {
|
||||
return left(Failure(data['msg'] ?? '开始执行工单失败'));
|
||||
}
|
||||
} else {
|
||||
return left(Failure('HTTP错误: ${response.statusCode}'));
|
||||
}
|
||||
} catch (e) {
|
||||
return left(Failure('开始执行工单异常: $e'));
|
||||
}
|
||||
}
|
||||
}
|
||||
207
lib/features/v2/work_order/data/models/work_order_model.dart
Normal file
207
lib/features/v2/work_order/data/models/work_order_model.dart
Normal file
@@ -0,0 +1,207 @@
|
||||
import 'package:maibu_satabot_v2/features/v2/work_order/domain/entities/work_order_entity.dart';
|
||||
|
||||
class WorkOrderModel {
|
||||
final int? id;
|
||||
final String? orderNo;
|
||||
final String? orderTitle;
|
||||
final int? sourceType;
|
||||
final int? orderType;
|
||||
final int? priorityLevel;
|
||||
final int? deviceId;
|
||||
final String? deviceName;
|
||||
final int? deviceType;
|
||||
final int? siteId;
|
||||
final String? siteName;
|
||||
final int? orgId;
|
||||
final int? assigneeId;
|
||||
final String? assigneeName;
|
||||
final String? collaboratorIds;
|
||||
final String? collaboratorNames;
|
||||
final String? planStartTime;
|
||||
final String? planEndTime;
|
||||
final String? deadlineTime;
|
||||
final String? actualStartTime;
|
||||
final String? actualEndTime;
|
||||
final int? orderStatus;
|
||||
final int? alarmId;
|
||||
final String? alarmNo;
|
||||
final String? taskDescription;
|
||||
final String? aiSuggestion;
|
||||
final String? requiredEquipment;
|
||||
final double? estimatedImpact;
|
||||
final String? handleResult;
|
||||
final String? handleRemark;
|
||||
|
||||
WorkOrderModel({
|
||||
this.id,
|
||||
this.orderNo,
|
||||
this.orderTitle,
|
||||
this.sourceType,
|
||||
this.orderType,
|
||||
this.priorityLevel,
|
||||
this.deviceId,
|
||||
this.deviceName,
|
||||
this.deviceType,
|
||||
this.siteId,
|
||||
this.siteName,
|
||||
this.orgId,
|
||||
this.assigneeId,
|
||||
this.assigneeName,
|
||||
this.collaboratorIds,
|
||||
this.collaboratorNames,
|
||||
this.planStartTime,
|
||||
this.planEndTime,
|
||||
this.deadlineTime,
|
||||
this.actualStartTime,
|
||||
this.actualEndTime,
|
||||
this.orderStatus,
|
||||
this.alarmId,
|
||||
this.alarmNo,
|
||||
this.taskDescription,
|
||||
this.aiSuggestion,
|
||||
this.requiredEquipment,
|
||||
this.estimatedImpact,
|
||||
this.handleResult,
|
||||
this.handleRemark,
|
||||
});
|
||||
|
||||
factory WorkOrderModel.fromJson(Map<String, dynamic> json) {
|
||||
return WorkOrderModel(
|
||||
id: json['id'] as int?,
|
||||
orderNo: json['orderNo'] as String?,
|
||||
orderTitle: json['orderTitle'] as String?,
|
||||
sourceType: json['sourceType'] as int?,
|
||||
orderType: json['orderType'] as int?,
|
||||
priorityLevel: json['priorityLevel'] as int?,
|
||||
deviceId: json['deviceId'] as int?,
|
||||
deviceName: json['deviceName'] as String?,
|
||||
deviceType: json['deviceType'] as int?,
|
||||
siteId: json['siteId'] as int?,
|
||||
siteName: json['siteName'] as String?,
|
||||
orgId: json['orgId'] as int?,
|
||||
assigneeId: json['assigneeId'] as int?,
|
||||
assigneeName: json['assigneeName'] as String?,
|
||||
collaboratorIds: json['collaboratorIds'] as String?,
|
||||
collaboratorNames: json['collaboratorNames'] as String?,
|
||||
planStartTime: json['planStartTime'] as String?,
|
||||
planEndTime: json['planEndTime'] as String?,
|
||||
deadlineTime: json['deadlineTime'] as String?,
|
||||
actualStartTime: json['actualStartTime'] as String?,
|
||||
actualEndTime: json['actualEndTime'] as String?,
|
||||
orderStatus: json['orderStatus'] as int?,
|
||||
alarmId: json['alarmId'] as int?,
|
||||
alarmNo: json['alarmNo'] as String?,
|
||||
taskDescription: json['taskDescription'] as String?,
|
||||
aiSuggestion: json['aiSuggestion'] as String?,
|
||||
requiredEquipment: json['requiredEquipment'] as String?,
|
||||
estimatedImpact: json['estimatedImpact'] as double?,
|
||||
handleResult: json['handleResult'] as String?,
|
||||
handleRemark: json['handleRemark'] as String?,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': id,
|
||||
'orderNo': orderNo,
|
||||
'orderTitle': orderTitle,
|
||||
'sourceType': sourceType,
|
||||
'orderType': orderType,
|
||||
'priorityLevel': priorityLevel,
|
||||
'deviceId': deviceId,
|
||||
'deviceName': deviceName,
|
||||
'deviceType': deviceType,
|
||||
'siteId': siteId,
|
||||
'siteName': siteName,
|
||||
'orgId': orgId,
|
||||
'assigneeId': assigneeId,
|
||||
'assigneeName': assigneeName,
|
||||
'collaboratorIds': collaboratorIds,
|
||||
'collaboratorNames': collaboratorNames,
|
||||
'planStartTime': planStartTime,
|
||||
'planEndTime': planEndTime,
|
||||
'deadlineTime': deadlineTime,
|
||||
'actualStartTime': actualStartTime,
|
||||
'actualEndTime': actualEndTime,
|
||||
'orderStatus': orderStatus,
|
||||
'alarmId': alarmId,
|
||||
'alarmNo': alarmNo,
|
||||
'taskDescription': taskDescription,
|
||||
'aiSuggestion': aiSuggestion,
|
||||
'requiredEquipment': requiredEquipment,
|
||||
'estimatedImpact': estimatedImpact,
|
||||
'handleResult': handleResult,
|
||||
'handleRemark': handleRemark,
|
||||
};
|
||||
}
|
||||
|
||||
WorkOrderEntity toEntity() {
|
||||
return WorkOrderEntity(
|
||||
id: id,
|
||||
orderNo: orderNo,
|
||||
orderTitle: orderTitle,
|
||||
sourceType: sourceType,
|
||||
orderType: orderType,
|
||||
priorityLevel: priorityLevel,
|
||||
deviceId: deviceId,
|
||||
deviceName: deviceName,
|
||||
deviceType: deviceType,
|
||||
siteId: siteId,
|
||||
siteName: siteName,
|
||||
orgId: orgId,
|
||||
assigneeId: assigneeId,
|
||||
assigneeName: assigneeName,
|
||||
collaboratorIds: collaboratorIds,
|
||||
collaboratorNames: collaboratorNames,
|
||||
planStartTime: planStartTime,
|
||||
planEndTime: planEndTime,
|
||||
deadlineTime: deadlineTime,
|
||||
actualStartTime: actualStartTime,
|
||||
actualEndTime: actualEndTime,
|
||||
orderStatus: orderStatus,
|
||||
alarmId: alarmId,
|
||||
alarmNo: alarmNo,
|
||||
taskDescription: taskDescription,
|
||||
aiSuggestion: aiSuggestion,
|
||||
requiredEquipment: requiredEquipment,
|
||||
estimatedImpact: estimatedImpact,
|
||||
handleResult: handleResult,
|
||||
handleRemark: handleRemark,
|
||||
);
|
||||
}
|
||||
|
||||
factory WorkOrderModel.fromEntity(WorkOrderEntity entity) {
|
||||
return WorkOrderModel(
|
||||
id: entity.id,
|
||||
orderNo: entity.orderNo,
|
||||
orderTitle: entity.orderTitle,
|
||||
sourceType: entity.sourceType,
|
||||
orderType: entity.orderType,
|
||||
priorityLevel: entity.priorityLevel,
|
||||
deviceId: entity.deviceId,
|
||||
deviceName: entity.deviceName,
|
||||
deviceType: entity.deviceType,
|
||||
siteId: entity.siteId,
|
||||
siteName: entity.siteName,
|
||||
orgId: entity.orgId,
|
||||
assigneeId: entity.assigneeId,
|
||||
assigneeName: entity.assigneeName,
|
||||
collaboratorIds: entity.collaboratorIds,
|
||||
collaboratorNames: entity.collaboratorNames,
|
||||
planStartTime: entity.planStartTime,
|
||||
planEndTime: entity.planEndTime,
|
||||
deadlineTime: entity.deadlineTime,
|
||||
actualStartTime: entity.actualStartTime,
|
||||
actualEndTime: entity.actualEndTime,
|
||||
orderStatus: entity.orderStatus,
|
||||
alarmId: entity.alarmId,
|
||||
alarmNo: entity.alarmNo,
|
||||
taskDescription: entity.taskDescription,
|
||||
aiSuggestion: entity.aiSuggestion,
|
||||
requiredEquipment: entity.requiredEquipment,
|
||||
estimatedImpact: entity.estimatedImpact,
|
||||
handleResult: entity.handleResult,
|
||||
handleRemark: entity.handleRemark,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:maibu_satabot_v2/core/error/failure.dart';
|
||||
import 'package:maibu_satabot_v2/features/v2/work_order/domain/entities/work_order_entity.dart';
|
||||
import 'package:maibu_satabot_v2/features/v2/work_order/domain/repositories/work_order_repository.dart';
|
||||
import 'package:maibu_satabot_v2/features/v2/work_order/data/datasources/work_order_remote_datasource.dart';
|
||||
|
||||
class WorkOrderRepositoryImpl implements WorkOrderRepository {
|
||||
final WorkOrderRemoteDataSource remoteDataSource;
|
||||
|
||||
WorkOrderRepositoryImpl({required this.remoteDataSource});
|
||||
|
||||
@override
|
||||
Future<Either<Failure, List<WorkOrderEntity>>> getWorkOrderList(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
final result = await remoteDataSource.getWorkOrderList(params);
|
||||
return result.fold(
|
||||
(failure) => left(failure),
|
||||
(models) => right(models.map((m) => m.toEntity()).toList()),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, WorkOrderEntity>> getWorkOrderDetail(int id) async {
|
||||
final result = await remoteDataSource.getWorkOrderDetail(id);
|
||||
return result.fold(
|
||||
(failure) => left(failure),
|
||||
(model) => right(model.toEntity()),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> dispatchWorkOrder(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
return await remoteDataSource.dispatchWorkOrder(params);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> suspendWorkOrder(int id) async {
|
||||
return await remoteDataSource.suspendWorkOrder(id);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> completeWorkOrder(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
return await remoteDataSource.completeWorkOrder(params);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, bool>> startWorkOrder(
|
||||
Map<String, dynamic> params,
|
||||
) async {
|
||||
return await remoteDataSource.startWorkOrder(params);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user