Example #1
0
        ///////////////////////

        #region 班次時刻表

        // 取得航班時刻表
        //public static List<TrafficTimeTableModel> GetApkgTimeTable(string prod_no, DateTime s_date, string carrier_code, int total_psg)//, bool IsAEOneWayForce = false)
        //{
        //	List<TrafficTimeTableModel> time_tables = new List<TrafficTimeTableModel>();

        //	try
        //	{
        //		// 列出有關航假航段內容
        //		var apkg_sectors = sectors.Where(s => s.TRAFFIC_TYPE == "0001" && GetQtyTypeRule(s.CARRIER_CODE) == "CRS").ToList();
        //		time_tables.AddRange(QueryCrsTimeTable(carrier_code, s_date, apkg_sectors, total_psg));

        //		// 非航假航段內容
        //		var other_sectors = sectors.Where(s => !apkg_sectors.Contains(s)).ToList();
        //		time_tables.AddRange(QueryTimeTable(prod_no, s_date, null, other_sectors));
        //	}
        //	catch (Exception ex)
        //	{
        //		Website.Instance.logger.FatalFormat("{0},{1}", ex.Message, ex.StackTrace);
        //	}

        //	return time_tables;
        //}

        // 查詢 DPKG CRS, 取得航班時刻
        protected static List <TrafficTimeTableModel> QueryCrsTimeTable(DateTime s_date, DateTime e_date, TrafficSectorModel sector, int total_psg)       //(string carrier_code, DateTime S_DATE, string cityfrom, string cityto, int total_psg)
        {
            List <TrafficTimeTableModel> time_tables = new List <TrafficTimeTableModel>();

            try
            {
                var soapClients = Website.Instance.Configuration.GetSection("SoapClient");
                var binding     = new BasicHttpBinding(BasicHttpSecurityMode.Transport)
                {
                    MaxReceivedMessageSize = Int32.MaxValue
                };
                var ep = new EndpointAddress(soapClients["WS_DPKG_CRS"]);
                WS_DPKG_CRS.CrsServiceSoapClient crs_service = new WS_DPKG_CRS.CrsServiceSoapClient(binding, ep);

                Request_GetAv reqGetAv = new Request_GetAv();
                reqGetAv.CrsSystem = sector.CARRIER_CODE.Equals("B7") ? CrsSystemOption.B7 : sector.CARRIER_CODE.Equals("AE") ? CrsSystemOption.AE : CrsSystemOption.GE;
                if (sector.CARRIER_CODE == "AE")
                {
                    reqGetAv.Rule_Type = sector.RULE_TYPE;
                }

                List <Segment> dep_seg = new List <Segment>();


                dep_seg.Add(new Segment()
                {
                    Airline  = sector.CARRIER_CODE,
                    TripFlag = sector.FORWARD_FLAG,

                    DepartureDate    = e_date.ToString("yyyyMMdd"),
                    DepartureTime    = "0000",
                    DepartureAirport = sector.DEP_FROM,

                    ArrivalDate      = s_date.ToString("yyyyMMdd"),
                    ArrivalTime      = "2359",
                    ArrivalAirport   = sector.ARR_TO,
                    BookingSeatCount = total_psg
                });



                List <Itinerary> _Itinerary = new List <Itinerary>();
                _Itinerary.Add(new Itinerary()
                {
                    Segment = dep_seg.ToArray()
                });

                reqGetAv.Itinerary = _Itinerary.ToArray();

                // 詢問CRSGW有效位控
                string xmlResp = GetAvTask(crs_service, XMLTool.XMLSerialize(reqGetAv)).Result;


                Response_GetAv respGetAv = new Response_GetAv();
                respGetAv = (Response_GetAv)XMLTool.XMLDeSerialize(xmlResp, respGetAv.GetType().ToString());

                var sel_segs = respGetAv.AvItinerary.Where(s => s.Segments != null && s.Segments.Count() > 0).SelectMany(s => s.Segments);

                // 產出 Time Table
                foreach (var seg in sel_segs)
                {
                    foreach (var item in seg.Segment)
                    {
                        var      sec       = sector.Where(s => s.DEP_FROM.Equals(item.DepartureAirport) && s.ARR_TO.Equals(item.ArrivalAirport)).FirstOrDefault();
                        DateTime dept_date = DateTime.ParseExact(item.DepartureDate, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
                        //DateTime arrv_date = DateTime.ParseExact(item.ArrivalDate, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);

                        //成本與搭乘限制
                        DataSet dtl_ds = LimitDAL.GetTrafficCostDtl(sector.TRAFFIC_COST_PRICE_XID, sector.TRAFFIC_XID, sector.TRAFFIC_COST_XID, S_DATE.ToString("yyyyMMdd"));

                        int nInvalidRules = 0;                         //未符合規則計數, 0: 通過

                        //過濾交通限制
                        if (dtl_ds.Tables[0].Rows.Count != 0)
                        {
                            // 檢查是否指定使用 FAIR_BASIS
                            var sel_fair_basis = dtl_ds.Tables[0].AsEnumerable().Where(r => !string.IsNullOrEmpty(r.Field <string>("FAIR_BASIS"))).Select(b => b.Field <string>("FAIR_BASIS")).Distinct().ToList();
                            if (sel_fair_basis.Count() > 0)
                            {
                                // 比對 FAIR_BASIS
                                if (sel_fair_basis.Where(f => f.Equals(item.FareBasis, StringComparison.InvariantCultureIgnoreCase)).Count() < 1)
                                {
                                    nInvalidRules++;                                     // 累計未符合規則
                                }
                            }

                            // 過濾無效航班規則
                            bool IsValidFlight = FilterTraffic(dr.ToDateTime("S_DATE"), item.DepartureTime.Replace(":", ""), item.FlightNumber, sector, dtl_ds.Tables[0]);
                            if (!IsValidFlight)
                            {
                                nInvalidRules++;                                             // 累計未符合規則
                            }
                        }

                        if (nInvalidRules == 0)
                        {
                            //var HL_FLAG = sector.FLY_HL_FLAG.Equals("0") ? false : true;
                            var HL_FLAG = sector.FLY_HL_FLAG;

                            // 通過過濾規則放入時刻表
                            time_tables.Add(new TrafficTimeTableModel()
                            {
                                S_DATE        = dept_date.ToString(),
                                FORWARD_FLAG  = item.TripFlag,
                                DEP_FROM_NAME = sector.DEP_FROM_NAME,
                                DEP_FROM      = item.DepartureAirport,
                                ARR_TO_NAME   = sector.ARR_TO_NAME,
                                ARR_TO        = item.ArrivalAirport,
                                FLY_NO        = item.FlightNumber,
                                DEP_FROM_TIME = item.DepartureTime,
                                ARR_TO_TIME   = item.ArrivalTime,
                                BOOKING_CLASS = item.BookingClass,
                                SEAT_COUNT    = item.BookingSeatCount.Value,
                                FARE_BASIS    = item.FareBasis,
                                CAN_HL        = HL_FLAG
                            });
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return(time_tables);
        }
Example #2
0
        // 取得交通航段
        public static List <TrafficModel> GetTrafficSectors(ProdDetailRQModel req)
        {
            List <TrafficModel> sectors = new List <TrafficModel>();

            try
            {
                // 區段 SECTOR
                DataSet sec_ds        = TrafficDAL.GetTrafficSectors(req.PRODNO, req.SDATE, req.EDATE);
                var     fw_flag       = "";
                var     accum_add_day = 0;
                var     total_psg     = req.ADULT + req.CHILD + req.CHILDNB + req.SENIOR;

                foreach (DataRow dr in sec_ds.Tables[0].Rows)
                {
                    // 檢查去/回程國定假日

                    var AddPriceWeeks = string.IsNullOrEmpty(dr.ToStringEx("ADD_PRICE_WEEKS")) ? "0000000" : dr.ToStringEx("ADD_PRICE_WEEKS");
                    var s_is_holiday  = AddPriceWeeks.Substring(Convert.ToInt32(Convert.ToDateTime(req.SDATE).DayOfWeek), 1);                    // 出發日是否為假日
                    var e_is_holiday  = AddPriceWeeks.Substring(Convert.ToInt32(Convert.ToDateTime(req.EDATE).DayOfWeek), 1);                    // 回程日是否為假日

                    s_is_holiday = (s_is_holiday.Equals("1") || NationalHolidayDAL.ChkNationalHoliday(req.SDATE)) ? "1" : "0";
                    e_is_holiday = (e_is_holiday.Equals("1") || NationalHolidayDAL.ChkNationalHoliday(req.EDATE)) ? "1" : "0";

                    var IsTripInHoliday = (dr.ToStringEx("FORWARD_FLAG").Equals("1") ? s_is_holiday : e_is_holiday).Equals("1") ? true : false;
                    var dept_date       = dr.ToStringEx("FORWARD_FLAG").Equals("1") ? req.SDATE : req.EDATE;

                    // 各段交通累積日數, 當去回程切換數值應該歸零重計
                    if (fw_flag != dr.ToStringEx("FORWARD_FLAG"))
                    {
                        accum_add_day = 0;
                        fw_flag       = dr.ToStringEx("FORWARD_FLAG");
                    }
                    accum_add_day += dr.ToInt32("ADD_DAY");

                    try
                    {
                        // 航段使用交通成本
                        TrafficSectorCostModel SectorCost = GetTrafficCost(req.PRODNO, dr.ToStringEx("DEP_FROM"), dr.ToStringEx("ARR_TO"),
                                                                           Convert.ToDateTime(dept_date), dr.ToInt64("TRAFFIC_XID"), dr.ToInt64("TRAFFIC_COST_XID"), IsTripInHoliday);
                        // 跳過無成本的交通段
                        if (SectorCost == null)
                        {
                            throw new Exception(string.Format("PROD_NO={0}, FORWARD_FLAG={1}, DATE={2}, TRAFFIC_XID={3}, TRAFFIC_COST_XID={4} 交通成本為 NULL",
                                                              req.PRODNO, dr.ToStringEx("FORWARD_FLAG"), dept_date, dr.ToInt64("TRAFFIC_XID"), dr.ToInt64("TRAFFIC_COST_XID")));
                        }

                        // 若承運商為B7, 帶入預設成本與行程代碼
                        if (dr.ToStringEx("CARRIER_CODE").Equals("B7"))
                        {
                            SectorCost.ADULT_TOURCODE  = IsTripInHoliday ? dr.ToStringEx("ADT_TOURCODE_H") : dr.ToStringEx("ADT_TOURCODE");
                            SectorCost.CHILD_TOURCODE  = IsTripInHoliday ? dr.ToStringEx("CHD_TOURCODE_H") : dr.ToStringEx("CHD_TOURCODE");
                            SectorCost.SENIOR_TOURCODE = IsTripInHoliday ? dr.ToStringEx("SEN_TOURCODE_H") : dr.ToStringEx("SEN_TOURCODE");

                            SectorCost.ADULT_FAREBASIS  = IsTripInHoliday ? dr.ToStringEx("ADT_FAREBASIS_H") : dr.ToStringEx("ADT_FAREBASIS");
                            SectorCost.CHILD_FAREBASIS  = IsTripInHoliday ? dr.ToStringEx("CHD_FAREBASIS_H") : dr.ToStringEx("CHD_FAREBASIS");
                            SectorCost.SENIOR_FAREBASIS = IsTripInHoliday ? dr.ToStringEx("SEN_FAREBASIS_H") : dr.ToStringEx("SEN_FAREBASIS");
                        }

                        #region 建構交通航段Model

                        var sec_item = new TrafficSectorModel()
                        {
                            PROD_NO                = dr.ToStringEx("PROD_NO"),
                            TRAFFIC_XID            = dr.ToStringEx("TRAFFIC_XID"),
                            TRAFFIC_COST_XID       = dr.ToStringEx("TRAFFIC_COST_XID"),
                            TRAFFIC_COST_PRICE_XID = dr.ToStringEx("TRAFFIC_COST_PRICE_XID"),

                            TRIP_WAY     = dr.ToStringEx("TRIP_WAY"),
                            FORWARD_FLAG = dr.ToStringEx("FORWARD_FLAG"),
                            SECTOR       = dr.ToInt32("SEC"),
                            TRAFFIC_TYPE = dr.ToStringEx("TRAFFIC_TYPE"),
                            CARRIER_CODE = dr.ToStringEx("CARRIER_CODE"),
                            DEP_FROM     = dr.ToStringEx("DEP_FROM"),
                            ARR_TO       = dr.ToStringEx("ARR_TO"),
                            FLY_HL_FLAG  = dr.ToStringEx("FLY_HL_FLAG"),
                            SUP_NO       = dr.ToStringEx("SUP_NO"),
                            FARE_BASIS   = dr.ToStringEx("FARE_BASIS"),
                            ARNK_FLAG    = dr.ToStringEx("ARNK_FLAG"),

                            // 票規
                            RULE_TYPE = dr.ToStringEx("RULE_TYPE"),

                            // 交通成本
                            TRAFFIC_COST = SectorCost,
                        };

                        var timetable = QueryCrsTimeTable(dr.ToDateTime("S_DATE"), dr.ToDateTime("E_DATE"), sec_item, total_psg);

                        #endregion 建構交通航段Model

                        var sector = new TrafficModel()
                        {
                            PROD_NO     = dr.ToStringEx("PROD_NO"),
                            TRAFFIC_XID = dr.ToStringEx("TRAFFIC_XID"),

                            TRIP_WAY           = dr.ToStringEx("TRIP_WAY"),
                            SECTOR             = dr.ToStringEx("SEC"),
                            TRAFFIC_TYPE       = dr.ToStringEx("TRAFFIC_TYPE"),
                            TRAFFIC_NAME       = dr.ToStringEx("CARRIER_CODE_NAME"),
                            SUP_NO             = dr.ToStringEx("SUP_NO"),
                            RETURN_FEE         = dr.ToStringEx("RETURN_FEE"),
                            RETURN_FEE_PERCENT = Convert.ToDouble(string.IsNullOrEmpty(dr.ToStringEx("RETURN_FEE_PERCENT")) ? "0" : dr.ToStringEx("RETURN_FEE_PERCENT")),
                            // 票規
                            RULE_TYPE = dr.ToStringEx("RULE_TYPE"),

                            // 交通位控
                            //TRAFFIC_QTYS = Qty,
                            // 交通時刻表
                            //TRAFFIC_TIMETBS = timetable
                        };

                        sectors.Add(sector);
                    }
                    catch (Exception ex2)
                    {
                        Website.Instance.logger.FatalFormat("{0},{1}", ex2.Message, ex2.StackTrace);
                    }
                }
            }
            catch (Exception ex)
            {
                //Website.Instance.logger.FatalFormat("{0},{1}", ex.Message, ex.StackTrace);
                throw ex;
            }

            return(sectors);
        }