Commit 749feeaf authored by 张宏's avatar 张宏

3

parent 378c338a
...@@ -38,4 +38,20 @@ class RoomRepository { ...@@ -38,4 +38,20 @@ class RoomRepository {
}, },
); );
} }
/// 客房服务看板-送电
Future<ResponseModel> powerOn({required int deviceId}) {
return DioRequest.instance.post(
'/app/room/device/power/on',
data: {'deviceId': deviceId},
);
}
/// 客房服务看板-断电
Future<ResponseModel> powerOff({required int deviceId}) {
return DioRequest.instance.post(
'/app/room/device/power/off',
data: {'deviceId': deviceId},
);
}
} }
\ No newline at end of file
...@@ -31,4 +31,20 @@ class RoomService { ...@@ -31,4 +31,20 @@ class RoomService {
} }
throw Exception(result.msg); throw Exception(result.msg);
} }
/// 送电
Future<void> powerOn({required int deviceId}) async {
final result = await _repository.powerOn(deviceId: deviceId);
if (!result.success) {
throw Exception(result.msg);
}
}
/// 断电
Future<void> powerOff({required int deviceId}) async {
final result = await _repository.powerOff(deviceId: deviceId);
if (!result.success) {
throw Exception(result.msg);
}
}
} }
\ No newline at end of file
...@@ -116,6 +116,7 @@ class ServiceIndexCubit extends Cubit<ServiceIndexState> { ...@@ -116,6 +116,7 @@ class ServiceIndexCubit extends Cubit<ServiceIndexState> {
} }
return { return {
'roomId': rs.roomId,
'number': rs.roomNumber, 'number': rs.roomNumber,
'status': displayStatus, 'status': displayStatus,
'type': '客房', // 默认类型,后续可通过楼层areas信息扩展 'type': '客房', // 默认类型,后续可通过楼层areas信息扩展
...@@ -162,15 +163,47 @@ class ServiceIndexCubit extends Cubit<ServiceIndexState> { ...@@ -162,15 +163,47 @@ class ServiceIndexCubit extends Cubit<ServiceIndexState> {
emit(state.copyWith(searchText: text)); emit(state.copyWith(searchText: text));
} }
void powerOnRoom(String roomNumber) { Future<void> powerOnRoom(String roomNumber) async {
// TODO: 对接 POST /app/room/device/power/on if (state.isPoweringOn || state.isPoweringOff) return;
// ignore: avoid_print emit(state.copyWith(isPoweringOn: true));
print('给 $roomNumber 号房送电'); try {
final room = _findRoomByNumber(roomNumber);
if (room == null) {
throw Exception('未找到房间信息');
}
await _roomService.powerOn(deviceId: room['roomId'] as int);
emit(state.copyWith(isPoweringOn: false));
} catch (e) {
emit(state.copyWith(isPoweringOn: false));
rethrow;
}
} }
void powerOffRoom(String roomNumber) { Future<void> powerOffRoom(String roomNumber) async {
// TODO: 对接 POST /app/room/device/power/off if (state.isPoweringOff || state.isPoweringOn) return;
// ignore: avoid_print emit(state.copyWith(isPoweringOff: true));
print('给 $roomNumber 号房断电'); try {
final room = _findRoomByNumber(roomNumber);
if (room == null) {
throw Exception('未找到房间信息');
}
await _roomService.powerOff(deviceId: room['roomId'] as int);
emit(state.copyWith(isPoweringOff: false));
} catch (e) {
emit(state.copyWith(isPoweringOff: false));
rethrow;
}
}
/// 从缓存中根据房号查找房间数据
Map<String, dynamic>? _findRoomByNumber(String roomNumber) {
for (final rooms in _roomCache.values) {
for (final room in rooms) {
if (room['number'] == roomNumber) {
return room;
}
}
}
return null;
} }
} }
\ No newline at end of file
...@@ -14,6 +14,8 @@ class ServiceIndexState extends Equatable { ...@@ -14,6 +14,8 @@ class ServiceIndexState extends Equatable {
final List<Map<String, dynamic>> rooms; final List<Map<String, dynamic>> rooms;
final bool isLoading; final bool isLoading;
final String? error; final String? error;
final bool isPoweringOn;
final bool isPoweringOff;
const ServiceIndexState({ const ServiceIndexState({
this.pendingCount = 0, this.pendingCount = 0,
...@@ -28,6 +30,8 @@ class ServiceIndexState extends Equatable { ...@@ -28,6 +30,8 @@ class ServiceIndexState extends Equatable {
this.rooms = const [], this.rooms = const [],
this.isLoading = false, this.isLoading = false,
this.error, this.error,
this.isPoweringOn = false,
this.isPoweringOff = false,
}); });
ServiceIndexState copyWith({ ServiceIndexState copyWith({
...@@ -44,6 +48,8 @@ class ServiceIndexState extends Equatable { ...@@ -44,6 +48,8 @@ class ServiceIndexState extends Equatable {
List<Map<String, dynamic>>? rooms, List<Map<String, dynamic>>? rooms,
bool? isLoading, bool? isLoading,
String? error, String? error,
bool? isPoweringOn,
bool? isPoweringOff,
}) { }) {
return ServiceIndexState( return ServiceIndexState(
pendingCount: pendingCount ?? this.pendingCount, pendingCount: pendingCount ?? this.pendingCount,
...@@ -58,6 +64,8 @@ class ServiceIndexState extends Equatable { ...@@ -58,6 +64,8 @@ class ServiceIndexState extends Equatable {
rooms: rooms ?? this.rooms, rooms: rooms ?? this.rooms,
isLoading: isLoading ?? this.isLoading, isLoading: isLoading ?? this.isLoading,
error: error ?? this.error, error: error ?? this.error,
isPoweringOn: isPoweringOn ?? this.isPoweringOn,
isPoweringOff: isPoweringOff ?? this.isPoweringOff,
); );
} }
...@@ -75,5 +83,7 @@ class ServiceIndexState extends Equatable { ...@@ -75,5 +83,7 @@ class ServiceIndexState extends Equatable {
rooms, rooms,
isLoading, isLoading,
error, error,
isPoweringOn,
isPoweringOff,
]; ];
} }
\ No newline at end of file
...@@ -98,7 +98,9 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> { ...@@ -98,7 +98,9 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> {
), ),
), ),
), ),
_buildBottomButtons(cubit), BlocBuilder<ServiceIndexCubit, ServiceIndexState>(
builder: (context, state) => _buildBottomButtons(cubit),
),
], ],
), ),
), ),
...@@ -459,6 +461,7 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> { ...@@ -459,6 +461,7 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> {
Widget _buildBottomButtons(ServiceIndexCubit cubit) { Widget _buildBottomButtons(ServiceIndexCubit cubit) {
final isRoomSelected = _selectedRoom != null; final isRoomSelected = _selectedRoom != null;
final isProcessing = cubit.state.isPoweringOn || cubit.state.isPoweringOff;
return Row( return Row(
children: [ children: [
Expanded( Expanded(
...@@ -473,9 +476,22 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> { ...@@ -473,9 +476,22 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> {
), ),
elevation: 0, elevation: 0,
), ),
onPressed: isRoomSelected onPressed: isRoomSelected && !isProcessing
? () { ? () async {
cubit.powerOnRoom(_selectedRoom!); try {
await cubit.powerOnRoom(_selectedRoom!);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('送电成功')),
);
}
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('送电失败: $e')),
);
}
}
} }
: null, : null,
child: Text( child: Text(
...@@ -504,9 +520,22 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> { ...@@ -504,9 +520,22 @@ class _RoomManagementBlockState extends State<RoomManagementBlock> {
), ),
elevation: 0, elevation: 0,
), ),
onPressed: isRoomSelected onPressed: isRoomSelected && !isProcessing
? () { ? () async {
cubit.powerOffRoom(_selectedRoom!); try {
await cubit.powerOffRoom(_selectedRoom!);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('断电成功')),
);
}
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('断电失败: $e')),
);
}
}
} }
: null, : null,
child: Text( child: Text(
......
# 智慧酒店 App 接口对接方案 # 智慧酒店 App 接口对接方案
...@@ -210,11 +210,11 @@ class xxxBO extends Equatable { ...@@ -210,11 +210,11 @@ class xxxBO extends Equatable {
---- ----
| 客房服务看板-客房状态总览-楼层 |GET | /app/room/floor/areas | 对接 | 客房服务看板-客房状态总览-楼层 | | | 客房服务看板-客房状态总览-楼层 |GET | /app/room/floor/areas | 对接 | 客房服务看板-客房状态总览-楼层 | |
| 客房服务看板-客房状态总览-房间list |GET | /app/room/status | 对接 | 客房服务看板-客房状态总览-房间list | | | 客房服务看板-客房状态总览-房间list |GET | /app/room/status | 对接 | 客房服务看板-客房状态总览-房间list | |
| 客房服务看板-送电 |POST | /app/room/device/power/on | 对接 | 客房服务看板-送电 | | | 客房服务看板-送电 |POST | /app/room/device/power/on | 对接 | 客房服务看板-送电 | |
| 客房服务看板-断电 |POST | /app/room/device/power/off | 对接 | 客房服务看板-断电 | | | 客房服务看板-断电 |POST | /app/room/device/power/off | 对接 | 客房服务看板-断电 | |
| 客房详情 |GET | /app/room/detail | 未对接 | 客房详情 | | | 客房详情 |GET | /app/room/detail | 未对接 | 客房详情 | |
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment