|
|
@@ -17,6 +17,7 @@ import 'dart:io';
|
|
|
import 'package:path_provider/path_provider.dart';
|
|
|
import 'package:open_filex/open_filex.dart';
|
|
|
import '../expense_apply/widgets/attachment_preview_page.dart';
|
|
|
+import 'widgets/expense_detail_view_dialog.dart';
|
|
|
|
|
|
class ExpenseDetailPage extends ConsumerStatefulWidget {
|
|
|
final String billNo;
|
|
|
@@ -244,8 +245,10 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage>
|
|
|
final d = e.value;
|
|
|
final title = d.categoryName.isNotEmpty
|
|
|
? '${d.expenseCategory}/${d.categoryName}'
|
|
|
- : (d.remark.isNotEmpty ? d.remark : (d.acctSubjectId.isNotEmpty ? d.acctSubjectId : '--'));
|
|
|
- return Container(
|
|
|
+ : d.expenseCategory;
|
|
|
+ return GestureDetector(
|
|
|
+ onTap: () => _showExpenseDetailDialog(context, d),
|
|
|
+ child: Container(
|
|
|
margin: const EdgeInsets.symmetric(vertical: 6),
|
|
|
padding: const EdgeInsets.all(12),
|
|
|
decoration: BoxDecoration(color: colors.bgPage, borderRadius: BorderRadius.circular(8)),
|
|
|
@@ -279,9 +282,9 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage>
|
|
|
if (d.taxAmount > 0)
|
|
|
Text('${l10n.get('taxAmount')}: ¥${d.taxAmount.toStringAsFixed(2)}',
|
|
|
style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
- if (d.approvedAmount > 0)
|
|
|
- Text('${l10n.get('approvedAmount')}: ¥${d.approvedAmount.toStringAsFixed(2)}',
|
|
|
- style: TextStyle(fontSize: AppFontSizes.caption, fontWeight: FontWeight.w500, color: colors.success)),
|
|
|
+ if (d.taxRate > 0)
|
|
|
+ Text('${l10n.get('taxRate')}: ${d.taxRate.toStringAsFixed(0)}%',
|
|
|
+ style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
if (d.acctSubjectName.isNotEmpty)
|
|
|
Text('${l10n.get('acctSubject')}: ${d.acctSubjectId}/${d.acctSubjectName}',
|
|
|
maxLines: 1, overflow: TextOverflow.ellipsis,
|
|
|
@@ -298,15 +301,30 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage>
|
|
|
maxLines: 1, overflow: TextOverflow.ellipsis,
|
|
|
style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
if (d.costDeptName.isNotEmpty)
|
|
|
- Text('${l10n.get('dept')}: ${d.costDeptId}/${d.costDeptName}',
|
|
|
+ Text('${l10n.get('costDept')}: ${d.costDeptId}/${d.costDeptName}',
|
|
|
maxLines: 1, overflow: TextOverflow.ellipsis,
|
|
|
style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
if (d.customerVendorName.isNotEmpty)
|
|
|
- Text('${l10n.get('customerVendor')}: ${d.customerVendorName}',
|
|
|
+ Text('${l10n.get('customerVendor')}: ${d.customerVendorId}/${d.customerVendorName}',
|
|
|
+ maxLines: 1, overflow: TextOverflow.ellipsis,
|
|
|
+ style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
+ if (d.sqManName.isNotEmpty)
|
|
|
+ Text('${l10n.get('applicant')}: ${d.sqMan}/${d.sqManName}',
|
|
|
+ style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
+ if (d.bankAccountName.isNotEmpty)
|
|
|
+ Text('${l10n.get('bankAccountName')}: ${d.bankAccountName}',
|
|
|
+ maxLines: 1, overflow: TextOverflow.ellipsis,
|
|
|
+ style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
+ if (d.bankName.isNotEmpty)
|
|
|
+ Text('${l10n.get('bankName')}: ${d.bankName}',
|
|
|
+ maxLines: 1, overflow: TextOverflow.ellipsis,
|
|
|
+ style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
+ if (d.bankAccount.isNotEmpty)
|
|
|
+ Text('${l10n.get('bankAccount')}: ${d.bankAccount}',
|
|
|
maxLines: 1, overflow: TextOverflow.ellipsis,
|
|
|
style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
if (d.remark.isNotEmpty)
|
|
|
- Text(d.remark,
|
|
|
+ Text('${l10n.get('remark')}: ${d.remark}',
|
|
|
maxLines: 2, overflow: TextOverflow.ellipsis,
|
|
|
style: TextStyle(fontSize: AppFontSizes.caption, color: colors.textSecondary)),
|
|
|
],
|
|
|
@@ -314,6 +332,7 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage>
|
|
|
),
|
|
|
],
|
|
|
),
|
|
|
+ ),
|
|
|
);
|
|
|
}),
|
|
|
if (expense.details.isNotEmpty) ...[
|
|
|
@@ -337,6 +356,10 @@ class _ExpenseDetailPageState extends ConsumerState<ExpenseDetailPage>
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ void _showExpenseDetailDialog(BuildContext context, ExpenseDetailModel d) {
|
|
|
+ ExpenseDetailViewDialog.show(context, d);
|
|
|
+ }
|
|
|
+
|
|
|
// ═══ 附件 ═══
|
|
|
Widget _buildAttachmentSection(AppLocalizations l10n, AppColorsExtension colors) {
|
|
|
if (!_attachAvailable) {
|