대시보드 결재 상세 진입 지원

This commit is contained in:
JiWoong Sul
2025-10-23 20:19:59 +09:00
parent 7e933a2dda
commit 9d6cbb1ab2
14 changed files with 543 additions and 76 deletions

View File

@@ -1,3 +1,5 @@
import 'package:flutter/foundation.dart';
import '../../../../core/common/utils/json_utils.dart';
import '../../domain/entities/dashboard_kpi.dart';
import '../../domain/entities/dashboard_pending_approval.dart';
@@ -20,17 +22,18 @@ class DashboardSummaryDto {
factory DashboardSummaryDto.fromJson(Map<String, dynamic> json) {
final generatedAt = _parseDate(json['generated_at']);
final kpiList = JsonUtils.extractList(json, keys: const ['kpis'])
.map(DashboardKpiDto.fromJson)
.toList(growable: false);
final transactionList =
JsonUtils.extractList(json, keys: const ['recent_transactions'])
.map(DashboardTransactionDto.fromJson)
.toList(growable: false);
final approvalList =
JsonUtils.extractList(json, keys: const ['pending_approvals'])
.map(DashboardApprovalDto.fromJson)
.toList(growable: false);
final kpiList = JsonUtils.extractList(
json,
keys: const ['kpis'],
).map(DashboardKpiDto.fromJson).toList(growable: false);
final transactionList = JsonUtils.extractList(
json,
keys: const ['recent_transactions'],
).map(DashboardTransactionDto.fromJson).toList(growable: false);
final approvalList = JsonUtils.extractList(
json,
keys: const ['pending_approvals'],
).map(DashboardApprovalDto.fromJson).toList(growable: false);
return DashboardSummaryDto(
generatedAt: generatedAt,
@@ -133,19 +136,42 @@ class DashboardTransactionDto {
class DashboardApprovalDto {
const DashboardApprovalDto({
this.approvalId,
required this.approvalNo,
required this.title,
required this.stepSummary,
this.requestedAt,
});
final int? approvalId;
final String approvalNo;
final String title;
final String stepSummary;
final String? requestedAt;
factory DashboardApprovalDto.fromJson(Map<String, dynamic> json) {
num? rawId = _readNum(json, 'approval_id');
if (rawId == null) {
final approvalMap = json['approval'];
if (approvalMap is Map<String, dynamic>) {
rawId = _readNum(approvalMap, 'id');
if (rawId == null && approvalMap.containsKey('id')) {
final fallbackValue = approvalMap['id'];
debugPrint(
'[DashboardSummaryDto] approval.id 파싱 실패: runtimeType=${fallbackValue.runtimeType}, value=$fallbackValue',
);
}
}
}
final approvalIdValue = rawId?.toInt();
if (approvalIdValue == null && json.containsKey('approval_id')) {
final rawValue = json['approval_id'];
debugPrint(
'[DashboardSummaryDto] approval_id 파싱 실패: runtimeType=${rawValue.runtimeType}, value=$rawValue',
);
}
return DashboardApprovalDto(
approvalId: approvalIdValue,
approvalNo: _readString(json, 'approval_no') ?? '',
title: _readString(json, 'title') ?? '',
stepSummary: _readString(json, 'step_summary') ?? '',
@@ -155,6 +181,7 @@ class DashboardApprovalDto {
DashboardPendingApproval toEntity() {
return DashboardPendingApproval(
approvalId: approvalId,
approvalNo: approvalNo,
title: title,
stepSummary: stepSummary,
@@ -190,7 +217,11 @@ num? _readNum(Map<String, dynamic>? source, String key) {
return value;
}
if (value is String) {
return num.tryParse(value);
final trimmed = value.trim();
if (trimmed.isEmpty) {
return null;
}
return num.tryParse(trimmed);
}
return null;
}

View File

@@ -1,4 +1,7 @@
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import '../../../../core/network/api_client.dart';
import '../../../../core/network/api_routes.dart';
@@ -20,6 +23,17 @@ class DashboardRepositoryRemote implements DashboardRepository {
_summaryPath,
options: Options(responseType: ResponseType.json),
);
if (kDebugMode) {
try {
debugPrint(
'[DashboardRepositoryRemote] dashboard/summary 응답: ${jsonEncode(response.data)}',
);
} catch (error) {
debugPrint(
'[DashboardRepositoryRemote] dashboard/summary 응답 직렬화 실패: $error',
);
}
}
return DashboardSummaryDto.fromJson(_api.unwrapAsMap(response)).toEntity();
}
}