chengc 2 недель назад
Родитель
Сommit
045a382be0

+ 1 - 0
assets/i18n/en.json

@@ -322,6 +322,7 @@
   "expenseApply": {
     "expenseApplyList": "expenseApplyList",
     "expenseApplyDetail": "expenseApplyDetail",
+    "statusConvertedToExpense": "Converted to Expense",
     "expenseApplyRequest": "expenseApplyRequest",
     "expenseApplyImport": "expenseApplyImport",
     "importApprovedPreApp": "importApprovedPreApp",

+ 1 - 0
assets/i18n/zh_CN.json

@@ -268,6 +268,7 @@
   "expenseApply": {
     "expenseApplyList": "报销申请列表",
     "expenseApplyDetail": "报销申请详情",
+    "statusConvertedToExpense": "已转报销",
     "expenseApplyRequest": "报销申请",
     "expenseApplyImport": "一键导入已通过的报销申请",
     "importApprovedPreApp": "一键导入已通过的报销申请",

+ 1 - 0
assets/i18n/zh_TW.json

@@ -268,6 +268,7 @@
   "expenseApply": {
     "expenseApplyList": "報銷申請列表",
     "expenseApplyDetail": "報銷申請詳情",
+    "statusConvertedToExpense": "已轉報銷",
     "expenseApplyRequest": "報銷申請",
     "expenseApplyImport": "一鍵導入已通過的報銷申請",
     "importApprovedPreApp": "一鍵導入已通過的報銷申請",

+ 0 - 2
lib/features/expense/expense_create_page.dart

@@ -429,10 +429,8 @@ class _ExpenseCreatePageState extends ConsumerState<ExpenseCreatePage> {
         'VOH_ID': expense.isGenerateVoucher ? 'T' : 'F',
       },
       'BodyData1': expense.details.asMap().entries.map((e) {
-        final i = e.key;
         final d = e.value;
         return {
-          'ITM': i + 1,
           'BX_DD': _today(),
           'ACC_NO': d.acctSubjectId,
           'AMT': d.totalAmount,

+ 9 - 3
lib/features/expense/expense_edit_page.dart

@@ -357,10 +357,9 @@ class _ExpenseEditPageState extends ConsumerState<ExpenseEditPage> {
         'VOH_ID': expense.isGenerateVoucher ? 'T' : 'F',
       },
       'BodyData1': expense.details.asMap().entries.map((e) {
-        final i = e.key;
         final d = e.value;
-        return {
-          'ITM': i + 1,
+        final item = <String, dynamic>{
+          'BX_NO': _billNo,
           'BX_DD': _today(),
           'ACC_NO': d.acctSubjectId,
           'AMT': d.totalAmount,
@@ -381,6 +380,10 @@ class _ExpenseEditPageState extends ConsumerState<ExpenseEditPage> {
           'SQ_MAN': d.sqMan.isNotEmpty ? d.sqMan : HostAppChannel.usr,
           'EST_ITM': d.aeNo.isNotEmpty ? d.sortOrder : 0,
         };
+        if (d.preItm != null) {
+          item['PRE_ITM'] = d.preItm;
+        }
+        return item;
       }).toList(),
     };
   }
@@ -968,6 +971,9 @@ class _ExpenseEditPageState extends ConsumerState<ExpenseEditPage> {
           aeNo: result.aeNo,
           aeDd: result.aeDd,
           remark: result.remark,
+          preItm: editIndex != null
+              ? expense.details[editIndex].preItm
+              : null,
           attachments: result.attachmentPaths,
           createTime: now,
           updateTime: now,

+ 6 - 0
lib/features/expense/expense_model.dart

@@ -303,6 +303,7 @@ class ExpenseDetailModel {
   final String aeNo;
   final String aeDd;
   final String remark;
+  final int? preItm;
   final int sortOrder;
   final List<String> attachments;
   final DateTime createTime;
@@ -344,6 +345,7 @@ class ExpenseDetailModel {
     this.aeNo = '',
     this.aeDd = '',
     this.remark = '',
+    this.preItm,
     this.sortOrder = 1,
     this.attachments = const [],
     required this.createTime,
@@ -389,6 +391,7 @@ class ExpenseDetailModel {
       aeNo: json['aeNo'] as String? ?? '',
       aeDd: json['aeDd'] as String? ?? '',
       remark: json['rem'] as String? ?? '',
+      preItm: json['preItm'] as int?,
       sortOrder: json['itm'] as int? ?? 1,
       attachments:
           (json['attachments'] as List<dynamic>?)
@@ -440,6 +443,7 @@ class ExpenseDetailModel {
     'aeNo': aeNo,
     'aeDd': aeDd,
     'remark': remark,
+    'preItm': preItm,
     'sortOrder': sortOrder,
     'attachments': attachments,
     'createTime': createTime.toIso8601String(),
@@ -482,6 +486,7 @@ class ExpenseDetailModel {
     String? aeNo,
     String? aeDd,
     String? remark,
+    int? preItm,
     int? sortOrder,
     List<String>? attachments,
     DateTime? createTime,
@@ -523,6 +528,7 @@ class ExpenseDetailModel {
       aeNo: aeNo ?? this.aeNo,
       aeDd: aeDd ?? this.aeDd,
       remark: remark ?? this.remark,
+      preItm: preItm ?? this.preItm,
       sortOrder: sortOrder ?? this.sortOrder,
       attachments: attachments ?? this.attachments,
       createTime: createTime ?? this.createTime,

+ 0 - 2
lib/features/expense_apply/expense_apply_create_page.dart

@@ -1085,10 +1085,8 @@ class _ExpenseApplyCreatePageState
         'USR': HostAppChannel.usr,
       },
       'BodyData1': _details.asMap().entries.map((e) {
-        final i = e.key;
         final d = e.value;
         return {
-          'ITM': i + 1,
           'SQ_MAN': _selEmployee?.salNo ?? '',
           'TYPE_NO': d.category,
           'AMTN_YJ': d.estimatedAmount,

+ 2 - 2
lib/features/expense_apply/expense_apply_detail_page.dart

@@ -200,7 +200,7 @@ class _ExpenseApplyDetailPageState extends ConsumerState<ExpenseApplyDetailPage>
     final approvalStatus = _billStatus?['approvalStatus'] as String?;
 
     if (isTransferred) {
-      return StatusBanner(icon: Icons.swap_horiz, statusText: l10n.get('statusTransferred'), subText: '', color: Colors.blueGrey);
+      return StatusBanner(icon: Icons.swap_horiz, statusText: l10n.get('statusConvertedToExpense'), subText: '', color: Colors.blueGrey);
     }
     switch (approvalStatus) {
       case 'SHCOUNT4':
@@ -244,7 +244,7 @@ class _ExpenseApplyDetailPageState extends ConsumerState<ExpenseApplyDetailPage>
         const SizedBox(height: 16),
         FormFieldRow(label: l10n.get('applyReason'), value: app.purpose.isNotEmpty ? app.purpose : '-', readOnly: true, showArrow: false, bold: true),
         const SizedBox(height: 16),
-        FormFieldRow(label: l10n.get('remark'), value: app.remark.isNotEmpty ? app.remark : '-', readOnly: true, showArrow: false),
+        FormFieldRow(label: l10n.get('remark'), value: app.remark.isNotEmpty ? app.remark : '-', readOnly: true, showArrow: false, bold: false),
       ],
     );
   }

+ 10 - 3
lib/features/expense_apply/expense_apply_edit_page.dart

@@ -234,6 +234,7 @@ class _ExpenseApplyEditPageState extends ConsumerState<ExpenseApplyEditPage> {
             endDate: endDateStr,
             estimatedAmount: d.estimatedAmount,
             remark: d.remark,
+            preItm: d.preItm,
           ));
         }
 
@@ -748,6 +749,7 @@ class _ExpenseApplyEditPageState extends ConsumerState<ExpenseApplyEditPage> {
             endDate: result.endDate,
             estimatedAmount: result.estimatedAmount,
             remark: result.remark,
+            preItm: editIndex != null ? _details[editIndex].preItm : null,
           );
           if (editIndex != null) {
             _details[editIndex] = item;
@@ -877,10 +879,9 @@ class _ExpenseApplyEditPageState extends ConsumerState<ExpenseApplyEditPage> {
         'USR': HostAppChannel.usr,
       },
       'BodyData1': _details.asMap().entries.map((e) {
-        final i = e.key;
         final d = e.value;
-        return {
-          'ITM': i + 1,
+        final item = <String, dynamic>{
+          'AE_NO': _billNo,
           'SQ_MAN': _selEmployee?.salNo ?? '',
           'TYPE_NO': d.category,
           'AMTN_YJ': d.estimatedAmount,
@@ -891,6 +892,10 @@ class _ExpenseApplyEditPageState extends ConsumerState<ExpenseApplyEditPage> {
           'END_DD': d.endDate,
           'REM': d.remark.isNotEmpty ? d.remark : d.purpose,
         };
+        if (d.preItm != null) {
+          item['PRE_ITM'] = d.preItm;
+        }
+        return item;
       }).toList(),
     };
   }
@@ -1024,6 +1029,7 @@ class _DetailItem {
   final String endDate;
   final double estimatedAmount;
   final String remark;
+  final int? preItm;
   const _DetailItem({
     required this.id,
     required this.category,
@@ -1039,5 +1045,6 @@ class _DetailItem {
     required this.endDate,
     required this.estimatedAmount,
     required this.remark,
+    this.preItm,
   });
 }

+ 2 - 2
lib/features/expense_apply/expense_apply_list_page.dart

@@ -202,7 +202,7 @@ class _ExpenseApplyListContent extends ConsumerWidget {
               Container(
                 padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
                 decoration: BoxDecoration(color: tagBg, borderRadius: BorderRadius.circular(4)),
-                child: Text(l10n.get('statusTransferred'), style: TextStyle(fontSize: 11, color: tagFg)),
+                child: Text(l10n.get('statusConvertedToExpense'), style: TextStyle(fontSize: 11, color: tagFg)),
               ),
             if (m.isTransferred == 1) const SizedBox(width: 6),
             _buildUrgencyChip(m.urgency, l10n, colors),
@@ -228,7 +228,7 @@ class _ExpenseApplyListContent extends ConsumerWidget {
             Container(
               padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
               decoration: BoxDecoration(color: tagBg, borderRadius: BorderRadius.circular(4)),
-              child: Text(l10n.get('statusTransferred'), style: TextStyle(fontSize: 11, color: tagFg)),
+              child: Text(l10n.get('statusConvertedToExpense'), style: TextStyle(fontSize: 11, color: tagFg)),
             ),
           if (m.isTransferred == 1) const SizedBox(width: 6),
           _buildUrgencyChip(m.urgency, l10n, colors),

+ 4 - 0
lib/features/expense_apply/expense_apply_model.dart

@@ -248,6 +248,7 @@ class ExpenseApplyDetailModel {
   final double estimatedAmount;
   final String bxNo;
   final String remark;
+  final int? preItm;
   final int sortOrder;
   final DateTime createTime;
   final DateTime updateTime;
@@ -272,6 +273,7 @@ class ExpenseApplyDetailModel {
     this.estimatedAmount = 0.0,
     this.bxNo = '',
     this.remark = '',
+    this.preItm,
     this.sortOrder = 1,
     required this.createTime,
     required this.updateTime,
@@ -300,6 +302,7 @@ class ExpenseApplyDetailModel {
       estimatedAmount: (json['amtnYj'] as num?)?.toDouble() ?? 0.0,
       bxNo: json['bxNo'] as String? ?? '',
       remark: json['rem'] as String? ?? '',
+      preItm: json['preItm'] as int?,
       sqMan: json['sqMan'] as String? ?? '',
       sqName: json['sqName'] as String? ?? '',
       sortOrder: json['itm'] as int? ?? 1,
@@ -332,6 +335,7 @@ class ExpenseApplyDetailModel {
     'estimatedAmount': estimatedAmount,
     'bxNo': bxNo,
     'remark': remark,
+    'preItm': preItm,
     'sortOrder': sortOrder,
     'createTime': createTime.toIso8601String(),
     'updateTime': updateTime.toIso8601String(),