コード例 #1
0
ファイル: PNRImport2.cs プロジェクト: 842549829/Pool
 protected override void ValidateBusinessParameters()
 {
     if (string.IsNullOrWhiteSpace(_pnrContext))
     {
         throw new InterfaceInvokeException("8", "编码内容");
     }
     _pnr = Parser.GetPNRDetail(_pnrContext);
     if (_pnr == null)
     {
         throw new InterfaceInvokeException("1", "编码内容");
     }
     if (DataTransferObject.Common.PNRPair.IsNullOrEmpty(_pnr.Code))
     {
         throw new InterfaceInvokeException("1", "内容中缺少编码");
     }
     if (string.IsNullOrWhiteSpace(_pnr.Code.PNR) && string.IsNullOrWhiteSpace(_pnr.Code.BPNR))
     {
         throw new InterfaceInvokeException("1", "编码信息不全");
     }
 }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="pnrContent"></param>
        /// <returns></returns>
        public static IssuedPNR GetPNRDetail(string pnrContent)
        {
            IssuedPNR issuedPNR = null;
            string    tempStr   = null;

            //将已经出过票的信息出票信息替换掉;
            pnrContent = pnrContent.Replace("  **ELECTRONIC TICKET PNR** ;", "");

            // 取得第一行;
            Regex pattern = new Regex(RegexUtil.CodeLineRegex);
            Match match   = pattern.Match(pnrContent);

            if (!match.Success)
            {
                if (IsCanceledPNR(pnrContent))
                {
                    issuedPNR            = new IssuedPNR();
                    issuedPNR.IsCanceled = true;
                }
                return(issuedPNR);
            }
            else
            {
                issuedPNR            = new IssuedPNR();
                issuedPNR.IsCanceled = false;
                tempStr = match.Captures[0].Value;
            }

            issuedPNR.IsTeam = GetPassengerConsistsType(pnrContent) == PassengerConsistsType.Group;
            if (issuedPNR.IsTeam)
            {
                pattern = new Regex(RegexUtil.TeamRegex);
                match   = pattern.Match(pnrContent);
                issuedPNR.NumberOfTerm = int.Parse(match.Groups["ActualNumber"].Value);
            }
            else
            {
                // 如果是非团队,去空格后去掉最后的编码部分;
                tempStr = tempStr.Trim();
                tempStr = Regex.Replace(tempStr, RegexUtil.PNRCodeRegex + @"$", "");
            }

            issuedPNR.Code = GetPnrPair(pnrContent);

            #region  称组
            pattern = new Regex(RegexUtil.NMCmdRegex);
            tempStr = Regex.Replace(tempStr, @"(\s{1,})?;", "");
            MatchCollection matchCollection = pattern.Matches(tempStr);
            if (matchCollection.Count > 0)
            {
                issuedPNR.Passenges = new Dictionary <int, Passenger>();
                foreach (Match item in matchCollection)
                {
                    Passenger passenger  = new Passenger();
                    int       lineNumber = int.Parse(item.Groups["LineNumber"].Value);
                    passenger.Name = item.Groups["Name"].Value;
                    passenger.Type = (item.Groups["PassengerType"].Value == "CHD") ? PassengerType.Child : PassengerType.Adult;
                    issuedPNR.Passenges.Add(lineNumber, passenger);
                }
            }
            else
            {
                throw new CustomException("编码内容错误,姓名项不存在!");
            }
            #endregion

            #region 航段
            pattern         = new Regex(RegexUtil.SSCmdRegex);
            matchCollection = pattern.Matches(pnrContent);
            if (matchCollection.Count > 0)
            {
                issuedPNR.Segments = new Dictionary <int, Segment>();

                foreach (Match item in matchCollection)
                {
                    int     id      = int.Parse(item.Groups["LineNumber"].Value);
                    Segment segment = new Segment();
                    segment.AirlineCode         = item.Groups["AirlineCode"].Value;
                    segment.InternalNo          = item.Groups["FlightNo"].Value;
                    segment.CabinSeat           = item.Groups["CabinSeat"].Value;
                    segment.AirportPair         = new AirportPair(item.Groups["Departure"].Value, item.Groups["Arrival"].Value);
                    segment.Date                = DateTime.Parse(item.Groups["Day"].Value + item.Groups["Month"].Value, new CultureInfo("en-US"));
                    segment.Status              = item.Groups["SeatStatus"].Value;
                    segment.SeatCount           = int.Parse(item.Groups["SeatCount"].Value);
                    segment.IsETicket           = (item.Groups["ETicketFlag"].Value == "E");
                    segment.AircraftType        = item.Groups["AircraftType"].Value;
                    segment.IsShared            = (item.Groups["IsShared"].Value == "*");
                    segment.TerminalOfArrival   = item.Groups["TerminalOfArrival"].Value;
                    segment.TerminalOfDeparture = item.Groups["TerminalOfDeparture"].Value;

                    string extendedInfo = item.Groups["ExtendedInformation"].Value;

                    //转出来的日期,默认是当年的,如果跨年,则加一;
                    if (segment.Date < DateTime.Today)
                    {
                        segment.Date = segment.Date.AddYears(1);
                    }

                    //出发时间有可能为OPEN,此时时间不赋值;
                    string departureTime = item.Groups["DepartureTime"].Value;
                    if (departureTime != "OPEN")
                    {
                        int hour   = int.Parse(departureTime.Substring(0, 2));
                        int minute = int.Parse(departureTime.Substring(2, 2));
                        segment.DepartureTime = new Time(hour, minute);
                    }
                    // 到达时间有可能为OPEN,此时时间不赋值,同时注意,到达时间有可能跨天;
                    string ArrivalTime = item.Groups["ArrivalTime"].Value;
                    //先取下是否跨天;
                    string days = item.Groups["AddDays"].Value;
                    segment.AddDays = string.IsNullOrWhiteSpace(days) ? 0 : int.Parse(days);
                    if (departureTime != "OPEN")
                    {
                        int hour   = int.Parse(ArrivalTime.Substring(0, 2));
                        int minite = int.Parse(ArrivalTime.Substring(2, 2));
                        segment.ArrivalTime = new Time(hour, minite);
                    }

                    // 对扩展信息的处理,没有用正则;
                    // 2.  8L9933 M   WE14NOV  KMGLUM HK1   1310 1405      E      M1
                    // 6. *MU9287 V   TH22NOV  TSNKMG RR5   1710 2030      E      OP-FM9287
                    Match extendedMatch;
                    if (!string.IsNullOrEmpty(extendedInfo.Trim()) && (extendedMatch = Regex.Match(extendedInfo.Trim(), @"^(?<CabinSeat>[A-Z]\d)$")).Success)
                    {
                        segment.CabinSeat = extendedMatch.Groups["CabinSeat"].Value;
                    }

                    issuedPNR.Segments.Add(id, segment);
                }
            }
            #endregion

            #region 行程类型
            // 获取一个按照飞行时间排序的列表
            var voyages = issuedPNR.Segments.OrderBy(s => s.Value.Date).Select(s => s.Value.AirportPair).ToList();

            issuedPNR.ItineraryType = GetItineraryType(voyages);
            #endregion

            #region 缺口程搭桥信息处理
            if (issuedPNR.ItineraryType == ItineraryType.Notch)
            {
                // 生成一个包含搭桥信息的键值列表;
                Dictionary <int, AirportPair> temp = issuedPNR.Segments.OrderBy(s => s.Value.Date).Select(s => s).ToDictionary(s => s.Key, s => s.Value.AirportPair);
                pattern         = new Regex(RegexUtil.SARegex);
                matchCollection = pattern.Matches(pnrContent);
                foreach (Match item in matchCollection)
                {
                    int         key         = int.Parse(item.Groups["LineNumber"].Value);
                    AirportPair airportPair = new AirportPair(item.Groups["Departure"].Value, item.Groups["Arrival"].Value);
                    temp.Add(key, airportPair);
                }
                voyages = temp.OrderBy(s => s.Key).Select(s => s.Value).ToList();

                // 判断搭桥后的行程是否连续;
                issuedPNR.IsFilled = IsContinuousVoyages(voyages);
            }
            else
            {
                issuedPNR.IsFilled = false;
            }
            #endregion

            #region 票号
            pattern         = new Regex(RegexUtil.PNRTicketsRegex);
            matchCollection = pattern.Matches(pnrContent);
            if (matchCollection.Count > 0)
            {
                issuedPNR.TicketNumbers = new Dictionary <int, string>();

                foreach (Match item in matchCollection)
                {
                    int    lineNumber   = int.Parse(item.Groups["LineNumber"].Value);
                    int    key          = int.Parse(item.Groups["PassengerId"].Value);
                    string ticketNumber = item.Groups["TicketNumber"].Value;
                    if (issuedPNR.Passenges[key].TicketNumbers == null)
                    {
                        issuedPNR.Passenges[key].TicketNumbers = new List <string>();
                    }
                    issuedPNR.Passenges[key].TicketNumbers.Add(ticketNumber);
                    issuedPNR.TicketNumbers.Add(lineNumber, ticketNumber);
                }
            }
            #endregion

            #region 特殊信息
            pattern         = new Regex(RegexUtil.SSRCmdRegex);
            matchCollection = pattern.Matches(pnrContent);
            if (matchCollection.Count > 0)
            {
                issuedPNR.CertificateNumbers = new Dictionary <int, string>();
                foreach (Match item in matchCollection)
                {
                    int    lineNumber        = int.Parse(item.Groups["LineNumber"].Value);
                    int    key               = int.Parse(item.Groups["PassengerId"].Value);
                    string certificateNumber = item.Groups["CertificateNumber"].Value;
                    issuedPNR.Passenges[key].CertificateNumber = certificateNumber;
                    issuedPNR.CertificateNumbers.Add(lineNumber, certificateNumber);
                }
            }

            // 南航儿童票处理
            pattern         = new Regex(RegexUtil.CZChildSSRRegex);
            matchCollection = pattern.Matches(pnrContent);
            if (issuedPNR.Segments.First().Value.AirlineCode == "CZ" && matchCollection.Count > 0)
            {
                foreach (Match item in matchCollection)
                {
                    int key = int.Parse(item.Groups["PassengerId"].Value);
                    issuedPNR.Passenges[key].Type = PassengerType.Child;
                }
            }


            #endregion

            #region 票价组
            pattern = new Regex(RegexUtil.PriceRegExp);
            match   = pattern.Match(pnrContent);
            if (match.Success)
            {
                issuedPNR.Price      = new PriceView();
                issuedPNR.Price.Fare = decimal.Parse(match.Groups["Fare"].Value);
                if (!string.IsNullOrEmpty(match.Groups["AirportTax"].Value))
                {
                    issuedPNR.Price.AirportTax = decimal.Parse(match.Groups["AirportTax"].Value);
                }
                else
                {
                    issuedPNR.Price.AirportTax = 0;
                }

                issuedPNR.Price.BunkerAdjustmentFactor = decimal.Parse(match.Groups["BunkerAdjustmentFactor"].Value);
                issuedPNR.Price.Total = decimal.Parse(match.Groups["Total"].Value);
            }
            #endregion

            #region 联系组
            pattern         = new Regex(RegexUtil.CTCmdRegex);
            matchCollection = pattern.Matches(pnrContent);
            if (matchCollection.Count > 0)
            {
                issuedPNR.ContractInformations = new Dictionary <int, string>();
                foreach (Match item in matchCollection)
                {
                    int    lineNumber  = int.Parse(item.Groups["LineNumber"].Value);
                    string phoneNumber = item.Groups["PhoneNumber"].Value;
                    issuedPNR.ContractInformations.Add(lineNumber, phoneNumber);
                }
            }
            #endregion

            #region 特殊服务组
            pattern         = new Regex(RegexUtil.OSICmdRegex);
            matchCollection = pattern.Matches(pnrContent);
            if (matchCollection.Count > 0)
            {
                int ctctCount = 0;
                foreach (Match item in matchCollection)
                {
                    if (item.Groups["OSIType"].Value == "CTCT")
                    {
                        ctctCount++;
                        // 这个是防止用户多输内容
                        if (ctctCount > issuedPNR.Passenges.Count)
                        {
                            break;
                        }
                        int    lineNumber  = int.Parse(item.Groups["LineNumber"].Value);
                        string mobilephone = item.Groups["PassengerInformation"].Value;
                        //有可能操作时不书写用户对应编号,即如下格式:
                        //7.OSI MU CTCT 13529033863,而非7.OSI MU CTCT 13529033863/P1
                        if (!string.IsNullOrEmpty(item.Groups["PassengerId"].Value))
                        {
                            int key = int.Parse(item.Groups["PassengerId"].Value);
                            issuedPNR.Passenges[key].Mobilephone = mobilephone;
                        }
                        else
                        {
                            //给默认值,以循环计数器为默认值,即依次赋值;
                            issuedPNR.Passenges[ctctCount].Mobilephone = mobilephone;
                        }
                    }
                    else if (item.Groups["OSIType"].Value == "CTC")
                    {
                        int    lineNumber  = int.Parse(item.Groups["LineNumber"].Value);
                        string phoneNumber = item.Groups["PassengerInformation"].Value;

                        if (issuedPNR.ContractInformations == null)
                        {
                            issuedPNR.ContractInformations = new Dictionary <int, string>();
                        }

                        issuedPNR.ContractInformations.Add(lineNumber, phoneNumber);
                    }
                    else
                    {
                    }
                }
            }
            #endregion

            return(issuedPNR);
        }