Browse Source

fix: 请休假记录时长字段支持「X小时」格式自动换算天数

simonlll 1 month ago
parent
commit
3b14d6221c

+ 26 - 1
airport-ledger/src/main/java/com/sundot/airport/ledger/service/impl/LedgerCombinedImportServiceImpl.java

@@ -502,6 +502,7 @@ public class LedgerCombinedImportServiceImpl implements ILedgerCombinedImportSer
502 502
 
503 503
     /** 14. 请、休假记录表(特殊)→ ledger_leave_special
504 504
      * R2: 姓名(0) 班组(1) 时间(起)(2) 时间(止)(3) 休假类别(4) 天数/时长(5)
505
+     * 天数/时长列可能是纯数字(天)或"X小时"格式;小时值按8小时/天换算成天数
505 506
      */
506 507
     private int doLeaveSpecial(Sheet sheet, String username) {
507 508
         List<LedgerLeaveSpecial> list = new ArrayList<>();
@@ -512,7 +513,7 @@ public class LedgerCombinedImportServiceImpl implements ILedgerCombinedImportSer
512 513
             o.setLeaveType(str(c, 4));
513 514
             o.setStartDate(date(c, 2));
514 515
             o.setEndDate(date(c, 3));
515
-            o.setDays(decimal(c, 5));
516
+            o.setDays(hoursOrDays(c, 5));
516 517
             o.setCreateBy(username);
517 518
             list.add(o);
518 519
         }
@@ -786,6 +787,30 @@ public class LedgerCombinedImportServiceImpl implements ILedgerCombinedImportSer
786 787
         return d == null ? null : d.intValue();
787 788
     }
788 789
 
790
+    /**
791
+     * 解析天数/时长列:
792
+     *   纯数字 → 直接作为天数
793
+     *   "X小时" → X / 8,保留4位小数(如4小时→0.5000,7小时→0.8750)
794
+     *   "X天"   → 去掉"天"后解析
795
+     */
796
+    private BigDecimal hoursOrDays(Object[] c, int idx) {
797
+        if (idx >= c.length || c[idx] == null) return null;
798
+        Object v = c[idx];
799
+        if (v instanceof Double) return BigDecimal.valueOf((Double) v);
800
+        String s = v.toString().trim();
801
+        if (s.isEmpty()) return null;
802
+        if (s.contains("小时")) {
803
+            String num = s.replace("小时", "").trim();
804
+            try {
805
+                return new BigDecimal(num).divide(BigDecimal.valueOf(8), 4, java.math.RoundingMode.HALF_UP);
806
+            } catch (Exception e) { return null; }
807
+        }
808
+        if (s.contains("天")) {
809
+            s = s.replace("天", "").trim();
810
+        }
811
+        try { return new BigDecimal(s); } catch (Exception e) { return null; }
812
+    }
813
+
789 814
     // ════════════════════════════════════════════════════════════════
790 815
     //  按时间范围清理全部台账表
791 816
     // ════════════════════════════════════════════════════════════════