ソースを参照

修改机票新

liuhj 1 ヶ月 前
コミット
ea4b6ffc97
共有2 個のファイルを変更した61 個の追加14 個の削除を含む
  1. 3 3
      src/components/OP/NewAirTicket.vue
  2. 58 11
      src/store/flightParser.js

+ 3 - 3
src/components/OP/NewAirTicket.vue

@@ -1391,9 +1391,9 @@ export default {
                 flightsDate: this.formatFlightDate(infoitem),
                 flightsTime: (infoitem.departureTime && infoitem.departureTime.formatted) || '',
                 arrivedTime: (infoitem.arrivalTime && infoitem.arrivalTime.formatted) || '',
-                departureTerminal: infoitem.bookingCode || '',
-                arrivalTerminal: infoitem.terminal || '',
-                aircraftType: infoitem.aircraft || '',
+                departureTerminal: infoitem.cfhzl || '无',
+                arrivalTerminal: infoitem.ddhzl || '无',
+                aircraftType: infoitem.aircraft || '',
                 duration: (infoitem.duration && infoitem.duration.formatted) || '',
             };
         },

+ 58 - 11
src/store/flightParser.js

@@ -71,9 +71,9 @@ function isBlackScreenFormat(parts) {
 
 /**
  * 是否使用新增黑屏解析器。
- * - 7/13/14等原逻辑不支持的黑屏字段数直接启用
- * - 10/11字段若第3列才是日期,原解析会错位,启用
+ * - 9/10/11等字段若第2列为舱位、第3列才是日期,原解析会错位,启用
  * - 12字段保留原 parseFormat12;仅当扩展字段中出现 T2--、--T2、T1 等航站楼标识时启用
+ * - 7/13/14等原逻辑不支持的黑屏字段数直接启用
  */
 function shouldUseBlackScreenParser(parts) {
   if (!isBlackScreenFormat(parts)) return false
@@ -82,7 +82,7 @@ function shouldUseBlackScreenParser(parts) {
     return parts.slice(7).some(isTerminalToken)
   }
 
-  return parts.length !== 9
+  return true
 }
 
 /**
@@ -137,6 +137,8 @@ function parseBlackScreenFormat(parts) {
     arrivalTime,
     terminal: terminalInfo.arrivalTerminal,
     bookingCode: terminalInfo.departureTerminal,
+    departureTerminal: terminalInfo.departureTerminal,
+    arrivalTerminal: terminalInfo.arrivalTerminal,
     aircraft,
     duration,
     plusDays,
@@ -144,7 +146,7 @@ function parseBlackScreenFormat(parts) {
     statusCode,
     stopCount,
     serviceClass,
-    sequence,
+    sequence: sequence || terminalInfo.terminalSequence,
     blackScreenExtras: extras
   })
 }
@@ -156,6 +158,9 @@ function parseBlackScreenFormat(parts) {
 function isTerminalToken(value) {
   return /^T\d+--$/.test(value) ||
     /^--T\d+$/.test(value) ||
+    /^T\d+--T\d+$/.test(value) ||
+    /^T\d+-T\d+$/.test(value) ||
+    /^T\d+\/T\d+$/.test(value) ||
     /^T\d+$/.test(value) ||
     /^T\d+T\d+$/.test(value)
 }
@@ -163,27 +168,61 @@ function isTerminalToken(value) {
 function parseBlackScreenTerminals(extras) {
   let departureTerminal = ''
   let arrivalTerminal = ''
+  let terminalSequence = ''
 
   extras.forEach(item => {
     if (/^T\d+--$/.test(item)) {
-      departureTerminal = item.replace('--', '')
+      departureTerminal = normalizeTerminalCode(item.replace('--', ''))
     } else if (/^--T\d+$/.test(item)) {
-      arrivalTerminal = item.replace('--', '')
+      arrivalTerminal = normalizeTerminalCode(item.replace('--', ''))
+    } else if (/^T\d+--T\d+$/.test(item)) {
+      const terminals = item.split('--')
+      departureTerminal = normalizeTerminalCode(terminals[0]) || departureTerminal
+      arrivalTerminal = normalizeTerminalCode(terminals[1]) || arrivalTerminal
+    } else if (/^T\d+-T\d+$/.test(item)) {
+      const terminals = item.split('-')
+      departureTerminal = normalizeTerminalCode(terminals[0]) || departureTerminal
+      arrivalTerminal = normalizeTerminalCode(terminals[1]) || arrivalTerminal
+    } else if (/^T\d+\/T\d+$/.test(item)) {
+      const terminals = item.split('/')
+      departureTerminal = normalizeTerminalCode(terminals[0]) || departureTerminal
+      arrivalTerminal = normalizeTerminalCode(terminals[1]) || arrivalTerminal
+    } else if (/^T\d{2}$/.test(item)) {
+      arrivalTerminal = normalizeTerminalCode(item.slice(0, 2))
+      terminalSequence = item.slice(2)
     } else if (/^T\d+$/.test(item)) {
-      arrivalTerminal = item
+      arrivalTerminal = normalizeTerminalCode(item)
     } else if (/^T\d+T\d+$/.test(item)) {
       const terminals = item.match(/T\d+/g) || []
-      departureTerminal = terminals[0] || departureTerminal
-      arrivalTerminal = terminals[1] || arrivalTerminal
+      departureTerminal = normalizeTerminalCode(terminals[0]) || departureTerminal
+      arrivalTerminal = normalizeTerminalCode(terminals[1]) || arrivalTerminal
     }
   })
 
   return {
     departureTerminal,
-    arrivalTerminal
+    arrivalTerminal,
+    terminalSequence
   }
 }
 
+function normalizeTerminalCode(value) {
+  if (value === undefined || value === null) return ''
+
+  const terminal = String(value).trim()
+  if (!terminal) return ''
+
+  if (/^T\d+$/i.test(terminal)) {
+    return terminal.toUpperCase()
+  }
+
+  if (/^\d+$/.test(terminal)) {
+    return 'T' + terminal
+  }
+
+  return terminal
+}
+
 /**
  * 解析9字段格式(最常用)
  * CA878 SA31MAY CPHPEK 1905 1000+1 3 T3 359 08H55M
@@ -356,9 +395,14 @@ function buildFlightInfo(params) {
   const {
     flightNumber, actionCode, dateStr, origin, destination,
     departureTime, arrivalTime, terminal, bookingCode, aircraft, duration,
-    plusDays = 0, cabin, statusCode, stopCount, serviceClass, sequence
+    plusDays = 0, cabin, statusCode, stopCount, serviceClass, sequence,
+    departureTerminal, arrivalTerminal
   } = params
   
+  const finalDepartureTerminal = normalizeTerminalCode(departureTerminal !== undefined ? departureTerminal : '')
+  const finalArrivalTerminal = normalizeTerminalCode(arrivalTerminal !== undefined ? arrivalTerminal : terminal)
+  const finalArriveTerminal = finalArrivalTerminal
+  
   // 解析日期
   const day = parseInt(dateStr.slice(0, 2))
   const monthStr = dateStr.slice(2)
@@ -432,6 +476,9 @@ function buildFlightInfo(params) {
       formatted: formatTime(arrHour, arrMinute)
     },
     terminal: terminal,
+    cfhzl: finalDepartureTerminal,
+    ddhzl: finalArrivalTerminal,
+    ddTerminal: finalArrivalTerminal,
     cabin: cabin,
     statusCode: statusCode,
     stopCount: stopCount,