Forráskód Böngészése

fix: 兼容航信返回的无秒日期格式 yyyy-MM-dd HH:mm

- 航信 API 返回的 ticketDate 可能为 "2026-06-03 13:12" (无秒)
- 自动补齐 ":00" 后再解析,同时处理 null 情况

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 3 napja
szülő
commit
bb440a217b

+ 28 - 10
service/src/main/java/com/kym/service/miniapp/HuapiaoerInvoiceService.java

@@ -41,7 +41,8 @@ public class HuapiaoerInvoiceService {
     private final InvoiceDetailService invoiceDetailService;
 
     private HuapiaoerClient client;
-    private String issuerId;
+    private volatile String issuerId;
+    private volatile boolean issuerIdTried;
 
     @PostConstruct
     public void init() {
@@ -51,15 +52,26 @@ public class HuapiaoerInvoiceService {
                         .appSecret(properties.getAppSecret())
                         .build()
         );
-        try {
-            var drawers = client.getDrawerIdList(properties.getNsrsbh());
-            if (!drawers.isEmpty()) {
-                this.issuerId = drawers.get(0).getIssuerid();
-                log.info("航信开票人初始化完成, issuerId:{}", this.issuerId);
+    }
+
+    private String getIssuerId() {
+        if (!issuerIdTried) {
+            synchronized (this) {
+                if (!issuerIdTried) {
+                    issuerIdTried = true;
+                    try {
+                        var drawers = client.getDrawerIdList(properties.getNsrsbh());
+                        if (!drawers.isEmpty()) {
+                            issuerId = drawers.get(0).getIssuerid();
+                            log.info("航信开票人获取成功, nsrsbh:{}, issuerId:{}", properties.getNsrsbh(), issuerId);
+                        }
+                    } catch (Exception e) {
+                        log.warn("获取航信开票人列表失败, nsrsbh:{}, msg:{}", properties.getNsrsbh(), e.getMessage());
+                    }
+                }
             }
-        } catch (Exception e) {
-            log.error("获取航信开票人列表失败", e);
         }
+        return issuerId;
     }
 
     /**
@@ -171,7 +183,13 @@ public class HuapiaoerInvoiceService {
         try {
             DynamicDataSourceContextHolder.push("db-admin");
 
-            var fapiaoTime = DateUtil.parse(result.getTicketDate(), "yyyy-MM-dd HH:mm:ss").toLocalDateTime();
+            var ticketDate = result.getTicketDate();
+            if (ticketDate != null && ticketDate.length() == 16) { // "yyyy-MM-dd HH:mm" = 16 chars, pad to 19
+                ticketDate += ":00";
+            }
+            var fapiaoTime = ticketDate != null
+                    ? DateUtil.parse(ticketDate, "yyyy-MM-dd HH:mm:ss").toLocalDateTime()
+                    : LocalDateTime.now();
             var totalAmount = (int) (Double.parseDouble(result.getTicketTotalAmountHasTax()) * 100);
 
             var blueFapiao = new FapiaoApplications.FapiaoInfo();
@@ -266,7 +284,7 @@ public class HuapiaoerInvoiceService {
                 .setInvoiceTypeCode(invoiceTypeCode);
 
         return new OpenBlueInvoiceRequest()
-                .setIssuerid(issuerId)
+                .setIssuerid(getIssuerId())
                 .setHead(head)
                 .setDetails(details)
                 .setTradeinfo(new OpenBlueInvoiceRequest.TradeInfo()