web: migrate health notifications to js_interop; add browser hook
- Replace dart:js with package:js in health_check_service_web.dart\n- Implement showHealthCheckNotification in web/index.html\n- Pin js dependency to ^0.6.7 for flutter_secure_storage_web compatibility auth: harden AuthInterceptor + tests - Allow overrideAuthRepository injection for testing\n- Normalize imports to package: paths\n- Add unit test covering token attach, 401→refresh→retry, and failure path\n- Add integration test skeleton gated by env vars ui/data: map User.companyName to list column - Add companyName to domain User\n- Map UserDto.company?.name\n- Render companyName in user_list cleanup: remove legacy equipment table + unused code; minor warnings - Remove _buildFlexibleTable and unused helpers\n- Remove unused zipcode details and cache retry constant\n- Fix null-aware and non-null assertions\n- Address child-last warnings in administrator dialog docs: update AGENTS.md session context
This commit is contained in:
344
CLAUDE.md
344
CLAUDE.md
@@ -1,15 +1,15 @@
|
||||
# Superport ERP Development Guide v3.0
|
||||
# Superport ERP Development Guide v4.0
|
||||
*Complete Flutter ERP System with Clean Architecture + CO-STAR Framework*
|
||||
|
||||
---
|
||||
|
||||
## 🎯 PROJECT STATUS
|
||||
```yaml
|
||||
Current_State: "Phase 9.2 - Dashboard Integration Complete"
|
||||
Current_State: "색상 일부 변경 완료 - 실제 UI 통일성 작업 필요"
|
||||
API_Coverage: "100%+ (61/53 endpoints implemented)"
|
||||
System_Health: "Production Ready - Flutter Analyze ERROR: 0"
|
||||
Architecture: "Clean Architecture + shadcn_ui + 100% Backend Dependency"
|
||||
Framework: "CO-STAR Prompt Engineering Pattern Applied"
|
||||
Framework: "CO-STAR + Design System + 1920x1080 Optimized"
|
||||
```
|
||||
|
||||
**🏆 ACHIEVEMENT: Complete ERP system with 7 core modules + Integrated Dashboard System**
|
||||
@@ -34,6 +34,33 @@ Architecture_Compliance: "100% Clean Architecture adherence"
|
||||
User_Experience: "Consistent UI/UX with shadcn_ui components"
|
||||
```
|
||||
|
||||
## ⚠️ CRITICAL DEVELOPMENT GUIDELINES
|
||||
|
||||
### 작업 품질 검증 원칙
|
||||
```yaml
|
||||
실제_개선_우선: "사용자가 실제로 느낄 수 있는 개선에만 집중"
|
||||
과장_금지: "색상 변경을 '완전 재설계'로 포장 금지"
|
||||
agent_적극_활용: "복잡한 작업은 반드시 적절한 agent 사용"
|
||||
구체적_완성기준: "모호한 목표 설정 금지, 측정 가능한 기준만 사용"
|
||||
문서화_최소화: "보고서 작성보다 실제 결과물 품질 우선"
|
||||
```
|
||||
|
||||
### UI 통일성 검증 체크리스트
|
||||
```yaml
|
||||
필수_통일_요소:
|
||||
- 모든 화면 동일한 테이블 컴포넌트 (ShadTable.list)
|
||||
- Typography 시스템 통일 (font-size, line-height, weight)
|
||||
- Spacing 시스템 통일 (padding, margin, gap)
|
||||
- BorderRadius 값 통일 (ShadcnTheme.radius*)
|
||||
- 레이아웃 구조 표준화 (BaseListScreen template)
|
||||
- 색상 사용 일관성 (ShadcnTheme.* 상수만 사용)
|
||||
|
||||
검증_방법:
|
||||
- 매 작업 후 "사용자가 이 차이를 실제로 느낄까?" 자문
|
||||
- Agent를 통한 화면별 차이점 객관적 분석
|
||||
- 실제 화면 캡처 비교 (가능시)
|
||||
```
|
||||
|
||||
### Style (S) - Code & Communication Style
|
||||
```yaml
|
||||
Code_Style: "Declarative, functional, immutable"
|
||||
@@ -73,7 +100,7 @@ Error_States: "Comprehensive error handling with recovery"
|
||||
### Rule 1: UI Components (ABSOLUTE)
|
||||
```dart
|
||||
// ✅ REQUIRED - shadcn_ui only
|
||||
StandardDataTable<T>(), ShadButton.outline(), ShadSelect<String>()
|
||||
ShadTable.list(), ShadButton.outline(), ShadSelect<String>()
|
||||
|
||||
// ❌ FORBIDDEN - Flutter base widgets
|
||||
DataTable(), ElevatedButton(), DropdownButton()
|
||||
@@ -213,29 +240,23 @@ CreateEquipmentHistoryRequest(
|
||||
|
||||
---
|
||||
|
||||
## 🎯 NEXT PHASE
|
||||
## 🎯 CURRENT PHASE
|
||||
|
||||
### ✅ Phase 9.4: 유지보수 대시보드 리스트 테이블 형태 전환 (COMPLETED)
|
||||
**Status**: 2025-09-04 완료 - 카드 형태 → 행렬 테이블 형태 완전 전환 성공
|
||||
### 🔧 실제 UI 통일성 작업 (URGENT)
|
||||
**현재 상태**: 색상만 일부 변경됨 - 실제 화면별 구조/크기/모양 모두 다름
|
||||
|
||||
#### **🎯 달성된 성과**
|
||||
- [x] 카드 형태 완전 제거, StandardDataTable 테이블 형태로 전환 ✅
|
||||
- [x] 실제 모델명, 시리얼번호, 고객사명 표시 ✅
|
||||
- [x] "조회중..." 상태 유지하되 실제 데이터 로딩 시스템 검증 완료 ✅
|
||||
- [x] 워런티 타입을 방문(O)/원격(R) + 기존 타입 모두 지원 ✅
|
||||
- [x] 다른 화면들과 동일한 리스트 UI 일관성 100% 달성 ✅
|
||||
- [x] Flutter Analyze ERROR: 0 유지 ✅
|
||||
#### **실제 문제점**
|
||||
- 각 화면마다 테이블 구조 다름 (ShadTable vs 수동 구성)
|
||||
- 글자 크기, 패딩, 여백 값 제각각
|
||||
- 테두리 둥글기(BorderRadius) 불일치
|
||||
- 레이아웃 구조 표준화 미완료
|
||||
|
||||
#### **🏆 핵심 개선사항**
|
||||
- **정보 밀도 5배 증가**: 카드 vs 테이블 비교
|
||||
- **운영 효율성 극대화**: 한 화면 스캔으로 전체 상황 파악
|
||||
- **UI 일관성 완성**: StandardDataTable 기반 통합 디자인
|
||||
- **접근성 향상**: 클릭 가능한 장비명으로 상세보기 연결
|
||||
|
||||
---
|
||||
|
||||
### Phase 8.3: Form Standardization (POSTPONED)
|
||||
**Status**: 유지보수 대시보드 문제 해결 후 진행
|
||||
#### **해야 할 실제 작업**
|
||||
- [ ] 모든 화면 ShadTable.list()로 통일
|
||||
- [ ] Typography 시스템 완전 통일
|
||||
- [ ] Spacing/Padding 값 표준화
|
||||
- [ ] BorderRadius 값 통일
|
||||
- [ ] 레이아웃 템플릿 표준화
|
||||
|
||||
---
|
||||
|
||||
@@ -281,118 +302,167 @@ showDialog(
|
||||
|
||||
---
|
||||
|
||||
## 📅 UPDATE LOG
|
||||
- **2025-09-04**: Phase 9.4 - 유지보수 대시보드 리스트 테이블 형태 전환 완료 (Table Format Conversion Complete)
|
||||
- **핵심 문제 해결**: 카드 형태 UI를 테이블 형태로 완전 전환하여 실용성 100% 확보
|
||||
- **UI 형태 완전 전환**:
|
||||
* 기존 `_buildMaintenanceListTile` (카드 형태) 완전 제거
|
||||
* StandardDataTable 기반 테이블 형태로 교체
|
||||
* 7개 컬럼 구현: 장비명, 시리얼번호, 고객사, 만료일, 타입, 상태, 주기
|
||||
- **정보 표시 개선**:
|
||||
* 장비명: 실제 ModelName 표시 (기존: "Equipment #127")
|
||||
* 시리얼번호: 실제 SerialNumber 표시
|
||||
* 고객사명: 실제 CompanyName 표시
|
||||
* 만료일: 색상 구분 (정상/경고/만료)
|
||||
- **워런티 타입 시스템 완성**:
|
||||
* O(방문)/R(원격) 타입 지원
|
||||
* WARRANTY(무상보증)/CONTRACT(유상계약)/INSPECTION(점검) 호환
|
||||
* 타입별 색상 배지 적용
|
||||
- **사용자 경험 혁신**:
|
||||
* 정보 밀도 5배 증가 (테이블 vs 카드)
|
||||
* 한 화면 스캔으로 전체 상황 파악 가능
|
||||
* 클릭 가능한 장비명으로 상세보기 접근성 향상
|
||||
- **기술적 성과**:
|
||||
* Flutter Analyze ERROR: 0 유지
|
||||
* 100% shadcn_ui 컴플라이언스
|
||||
* Clean Architecture 완벽 준수
|
||||
* StandardDataTable 컴포넌트 재사용성 확보
|
||||
- **결과**: 운영 효율성 극대화, 다른 화면과 UI 일관성 100% 달성
|
||||
- **2025-09-04**: Phase 9.3 - 유지보수 대시보드 리스트 정보 개선 완료 (Maintenance List Information Enhancement)
|
||||
- **핵심 문제 해결**: 기존 "Equipment History #127" 형태의 의미 없는 표시 → 실제 장비/고객사 정보로 대체
|
||||
- **리스트 UI 완전 재설계**:
|
||||
* 장비명 + 시리얼번호 표시 (ModelName + SerialNumber)
|
||||
* 고객사명 표시 (CompanyName)
|
||||
* 워런티 타입별 색상/아이콘 구분 (무상보증/유상계약/점검)
|
||||
* 만료일까지 남은 일수 + 만료 상태 시각화
|
||||
* 유지보수 주기 정보 추가
|
||||
- **백엔드 데이터 활용 최적화**:
|
||||
* MaintenanceController에 EquipmentHistoryRepository 의존성 추가
|
||||
* equipment_history_id → EquipmentHistoryDto → EquipmentDto 관계 데이터 조회
|
||||
* 성능 최적화: Map<int, EquipmentHistoryDto> 캐시 구현
|
||||
* 배치 로딩: 최대 5개씩 동시 조회로 API 부하 방지
|
||||
- **사용자 경험 대폭 향상**:
|
||||
* 정보 파악 시간: 30초 → 3초 (90% 단축)
|
||||
* 한 화면에서 모든 핵심 정보 확인 가능
|
||||
* 만료 임박/지연 상태 색상으로 즉시 식별
|
||||
- **기술적 성과**:
|
||||
* Flutter Analyze ERROR: 0 유지
|
||||
* 100% shadcn_ui 컴플라이언스
|
||||
* Clean Architecture 완벽 준수
|
||||
* 의존성 주입(DI) 정상 적용
|
||||
- **결과**: 실용성 100% 달성, 운영진 요구사항 완전 충족
|
||||
- **2025-09-04**: Phase 9.2 - 유지보수 대시보드 화면 통합 완료 (Dashboard Integration Complete)
|
||||
- **통합 대시보드 화면 완성**: maintenance_alert_dashboard.dart 완전 재작성 (574줄 → 640줄)
|
||||
- **StatusSummaryCards 완전 통합**: Phase 9.1 컴포넌트 실제 화면에 적용
|
||||
- **카드 클릭 필터링 구현**: 60일/30일/7일/만료 카드 → 자동 필터링된 목록 표시
|
||||
- **반응형 레이아웃 완성**: 데스크톱(가로 4개) vs 태블릿/모바일(2x2 그리드)
|
||||
- **핵심 기술 성과**:
|
||||
* MaintenanceDashboardController Provider 통합 (main.dart)
|
||||
* 100% shadcn_ui 컴플라이언스 (Flutter 기본 위젯 완전 제거)
|
||||
* Clean Architecture 완벽 준수 (Consumer2 패턴)
|
||||
* 실시간 데이터 바인딩 및 Pull-to-Refresh 지원
|
||||
* 통합 필터 시스템 (전체/7일내/30일내/60일내/만료됨)
|
||||
- **사용자 경험 향상**: 통계 카드 → 원클릭 필터링 → 상세보기 (30% UX 향상)
|
||||
- **결과**: Flutter Analyze ERROR: 0 달성, 프로덕션 대시보드 완성
|
||||
- **시스템 완성도**: 98% → 100% (모든 핵심 모듈 통합 완료)
|
||||
- **2025-09-04**: Phase 9.1 - 유지보수 대시보드 시스템 재설계 완료 (Maintenance Dashboard Redesign)
|
||||
- **사용자 요구사항 100% 충족**: 60일내, 30일내, 7일내, 만료된 계약 대시보드
|
||||
- **Clean Architecture 완벽 준수**: DTO → Repository → UseCase → Controller → UI 패턴
|
||||
- **100% shadcn_ui 컴플라이언스**: Flutter base widgets 완전 배제
|
||||
- **핵심 구현사항**:
|
||||
* MaintenanceStatsDto: 대시보드 통계 모델 (60/30/7일 만료, 계약타입별 통계)
|
||||
* MaintenanceStatsRepository: 기존 maintenance API 활용하여 통계 계산
|
||||
* GetMaintenanceStatsUseCase: 비즈니스 로직 및 데이터 검증
|
||||
* MaintenanceDashboardController: 상태 관리 및 UI 상호작용
|
||||
* StatusSummaryCards: shadcn_ui 기반 4-카드 대시보드 컴포넌트
|
||||
* 의존성 주입: injection_container.dart에 완전 통합
|
||||
- **결과**: Flutter Analyze ERROR: 0 유지, 프로덕션 준비 완료
|
||||
- **다음 단계**: 실제 대시보드 화면 통합 및 라우팅 완성 예정
|
||||
- **2025-09-04**: Phase 8.3.4 - 출고 처리 JSON 직렬화 오류 해결 (Critical Bug Fix)
|
||||
- 문제 1: 백엔드 400 Bad Request + JSON deserialize error (타임존 정보 누락)
|
||||
* 기존: `"2025-09-04T17:40:44.061"` → 수정: `"2025-09-04T17:40:44.061Z"`
|
||||
* 해결: createStockIn/createStockOut에서 DateTime.toUtc() 변환 적용
|
||||
- 문제 2: ResponseInterceptor가 equipment-history 응답을 래핑하여 DTO 파싱 실패
|
||||
* 원인: `{id: 235, equipments_id: 108, ...}` → `{success: true, data: {...}}`로 변환
|
||||
* 해결: equipment-history 응답 패턴 감지하여 래핑 방지 로직 추가
|
||||
- 핵심 변경사항:
|
||||
* EquipmentHistoryRepository: UTC 날짜 변환 + String 응답 타입 검증
|
||||
* ResponseInterceptor: transaction_type 필드 감지하여 변형 방지
|
||||
- 결과: 출고/입고 프로세스 100% 안정성 확보, 백엔드 호환성 완성
|
||||
- **2025-09-04**: Phase 8.3.3 - 장비 입고시 입고 이력 누락 문제 해결 (Critical Bug Fix)
|
||||
- 문제 원인: EquipmentHistoryController를 통한 간접 호출에서 API 실패시 에러 처리 불완전
|
||||
- 해결 방안: EquipmentHistoryRepository 직접 호출로 출고 시스템과 동일한 패턴 적용
|
||||
- 핵심 변경사항:
|
||||
* EquipmentInFormController에 EquipmentHistoryRepository 의존성 추가
|
||||
* createStockIn() 직접 호출로 입고 이력 생성 로직 개선
|
||||
* 실패시 전체 프로세스 실패 처리 (트랜잭션 무결성 확보)
|
||||
- 결과: 입고 이력 100% 생성 보장, 출고/입고 시스템 패턴 통일 완성
|
||||
- **2025-09-03**: Phase 8.3.2 - 장비 수정 화면 창고 선택 필드를 읽기 전용으로 변경
|
||||
- 백엔드 아키텍처 분석 결과: Equipment 테이블에 warehouses_id 컬럼 없음
|
||||
- 창고 정보는 equipment_history 테이블에서 관리하는 구조 확인
|
||||
- 수정 화면에서 창고 필드를 읽기 전용으로 변경하여 사용자 혼동 방지
|
||||
- 창고 변경은 별도 "장비 이동" 기능으로 처리해야 함을 명확화
|
||||
- **2025-09-03**: Phase 8.3.1 - 장비 수정 화면 창고 선택 데이터 바인딩 수정
|
||||
- 수정 화면에서 기존 창고 정보가 사라지고 첫 번째 창고가 표시되던 버그 수정
|
||||
- `EquipmentInFormController`에서 `selectedWarehouseId = equipment.warehousesId` 설정 추가
|
||||
- 백엔드-프론트엔드 DTO 매핑 검증 완료 (정상)
|
||||
- **2025-09-02 v3.0**: Phase 8.3 - Outbound system redesigned with CO-STAR framework
|
||||
- Implemented dialog-based outbound processing
|
||||
- Integrated equipment_history API for transaction management
|
||||
- Applied CO-STAR prompt engineering framework
|
||||
- Zero backend modifications required
|
||||
- **2025-09-02**: Phase 8.2 Complete - StandardDropdown system + 95% forms
|
||||
- **2025-09-01**: Phase 1-7 Complete - Full ERP system + 100%+ API coverage
|
||||
- **Next**: Phase 8.4 - Complete UI/UX standardization across all modules
|
||||
## 🔧 ShadTable 전환 작업 가이드
|
||||
|
||||
### 🎯 핵심 목표
|
||||
|
||||
- **모든 화면을 shadcn_ui의 공식 ShadTable 컴포넌트로 통일**
|
||||
- **커스텀 StandardDataTable 사용 금지** (유지보수 어려움)
|
||||
- **수동 Row/Column 구성 완전 제거**
|
||||
|
||||
### 📋 화면별 전환 태스크
|
||||
|
||||
#### **Phase 1: Equipment List (파일럿)**
|
||||
**파일**: `lib/screens/equipment/equipment_list.dart`
|
||||
**현재**: `_buildFlexibleTable()` 수동 구성
|
||||
**목표**: `ShadTable.list()` 전환
|
||||
**검증**:
|
||||
- [ ] 체크박스 선택 기능 정상 동작
|
||||
- [ ] 페이지네이션 연동
|
||||
- [ ] 출고/입고 버튼 이벤트
|
||||
- [ ] 호버/클릭 이벤트
|
||||
|
||||
#### **Phase 2: 단순 화면 전환**
|
||||
1. **Vendor Management** (`vendor_list_screen.dart`)
|
||||
2. **Model Management** (`model_list_screen.dart`)
|
||||
|
||||
각 화면:
|
||||
- [ ] 헤더 구조를 `ShadTableCell.header`로 변환
|
||||
- [ ] 데이터 행을 `ShadTableCell`로 변환
|
||||
- [ ] 컬럼 너비를 `columnSpanExtent`로 설정
|
||||
- [ ] 기존 이벤트 핸들러 `onRowTap`으로 연결
|
||||
|
||||
#### **Phase 3: 복잡 화면 전환**
|
||||
1. **User List** (`user_list.dart`)
|
||||
2. **Company List** (`company_list.dart`)
|
||||
3. **Inventory History** (`inventory_history_screen.dart`)
|
||||
|
||||
**주의사항**:
|
||||
- 권한별 배지 컴포넌트 보존
|
||||
- 필터/검색 기능 영향 최소화
|
||||
- 상태 관리 로직 변경 금지
|
||||
|
||||
### ⚠️ 사이드 이펙트 방지 전략
|
||||
|
||||
#### **1. 컨트롤러 격리**
|
||||
- 테이블 UI 변경만 진행
|
||||
- Controller/Repository/UseCase 수정 금지
|
||||
- 상태 관리 로직 유지
|
||||
|
||||
#### **2. 점진적 전환**
|
||||
```dart
|
||||
// Step 1: 기존 구조 백업
|
||||
Widget _buildFlexibleTable_backup() { ... }
|
||||
|
||||
// Step 2: 새 ShadTable 병렬 구현
|
||||
Widget _buildShadTable() {
|
||||
return ShadTable.list(...);
|
||||
}
|
||||
|
||||
// Step 3: 조건부 렌더링으로 테스트
|
||||
bool useShadTable = true; // 플래그로 전환
|
||||
```
|
||||
|
||||
#### **3. 데이터 바인딩 보존**
|
||||
- 기존 `controller.equipments` 그대로 사용
|
||||
- `map()` 함수로 ShadTableCell 변환만 수행
|
||||
- 이벤트 핸들러 1:1 매핑
|
||||
|
||||
#### **4. 스타일 일관성**
|
||||
- ShadcnTheme 상수만 사용
|
||||
- 커스텀 색상 금지
|
||||
- padding/margin 값 표준화
|
||||
|
||||
### 🔍 검증 체크리스트
|
||||
|
||||
각 화면 전환 후 필수 확인:
|
||||
- [ ] 데이터 표시 정확성
|
||||
- [ ] 체크박스 선택/해제
|
||||
- [ ] 정렬 기능 (있는 경우)
|
||||
- [ ] 필터링 동작
|
||||
- [ ] 페이지네이션
|
||||
- [ ] 행 클릭 이벤트
|
||||
- [ ] 편집/삭제 버튼
|
||||
- [ ] 반응형 레이아웃
|
||||
- [ ] Flutter Analyze 에러 0개
|
||||
|
||||
### 📚 ShadTable 사용 패턴
|
||||
|
||||
#### **기본 구조**
|
||||
```dart
|
||||
ShadTable.list(
|
||||
header: [
|
||||
ShadTableCell.header(child: Text('컬럼1')),
|
||||
ShadTableCell.header(child: Text('컬럼2')),
|
||||
],
|
||||
children: items.map((item) => [
|
||||
ShadTableCell(child: Text(item.field1)),
|
||||
ShadTableCell(child: Text(item.field2)),
|
||||
]).toList(),
|
||||
columnSpanExtent: (index) {
|
||||
switch(index) {
|
||||
case 0: return FixedTableSpanExtent(80);
|
||||
case 1: return FlexTableSpanExtent(2);
|
||||
default: return null;
|
||||
}
|
||||
},
|
||||
onRowTap: (index) => _handleRowClick(items[index]),
|
||||
)
|
||||
```
|
||||
|
||||
#### **체크박스 포함**
|
||||
```dart
|
||||
ShadTable.list(
|
||||
header: [
|
||||
ShadTableCell.header(
|
||||
child: ShadCheckbox(
|
||||
value: _isAllSelected,
|
||||
onChanged: _onSelectAll,
|
||||
)
|
||||
),
|
||||
ShadTableCell.header(child: Text('데이터')),
|
||||
],
|
||||
children: items.map((item) => [
|
||||
ShadTableCell(
|
||||
child: ShadCheckbox(
|
||||
value: _selectedItems.contains(item.id),
|
||||
onChanged: (v) => _onItemSelect(item.id, v),
|
||||
)
|
||||
),
|
||||
ShadTableCell(child: Text(item.data)),
|
||||
]).toList(),
|
||||
)
|
||||
```
|
||||
|
||||
### 🚨 금지 사항
|
||||
- **StandardDataTable 사용** ❌
|
||||
- **수동 Row/Column 구성** ❌
|
||||
- **Container + ListView.builder 패턴** ❌
|
||||
- **커스텀 테이블 컴포넌트 생성** ❌
|
||||
- **비즈니스 로직 수정** ❌
|
||||
|
||||
### ✅ 완료 기준
|
||||
- 모든 화면이 ShadTable 사용
|
||||
- Flutter Analyze ERROR: 0
|
||||
- 기능 regression 없음
|
||||
- 시각적 일관성 100%
|
||||
|
||||
---
|
||||
*Document updated with CO-STAR framework and 2025 prompt engineering best practices*
|
||||
|
||||
## 🎯 작업 시작 방법
|
||||
|
||||
### Agent 사용 필수
|
||||
```yaml
|
||||
복잡한_분석: general-purpose agent 사용
|
||||
UI_비교: agent를 통한 화면별 차이점 분석
|
||||
검증: agent를 통한 완성도 객관적 평가
|
||||
```
|
||||
|
||||
### 검증 기준
|
||||
- "사용자가 실제로 이 차이를 느낄까?"
|
||||
- Equipment List와 시각적으로 동일한가?
|
||||
- Typography/Spacing이 정확히 일치하는가?
|
||||
|
||||
---
|
||||
|
||||
*Document updated: 2025-09-05 - 실제 UI 통일성 작업 계획 수립*
|
||||
|
||||
Reference in New Issue
Block a user