feat: 장비 관리 API 연동 구현

- Equipment 관련 DTO 모델 생성 (Request/Response/List/History/In/Out/IO)
- EquipmentRemoteDataSource 구현 (10개 API 엔드포인트)
- EquipmentService 비즈니스 로직 구현
- Controller를 ChangeNotifier 패턴으로 개선
- 장비 목록 화면에 Provider 패턴 및 무한 스크롤 적용
- 장비 입고 화면 API 연동 및 비동기 처리
- DI 컨테이너에 Equipment 관련 의존성 등록
- API/Mock 데이터 소스 전환 가능 (Feature Flag)
- API 통합 진행 상황 문서 업데이트
This commit is contained in:
JiWoong Sul
2025-07-24 16:26:04 +09:00
parent a13c485302
commit 1d1e38bcfa
30 changed files with 4920 additions and 80 deletions

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
// import 'package:superport/models/equipment_unified_model.dart';
import 'package:superport/screens/common/custom_widgets.dart';
import 'package:superport/screens/common/theme_tailwind.dart';
@@ -350,9 +351,51 @@ class _EquipmentInFormScreenState extends State<EquipmentInFormScreen> {
}
}
void _saveEquipmentIn() {
if (_controller.save()) {
Navigator.pop(context, true);
Future<void> _saveEquipmentIn() async {
// 로딩 다이얼로그 표시
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => const Center(
child: CircularProgressIndicator(),
),
);
try {
final success = await _controller.save();
// 로딩 다이얼로그 닫기
Navigator.pop(context);
if (success) {
// 성공 메시지 표시
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(_controller.isEditMode ? '장비 입고가 수정되었습니다.' : '장비 입고가 등록되었습니다.'),
backgroundColor: Colors.green,
),
);
Navigator.pop(context, true);
} else {
// 에러 메시지 표시
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(_controller.error ?? '저장 중 오류가 발생했습니다.'),
backgroundColor: Colors.red,
),
);
}
} catch (e) {
// 로딩 다이얼로그 닫기
Navigator.pop(context);
// 예외 처리
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('오류: $e'),
backgroundColor: Colors.red,
),
);
}
}
@@ -1095,7 +1138,10 @@ class _EquipmentInFormScreenState extends State<EquipmentInFormScreen> {
print(
'[구매처:autocomplete] 입력값: "$inputText", 자동완성 후보: "$suggestion", showSuggestion=$showSuggestion',
);
return GestureDetector(
return ChangeNotifierProvider<EquipmentInFormController>.value(
value: _controller,
child: Consumer<EquipmentInFormController>(
builder: (context, controller, child) => GestureDetector(
// 화면의 다른 곳을 탭하면 모든 드롭다운 닫기
onTap: () {
// 현재 포커스된 위젯 포커스 해제
@@ -2262,6 +2308,8 @@ class _EquipmentInFormScreenState extends State<EquipmentInFormScreen> {
),
),
),
),
),
);
}
}