/// <summary> /// 通过淘宝单号获取订单信息 /// </summary> /// <param name="taobaoOrderId"></param> /// <returns></returns> public XhotelOrderSearchResponse GetTaoBaoOrderInfo(long taobaoOrderId) { var currentDate = DateTime.Now; var request = new XhotelOrderSearchRequest { CreatedStart = currentDate.AddDays(-30), CreatedEnd = currentDate, OrderTids = taobaoOrderId.ToString() }; var response = tmallApiClient.Execute(request); return(response); }
/// <summary> /// 更新订单状态 /// </summary> /// <param name="taobaoOrderId"></param> /// <param name="status"></param> /// <param name="message"></param> /// <returns></returns> public bool UpdateTmallOrderStatus(long taobaoOrderId, int status, out string message) { var tmallApiClient = new TmallApiClient(Shop); var req = new XhotelOrderUpdateRequest(); req.Tid = taobaoOrderId; if (status == (int)OrderStatus.Confirm) { req.OptType = 2; } else if (status == (int)OrderStatus.NotSure) { req.OptType = 1; } var rsp = tmallApiClient.Execute(req); message = rsp.SubErrMsg; // shipLog.WriteOrder(taobaoOrderId.ToString(), "【更新订单状态返回结果】:{0}", JsonHelper.SerializeObject(rsp)); if (!string.IsNullOrEmpty(rsp.Result) && rsp.Result == "success") { return(true); } else { rsp = tmallApiClient.Execute(req); message = rsp.SubErrMsg; // shipLog.WriteOrder(taobaoOrderId.ToString(), "【更新订单状态返回结果】:{0}", JsonHelper.SerializeObject(rsp)); if (!string.IsNullOrEmpty(rsp.Result) && rsp.Result == "success") { return(true); } else { return(false); } } }
public BookingCheckOutDto BookingCheck(BookingCheckInputDto checkDto) { var checkKey = "dds_" + checkDto.HotelId + "_" + checkDto.RoomTypeId + "_" + checkDto.RatePlanId + "_" + checkDto.CheckIn + "_" + checkDto.CheckOut; var bookOutDto = new BookingCheckOutDto(); try { DateTime startTime = DateTime.Now; bookOutDto.DayPrice = new List <RateQuotasPrice>(); bookOutDto.IsBook = true; bookOutDto.Message = "正常可预定"; int RoomNum = 1;//库存 //RatePlanConfrimJsonEt RequestEt = new RatePlanConfrimJsonEt(); var RequestEt = new RatePlanConfrimJsonEt { HotelCode = checkDto.HotelId, RatePlanCode = checkDto.RatePlanId, RoomTypeCode = checkDto.RoomTypeId, CheckIn = checkDto.CheckIn.ToString("yyyy-MM-dd"), CheckOut = checkDto.CheckOut.ToString("yyyy-MM-dd"), NumberOfUnits = RoomNum, AdultCount = 2, ChildCount = 0 }; ///API_用户认证失败 = 401, API_内部程序出错 = 402,API_订单号已存在 = 403,API_价格不正确 = 404,API_新错误代码 = 405,程序代码出错 = 501,成功 = 200,无数据返回 = 201 //var response = daDuShiApiClient.RequestData(OperationCode.获取价格确认数据, RequestEt // , () => // { // return OrderDataOpEt.Availability(RequestEt); // }); var response = new WebServiceResponse <HotelInfoJsonEt>(); try { response = OrderDataOpEt.Availability(RequestEt); if (response == null || !response.Successful && response.ResponseEt == null || response.ResponseEt.RatePlanList.Count == 0) { RequestEt = new RatePlanConfrimJsonEt { HotelCode = checkDto.HotelId, RatePlanCode = checkDto.RatePlanId, RoomTypeCode = checkDto.RoomTypeId, CheckIn = checkDto.CheckIn.ToString("yyyy-MM-dd"), CheckOut = checkDto.CheckOut.ToString("yyyy-MM-dd"), NumberOfUnits = RoomNum, AdultCount = 1, ChildCount = 0 }; response = new WebServiceResponse <HotelInfoJsonEt>(); } } catch (Exception ex) { response = OrderDataOpEt.Availability(RequestEt); } TimeSpan ts = checkDto.CheckOut.Subtract(checkDto.CheckIn); if (response != null && response.Successful && response.ResponseEt != null && response.ResponseEt.RatePlanList.Count > 0) { bookOutDto.IsBook = true; var rate = new TaobaoRate(); try { XhotelRateGetRequest req = new XhotelRateGetRequest(); req.OutRid = checkDto.OuterId; req.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse resp = tmallApiClient.Execute(req); if (resp != null && !resp.IsError && resp.Rate != null && !string.IsNullOrWhiteSpace(resp.Rate.InventoryPrice)) { rate = JsonConvert.DeserializeObject <TaobaoRate>(resp.Rate.InventoryPrice); } } catch (Exception ex) { } bool bianhua = false; bookOutDto.DayPrice = response.ResponseEt.RatePlanList[0].RateList.Select(u => new RateQuotasPrice { Date = u.EffectiveDate, Price = (GetSalePrice(Convert.ToDateTime(u.EffectiveDate), false, u.AmountBeforeTax, rate, ref bianhua, checkDto.IsCustomer) ).ToTaoBaoPrice(), Quota = RoomNum //默认库存 }).ToList(); //记录试单信息 Task.Factory.StartNew(() => { try { bool IsFull = false; string Remark = bookOutDto.Message; if (checkDto.IsCustomer == 0) { Remark = "程序请求"; } AliTripValidate av = new AliTripValidate(); av.CheckInTime = checkDto.CheckIn; av.CheckOutTime = checkDto.CheckOut; av.RatePlanCode = checkDto.RatePlanCode; av.IsFull = IsFull; av.HotelId = checkDto.HotelId; av.RoomId = checkDto.RoomTypeId; av.RatePlanId = checkDto.RatePlanId; av.CreateTime = DateTime.Now; av.Channel = 10; av.Shop = (int)Shop; av.Remark = Remark; SqlSugarContext.RenNiXingInstance.Insertable(av).ExecuteCommand(); string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=10", checkDto.HotelId); WebHttpRequest.Get(url); } catch { } }); } else { string responseResult = "满房"; if (response != null && !response.Successful && !string.IsNullOrWhiteSpace(response.ErrMsg)) { responseResult = response.ErrMsg; } try { var falseCount = 1; var falseCacheCount = CacheHelper.GetCache("falseCount");//先读取缓存 if (checkDto.IsCustomer == 1) { if (falseCacheCount != null)//如果没有该缓存,默认为1 { falseCount = (int)falseCacheCount + 1; } CacheHelper.SetCache("falseCount", falseCount, 1800);//添加缓存 } //如果试单失败为双数直接拿缓存值输出,单数时为失败 bool tongguo = true; int NowHour = DateTime.Now.Hour; //当前时间的时数 int NowMinute = DateTime.Now.Minute; //当前时间的分钟数 //if (falseCount % 6 == 0 || checkDto.IsCustomer == 0) if (checkDto.IsCustomer == 0) { bookOutDto.Message = responseResult; bookOutDto.IsBook = false; } else if (falseCount % 4 == 0) { var rate = new TaobaoRate(); XhotelRateGetRequest req = new XhotelRateGetRequest(); req.OutRid = checkDto.OuterId; req.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse resp = tmallApiClient.Execute(req); if (resp != null && !resp.IsError && resp.Rate != null && !string.IsNullOrWhiteSpace(resp.Rate.InventoryPrice)) { rate = JsonConvert.DeserializeObject <TaobaoRate>(resp.Rate.InventoryPrice); } var totalDayNum = (int)(checkDto.CheckOut.Date - checkDto.CheckIn).TotalDays; var rates = new List <inventory_price>(); //判断是否已经更新过飞猪房态,0为没更新过,1为已更新过为不可以预定 int IsClose = 0; for (int i = 0; i < totalDayNum; i++) { var inventory_price = rate.inventory_price.Where(a => a.date == checkDto.CheckIn.AddDays(i).ToString("yyyy-MM-dd")).FirstOrDefault(); if (inventory_price.price <= 0 || inventory_price.price > 4999900) { IsClose = 1; bookOutDto.Message = responseResult; bookOutDto.IsBook = false; } else { rates.Add(inventory_price); } } if (IsClose == 0) { bookOutDto.DayPrice = rates.Select(u => new RateQuotasPrice { Date = u.date, Price = u.price, Quota = 1 }).ToList(); bookOutDto.Message = "正常可预定"; bookOutDto.IsBook = true; logWriter.Write("试单失败后通过(大都市):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, responseResult); } } else if (falseCount % 3 == 0) { var rate = new TaobaoRate(); XhotelRateGetRequest req = new XhotelRateGetRequest(); req.OutRid = checkDto.OuterId; req.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse resp = tmallApiClient.Execute(req); if (resp != null && !resp.IsError && resp.Rate != null && !string.IsNullOrWhiteSpace(resp.Rate.InventoryPrice)) { rate = JsonConvert.DeserializeObject <TaobaoRate>(resp.Rate.InventoryPrice); } var totalDayNum = (int)(checkDto.CheckOut.Date - checkDto.CheckIn).TotalDays; var rates = new List <inventory_price>(); //判断是否已经更新过飞猪房态,0为没更新过,1为已更新过为不可以预定 int IsClose = 0; for (int i = 0; i < totalDayNum; i++) { var inventory_price = rate.inventory_price.Where(a => a.date == checkDto.CheckIn.AddDays(i).ToString("yyyy-MM-dd")).FirstOrDefault(); if (inventory_price.price <= 0 || inventory_price.price > 4999900) { IsClose = 1; bookOutDto.Message = responseResult; bookOutDto.IsBook = false; } else { rates.Add(inventory_price); } } if (IsClose == 0) { Random ran = new Random(); int RandomResult = ran.Next(80, 200); bookOutDto.DayPrice = rates.Select(u => new RateQuotasPrice { Date = u.date, Price = u.price + RandomResult * 100m, Quota = 1 }).ToList(); bookOutDto.Message = "正常可预定"; bookOutDto.IsBook = true; logWriter.Write("试单失败后通过(大都市):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, responseResult); } } else { logWriter.Write("试单失败后(大都市):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, responseResult); bookOutDto.Message = responseResult; bookOutDto.IsBook = false; } } catch (Exception ex) { logWriter.Write("试单失败后报错(大都市):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败原因{3},报错{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, responseResult, ex.ToString()); bookOutDto.Message = responseResult; bookOutDto.IsBook = false; } //记录试单信息并关闭房态 Task.Factory.StartNew(() => { try { bool IsFull = true; string Remark = responseResult; if (checkDto.IsCustomer == 0) { Remark = "程序请求"; IsFull = false; } AliTripValidate av = new AliTripValidate(); av.CheckInTime = checkDto.CheckIn; av.CheckOutTime = checkDto.CheckOut; av.RatePlanCode = checkDto.RatePlanCode; av.IsFull = IsFull; av.HotelId = checkDto.HotelId; av.RoomId = checkDto.RoomTypeId; av.RatePlanId = checkDto.RatePlanId; av.CreateTime = DateTime.Now; av.Channel = 10; av.Shop = (int)Shop; av.Remark = Remark; SqlSugarContext.RenNiXingInstance.Insertable(av).ExecuteCommand(); } catch { } Thread.Sleep(5000); string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=10", checkDto.HotelId); WebHttpRequest.Get(url); }); } } catch (Exception ex) { bookOutDto.IsBook = false; bookOutDto.Message = string.Format("满房,系统异常:{0}", ex.ToString()); } if (checkDto.IsCustomer == 0) { try { BookingCheckOutDto CheckOut = new BookingCheckOutDto(); var check = CacheHelper.GetCache(checkKey); //先读取缓存 if (check != null) //如果没有该缓存 { CheckOut = Newtonsoft.Json.JsonConvert.DeserializeObject <BookingCheckOutDto>(check.ToString(), new JsonSerializerSettings { Error = delegate(object obj, Newtonsoft.Json.Serialization.ErrorEventArgs args) { args.ErrorContext.Handled = true; } }); if (CheckOut != null) { return(CheckOut); } } } catch (Exception ex) { } } CacheHelper.SetCache(checkKey, Newtonsoft.Json.JsonConvert.SerializeObject(bookOutDto), 8);//添加缓存 return(bookOutDto); }
/// <summary> /// 试单 /// </summary> /// <param name="checkDto"></param> /// <returns></returns> public BookingCheckOutDto BookingCheck(BookingCheckInputDto checkDto) { var checkKey = "xc_" + checkDto.HotelId + "_" + checkDto.RoomTypeId + "_" + checkDto.RatePlanId + "_" + checkDto.CheckIn + "_" + checkDto.CheckOut; bool isPromotion = false;//isPromotion是否为促销产品,true为促销 if (checkDto.RatePlanCode.Contains("_c")) { ctripApiClient = new CtripApiClient(Ctrip.Config.ApiConfigManager.ZhiHeC); isPromotion = true; } BookingCheckOutDto bookingCheckOut = new BookingCheckOutDto(); bookingCheckOut.IsBook = true; bookingCheckOut.Message = "正常可预定"; bookingCheckOut.DayPrice = new List <RateQuotasPrice>(); //如果查询库存为2时可以预定,折输出库存为2,否则为1 int RoomNum = checkDto.RoomNum; if (RoomNum == 1 && !isPromotion) { RoomNum = 2; } try { string lastTime = "23:59"; var resp = ctripApiClient.CheckOrderAvail(checkDto.HotelId, "501", checkDto.RatePlanId, RoomNum, 1, checkDto.CheckIn, checkDto.CheckOut, lastTime); if (resp != null && resp.AvailabilityStatus == "NoAvailability") { if (resp.Error != null && resp.Error.Message.Contains("Invalid number of rooms")) { RoomNum = 1; //Task.Factory.StartNew(() => //{ // var roomTypeService = new RoomTypeService(Shop, Entities.Enum.ProductChannel.Ctrip); // roomTypeService.ModifyRoomType(checkDto.HotelId); //}); resp = ctripApiClient.CheckOrderAvail(checkDto.HotelId, "501", checkDto.RatePlanId, RoomNum, 1, checkDto.CheckIn, checkDto.CheckOut, lastTime); } } if (resp != null && resp.AvailabilityStatus == "AvailableForSale") { if (resp.RoomStay != null && resp.RoomStay.RoomRates != null) { var rate = new TaobaoRate(); try { XhotelRateGetRequest req = new XhotelRateGetRequest(); req.OutRid = checkDto.OuterId; req.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse GetRateResp = tmallApiClient.Execute(req); if (resp != null && !GetRateResp.IsError && GetRateResp.Rate != null && !string.IsNullOrWhiteSpace(GetRateResp.Rate.InventoryPrice)) { rate = JsonConvert.DeserializeObject <TaobaoRate>(GetRateResp.Rate.InventoryPrice); } } catch (Exception ex) { } //var hotelExtension = hotelRepository.GetHotelExtension(checkDto.HotelId, (int)ProductChannel.Ctrip); var roomRates = resp.RoomStay.RoomRates.FirstOrDefault(); var isCommission = resp.RoomStay.RatePlans[0].SupplierID > 0; //获取是否为金牌酒店 decimal ctripStarRate = 0; //var ctripHotel = hotelRepository.GetCtripHotel(checkDto.HotelId); //金牌 //ctripStarRate = ctripHotel.CtripStarRate; //是否发生变价 bool bianhua = false; //是否需要马上更新 bool isUpdate = false; bookingCheckOut.DayPrice = roomRates.Rates.Select(u => new RateQuotasPrice { Date = u.EffectiveDate, Price = (GetSalePrice(Convert.ToDateTime(u.EffectiveDate), u.Cost, u.AmountBeforeTax, isCommission, rate, isPromotion, ref bianhua, ref isUpdate, ctripStarRate, checkDto.IsCustomer) ).ToTaoBaoPrice(), Quota = RoomNum//默认库存 }).ToList(); //记录试单信息 Task.Factory.StartNew(() => { try { bool IsFull = false; string Remark = bookingCheckOut.Message; if (bianhua) { Remark = "变价"; //如果为促销产品关房处理因为缓存没那么快更新完 //if(isPromotion) //{ // IsFull = true; //} } else if (checkDto.IsCustomer == 0) { Remark = "程序请求"; } AliTripValidate av = new AliTripValidate(); av.CheckInTime = checkDto.CheckIn; av.CheckOutTime = checkDto.CheckOut; av.RatePlanCode = checkDto.RatePlanCode; av.IsFull = IsFull; av.HotelId = checkDto.HotelId; av.RoomId = checkDto.RoomTypeId; av.RatePlanId = checkDto.RatePlanId; av.CreateTime = DateTime.Now; av.Channel = 8; av.Shop = (int)Shop; av.Remark = Remark; SqlSugarContext.RenNiXingInstance.Insertable(av).ExecuteCommand(); //发生变价时更新rp //if (bianhua) //{ //} //如果发生变价时先更新缓存,然后再更新飞猪报价 Task.Factory.StartNew(() => { try { if (isPromotion) { //更新促销价格缓存 string urlCtripPrice = string.Format("http://47.107.101.107:8186/CtripPricePro/CtripPromorion.ashx?key=dfiqergnsdkjdiunqebgaupsdh&code={0}&checkin={1}&checkout={2}&cache=1&account=zhpromotion&opt=update", checkDto.HotelId, DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")); WebHttpRequest.Get(urlCtripPrice); } else { //更新价格缓存 string urlCtripPrice = string.Format("http://47.107.101.107:8186/CtripPricePro/CtripPriceApi.ashx?key=dfiqergnsdkjdiunqebgaupsdh&code={0}&rids={1}&checkin={2}&checkout={3}&cache=0", checkDto.HotelId, checkDto.RatePlanId, DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")); WebHttpRequest.Get(urlCtripPrice); } } catch { } if (checkDto.IsCustomer != 0 && !isUpdate) { Thread.Sleep(13000); } string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=8", checkDto.HotelId); WebHttpRequest.Get(url); }); } catch { } }); } } else { try { var falseCount = 1; var falseCacheCount = CacheHelper.GetCache("falseCount");//先读取缓存 //记录客户请求失败次数 if (checkDto.IsCustomer == 1) { if (falseCacheCount != null)//如果没有该缓存,默认为1 { falseCount = (int)falseCacheCount + 1; } CacheHelper.SetCache("falseCount", falseCount, 1800);//添加缓存 } bool tongguo = false; //在0点15分到4点为试单失败为双数直接拿缓存值输出,其余的都通过 int NowHour = DateTime.Now.Hour; //当前时间的时数 int NowMinute = DateTime.Now.Minute; //当前时间的分钟数 if (falseCount % 2 == 0) { tongguo = true; } else if ((NowHour == 18 && NowMinute >= 30) || (NowHour < 8 && NowHour >= 19)) { if (falseCount % 2 == 0 || falseCount % 5 == 0 || falseCount % 7 == 0) { tongguo = true; } } //如果试单失败为双数直接拿缓存值输出,单数时为失败 //if (falseCount % 3 == 0) if (checkDto.IsCustomer == 0) { bookingCheckOut.Message = resp.Error.Message; bookingCheckOut.IsBook = false; } else if (tongguo) { var rate = new TaobaoRate(); XhotelRateGetRequest request = new XhotelRateGetRequest(); request.OutRid = checkDto.OuterId; request.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse response = tmallApiClient.Execute(request); if (response != null && !response.IsError && response.Rate != null && !string.IsNullOrWhiteSpace(response.Rate.InventoryPrice)) { rate = JsonConvert.DeserializeObject <TaobaoRate>(response.Rate.InventoryPrice); //try //{ // rate = JsonConvert.DeserializeObject<TaobaoRate>(response.Rate.InventoryPrice); //} //catch (Exception ex) //{ //} } var totalDayNum = (int)(checkDto.CheckOut.Date - checkDto.CheckIn).TotalDays; var rates = new List <inventory_price>(); //判断是否已经更新过飞猪房态,0为没更新过,1为已更新过为不可以预定 int IsClose = 0; for (int i = 0; i < totalDayNum; i++) { var inventory_price = rate.inventory_price.Where(a => a.date == checkDto.CheckIn.AddDays(i).ToString("yyyy-MM-dd")).FirstOrDefault(); if (inventory_price.price <= 0 || inventory_price.price > 4999900) { IsClose = 1; bookingCheckOut.Message = resp.Error.Message; bookingCheckOut.IsBook = false; } else { rates.Add(inventory_price); } } if (IsClose == 0) { bookingCheckOut.DayPrice = rates.Select(u => new RateQuotasPrice { Date = u.date, Price = u.price, Quota = 1//checkDto.RoomNum }).ToList(); bookingCheckOut.Message = "正常可预定"; bookingCheckOut.IsBook = true; //logWriter.Write("试单失败后通过(携程):试单失败-淘宝酒店id:{0},携程酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, resp.Error.Message); } } else if (falseCount % 3 == 0)//涨价处理 { var rate = new TaobaoRate(); XhotelRateGetRequest request = new XhotelRateGetRequest(); request.OutRid = checkDto.OuterId; request.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse response = tmallApiClient.Execute(request); if (response != null && !response.IsError && response.Rate != null && !string.IsNullOrWhiteSpace(response.Rate.InventoryPrice)) { rate = JsonConvert.DeserializeObject <TaobaoRate>(response.Rate.InventoryPrice); //try //{ // rate = JsonConvert.DeserializeObject<TaobaoRate>(response.Rate.InventoryPrice); //} //catch (Exception ex) //{ //} } var totalDayNum = (int)(checkDto.CheckOut.Date - checkDto.CheckIn).TotalDays; var rates = new List <inventory_price>(); //判断是否已经更新过飞猪房态,0为没更新过,1为已更新过为不可以预定 int IsClose = 0; for (int i = 0; i < totalDayNum; i++) { var inventory_price = rate.inventory_price.Where(a => a.date == checkDto.CheckIn.AddDays(i).ToString("yyyy-MM-dd")).FirstOrDefault(); if (inventory_price.price <= 0 || inventory_price.price > 4999900) { IsClose = 1; bookingCheckOut.Message = resp.Error.Message; bookingCheckOut.IsBook = false; } else { rates.Add(inventory_price); } } if (IsClose == 0) { //当满房是生成随机数并加上之前上传给飞猪的 Random ran = new Random(); int RandomResult = ran.Next(80, 200); bookingCheckOut.DayPrice = rates.Select(u => new RateQuotasPrice { Date = u.date, Price = u.price + RandomResult * 100m, Quota = 1//checkDto.RoomNum }).ToList(); bookingCheckOut.Message = "正常可预定"; bookingCheckOut.IsBook = true; //logWriter.Write("试单失败后通过(携程):试单失败-淘宝酒店id:{0},携程酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, resp.Error.Message); } } else { //logWriter.Write("试单失败后(携程):试单失败-淘宝酒店id:{0},携程酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, resp.Error.Message); bookingCheckOut.Message = resp.Error.Message; bookingCheckOut.IsBook = false; } } catch (Exception ex) { //logWriter.Write("试单失败后报错(携程):试单失败-淘宝酒店id:{0},携程酒店id:{1},{2},失败原因{3},报错{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, resp.Error.Message, ex.ToString()); bookingCheckOut.Message = resp.Error.Message; bookingCheckOut.IsBook = false; } //记录试单信息并关闭房态 Task.Factory.StartNew(() => { try { string Remark = resp.Error.Message; bool IsFull = true; if (checkDto.IsCustomer == 0) { Remark = "程序请求"; IsFull = false; } AliTripValidate av = new AliTripValidate(); av.CheckInTime = checkDto.CheckIn; av.CheckOutTime = checkDto.CheckOut; av.RatePlanCode = checkDto.RatePlanCode; av.IsFull = IsFull; av.HotelId = checkDto.HotelId; av.RoomId = checkDto.RoomTypeId; av.RatePlanId = checkDto.RatePlanId; av.CreateTime = DateTime.Now; av.Channel = 8; av.Shop = (int)Shop; av.Remark = Remark; SqlSugarContext.RenNiXingInstance.Insertable(av).ExecuteCommand(); Task.Factory.StartNew(() => { try { if (isPromotion) { //更新促销价格缓存 string urlCtripPrice = string.Format("http://47.107.101.107:8186/CtripPricePro/CtripPromorion.ashx?key=dfiqergnsdkjdiunqebgaupsdh&code={0}&checkin={1}&checkout={2}&cache=1&account=zhpromotion&opt=update", checkDto.HotelId, DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")); WebHttpRequest.Get(urlCtripPrice); } else { //更新价格缓存 string urlCtripPrice = string.Format("http://47.107.101.107:8186/CtripPricePro/CtripPriceApi.ashx?key=dfiqergnsdkjdiunqebgaupsdh&code={0}&rids={1}&checkin={2}&checkout={3}&cache=0", checkDto.HotelId, checkDto.RatePlanId, DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")); WebHttpRequest.Get(urlCtripPrice); } } catch { } if (checkDto.IsCustomer != 0) { Thread.Sleep(12000); } string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=8", checkDto.HotelId); WebHttpRequest.Get(url); }); } catch { } }); } } catch (Exception ex) { //Task.Factory.StartNew(() => //{ // var roomRateService = new RoomRateService(Shop, Entities.Enum.ProductChannel.Ctrip); // roomRateService.UpdateRoomRateByHid(checkDto.HotelId, true, true, true); //}); bookingCheckOut.IsBook = false; bookingCheckOut.Message = "出现异常,不可预定"; } //如果是飞猪程序调用先获取8秒内是否有试单 if (checkDto.IsCustomer == 0) { try { BookingCheckOutDto CheckOut = new BookingCheckOutDto(); var check = CacheHelper.GetCache(checkKey); //先读取缓存 if (check != null) //如果没有该缓存 { CheckOut = Newtonsoft.Json.JsonConvert.DeserializeObject <BookingCheckOutDto>(check.ToString(), new JsonSerializerSettings { Error = delegate(object obj, Newtonsoft.Json.Serialization.ErrorEventArgs args) { args.ErrorContext.Handled = true; } }); if (CheckOut != null) { return(CheckOut); } } } catch (Exception ex) { } } CacheHelper.SetCache(checkKey, Newtonsoft.Json.JsonConvert.SerializeObject(bookingCheckOut), 8);//添加缓存8秒 return(bookingCheckOut); }
/// <summary> /// 试单 /// </summary> /// <param name="checkDto"></param> /// <returns></returns> public BookingCheckOutDto BookingCheck(BookingCheckInputDto checkDto) { var checkKey = "mt_" + checkDto.HotelId + "_" + checkDto.RoomTypeId + "_" + checkDto.RatePlanId + "_" + checkDto.CheckIn + "_" + checkDto.CheckOut; var bookOutDto = new BookingCheckOutDto(); try { DateTime startTime = DateTime.Now; bookOutDto.DayPrice = new List <RateQuotasPrice>(); bookOutDto.IsBook = true; bookOutDto.Message = "正常可预定"; var response = new BookingCheckResponse(); int totalPrice = Convert.ToInt32(getTotaPrice(checkDto)); var request = new BookingCheckRequest { checkinDate = checkDto.CheckIn.ToString("yyyy-MM-dd"), checkoutDate = checkDto.CheckOut.ToString("yyyy-MM-dd"), HotelId = checkDto.HotelId, GoodsId = checkDto.RatePlanId, RoomNum = checkDto.RoomNum, totalPrice = totalPrice * checkDto.RoomNum }; if (totalPrice != 0) { response = meiTuanApiClient.Excute(request); } TimeSpan ts = checkDto.CheckOut.Subtract(checkDto.CheckIn); if (response != null && response.Result.code == 0 && (response.Result.desc == null || !response.Result.desc.Contains("价格发生变化"))) { //var hotelExtension = hotelRepository.GetHotelExtension(checkDto.HotelId, (int)Channel); //var invoiceInfo = GetRatePlanInvoice(checkDto.HotelId, checkDto.RatePlanId, checkDto.CheckIn, checkDto.CheckOut); bookOutDto.IsBook = true; int remainRoomNum = response.Result.remainRoomNum; int Quota = 5; if (remainRoomNum < 1) { Quota = 1; } else if (remainRoomNum > 5) { Quota = 5; } else { Quota = remainRoomNum; } var rate = new TaobaoRate(); try { XhotelRateGetRequest req = new XhotelRateGetRequest(); req.OutRid = checkDto.OuterId; req.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse resp = tmallApiClient.Execute(req); if (resp != null && !resp.IsError && resp.Rate != null && !string.IsNullOrWhiteSpace(resp.Rate.InventoryPrice)) { rate = JsonConvert.DeserializeObject <TaobaoRate>(resp.Rate.InventoryPrice); } } catch (Exception ex) { } List <PriceModelsItem> modelList = new List <PriceModelsItem>(); foreach (var item in response.Result.priceModels) { if (!modelList.Any(u => u.date == item.date)) { modelList.Add(item); } } //是否需要马上更新 bool isUpdate = false; //是否供应商发生变价 bool bianhua = false; foreach (var item in modelList) { RateQuotasPrice rqp = new RateQuotasPrice(); rqp.Date = item.date; //checkDto.IsVirtual, invoiceInfo.IsCommission, invoiceInfo.InvoiceMode, Convert.ToDecimal(item.subRatio / 10000), item.salePrice / 100, hotelExtension, rate rqp.Price = GetSalePrice(Convert.ToDateTime(item.date), checkDto.IsVirtual, Convert.ToDecimal(item.subRatio / 10000), item.salePrice / 100, rate, ref bianhua, ref isUpdate, checkDto.IsCustomer).ToTaoBaoPrice(); rqp.Quota = Quota;//5; bookOutDto.DayPrice.Add(rqp); } //记录试单信息 Task.Factory.StartNew(() => { try { bool IsFull = false; string Remark = bookOutDto.Message; //当库存为0时关房 if (remainRoomNum == 0 && checkDto.IsCustomer == 1) { IsFull = true; } if (checkDto.IsCustomer == 0) { Remark = "程序请求"; } AliTripValidate av = new AliTripValidate(); av.CheckInTime = checkDto.CheckIn; av.CheckOutTime = checkDto.CheckOut; av.RatePlanCode = checkDto.RatePlanCode; av.IsFull = IsFull; av.HotelId = checkDto.HotelId; av.RoomId = checkDto.RoomTypeId; av.RatePlanId = checkDto.RatePlanId; av.CreateTime = DateTime.Now; av.Channel = 5; av.Shop = (int)Shop; av.Remark = Remark; SqlSugarContext.RenNiXingInstance.Insertable(av).ExecuteCommand(); string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=5", checkDto.HotelId); if (checkDto.IsCustomer != 0 && !isUpdate) { Thread.Sleep(15000); } WebHttpRequest.Get(url); //当价格改变时或库存为0时更新房态 //if (bianhua || remainRoomNum == 0) //{ // string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=5", checkDto.HotelId); // WebHttpRequest.Get(url); //} } catch { } }); } else { //TODO 满房变价,全部关房.. //bookOutDto.IsBook = false; //bookOutDto.Message = response.Result.desc; try { var falseCount = 1; var falseCacheCount = CacheHelper.GetCache("falseCount");//先读取缓存 //当为客人请求才做记录数次 if (checkDto.IsCustomer == 1) { if (falseCacheCount != null)//如果没有该缓存,默认为1 { falseCount = (int)falseCacheCount + 1; } CacheHelper.SetCache("falseCount", falseCount, 1800);//添加缓存 } //如果试单失败为双数直接拿缓存值输出,单数时为失败 //if (falseCount % 2 == 0) bool tongguo = false; //在0点15分到4点为试单失败为双数直接拿缓存值输出,其余的都通过 int NowHour = DateTime.Now.Hour; //当前时间的时数 int NowMinute = DateTime.Now.Minute; //当前时间的分钟数 if (falseCount % 2 == 0 || falseCount % 13 == 0) { tongguo = true; } else if ((NowHour == 18 && NowMinute > 10) || (NowHour < 8 && NowHour >= 19)) { if (falseCount % 2 == 0 || falseCount % 5 == 0 || falseCount % 7 == 0) { tongguo = true; } } //if (falseCount % 6 == 0 || checkDto.IsCustomer == 0 || response.Result.desc.Contains("价格发生变化")) if (checkDto.IsCustomer == 0) { bookOutDto.Message = response.Result.desc; bookOutDto.IsBook = false; } else if (tongguo || response.Result.desc.Contains("价格发生变化")) { var rate = new TaobaoRate(); XhotelRateGetRequest req = new XhotelRateGetRequest(); req.OutRid = checkDto.OuterId; req.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse resp = tmallApiClient.Execute(req); if (resp != null && !resp.IsError && resp.Rate != null && !string.IsNullOrWhiteSpace(resp.Rate.InventoryPrice)) { //try //{ // rate = JsonConvert.DeserializeObject<TaobaoRate>(resp.Rate.InventoryPrice); //} //catch (Exception ex) //{ //} rate = JsonConvert.DeserializeObject <TaobaoRate>(resp.Rate.InventoryPrice); } var totalDayNum = (int)(checkDto.CheckOut.Date - checkDto.CheckIn).TotalDays; var rates = new List <inventory_price>(); //判断是否已经更新过飞猪房态,0为没更新过,1为已更新过为不可以预定 int IsClose = 0; for (int i = 0; i < totalDayNum; i++) { var inventory_price = rate.inventory_price.Where(a => a.date == checkDto.CheckIn.AddDays(i).ToString("yyyy-MM-dd")).FirstOrDefault(); if (inventory_price.price <= 0 || inventory_price.price > 4999900) { IsClose = 1; bookOutDto.Message = response.Result.desc; bookOutDto.IsBook = false; } else { rates.Add(inventory_price); } } if (IsClose == 0) { bookOutDto.DayPrice = rates.Select(u => new RateQuotasPrice { Date = u.date, Price = u.price, Quota = 1 }).ToList(); bookOutDto.Message = "正常可预定"; bookOutDto.IsBook = true; //logWriter.Write("试单失败后通过(美团):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, response.Result.desc); } } else if (falseCount % 3 == 0) { var rate = new TaobaoRate(); XhotelRateGetRequest req = new XhotelRateGetRequest(); req.OutRid = checkDto.OuterId; req.Rpid = checkDto.Rpid; var tmallApiClient = new TmallApiClient(Shop); XhotelRateGetResponse resp = tmallApiClient.Execute(req); if (resp != null && !resp.IsError && resp.Rate != null && !string.IsNullOrWhiteSpace(resp.Rate.InventoryPrice)) { //try //{ // rate = JsonConvert.DeserializeObject<TaobaoRate>(resp.Rate.InventoryPrice); //} //catch (Exception ex) //{ //} rate = JsonConvert.DeserializeObject <TaobaoRate>(resp.Rate.InventoryPrice); } var totalDayNum = (int)(checkDto.CheckOut.Date - checkDto.CheckIn).TotalDays; var rates = new List <inventory_price>(); //判断是否已经更新过飞猪房态,0为没更新过,1为已更新过为不可以预定 int IsClose = 0; for (int i = 0; i < totalDayNum; i++) { var inventory_price = rate.inventory_price.Where(a => a.date == checkDto.CheckIn.AddDays(i).ToString("yyyy-MM-dd")).FirstOrDefault(); if (inventory_price.price <= 0 || inventory_price.price > 4999900) { IsClose = 1; bookOutDto.Message = response.Result.desc; bookOutDto.IsBook = false; } else { rates.Add(inventory_price); } } if (IsClose == 0) { Random ran = new Random(); int RandomResult = ran.Next(80, 200); bookOutDto.DayPrice = rates.Select(u => new RateQuotasPrice { Date = u.date, Price = u.price + RandomResult * 100m, Quota = 1 }).ToList(); bookOutDto.Message = "正常可预定"; bookOutDto.IsBook = true; //logWriter.Write("试单失败后通过(美团):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, response.Result.desc); } } else { //logWriter.Write("试单失败后(美团):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败数次:{3},失败原因{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, falseCount, response.Result.desc); bookOutDto.Message = response.Result.desc; bookOutDto.IsBook = false; } //记录试单信息并关闭房态 Task.Factory.StartNew(() => { try { string Remark = response.Result.desc; bool IsFull = true; if (checkDto.IsCustomer == 0) { Remark = "程序请求"; IsFull = false; } else if (response.Result.desc.Contains("价格发生变化")) { Remark = "价格发生变化"; IsFull = false; } AliTripValidate av = new AliTripValidate(); av.CheckInTime = checkDto.CheckIn; av.CheckOutTime = checkDto.CheckOut; av.RatePlanCode = checkDto.RatePlanCode; av.IsFull = IsFull; av.HotelId = checkDto.HotelId; av.RoomId = checkDto.RoomTypeId; av.RatePlanId = checkDto.RatePlanId; av.CreateTime = DateTime.Now; av.Channel = 5; av.Shop = (int)Shop; av.Remark = Remark; SqlSugarContext.RenNiXingInstance.Insertable(av).ExecuteCommand(); } catch { } if (checkDto.IsCustomer != 0) { Thread.Sleep(13000); } string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=5", checkDto.HotelId); WebHttpRequest.Get(url); }); } catch (Exception ex) { //记录试单信息并关闭房态 Task.Factory.StartNew(() => { try { bool IsFull = true; string Remark = response.Result.desc; if (checkDto.IsCustomer == 0) { Remark = "程序请求"; IsFull = false; } AliTripValidate av = new AliTripValidate(); av.CheckInTime = checkDto.CheckIn; av.CheckOutTime = checkDto.CheckOut; av.RatePlanCode = checkDto.RatePlanCode; av.IsFull = IsFull; av.HotelId = checkDto.HotelId; av.RoomId = checkDto.RoomTypeId; av.RatePlanId = checkDto.RatePlanId; av.CreateTime = DateTime.Now; av.Channel = 5; av.Shop = (int)Shop; av.Remark = Remark; SqlSugarContext.RenNiXingInstance.Insertable(av).ExecuteCommand(); } catch { } Thread.Sleep(6000); string url = string.Format("http://localhost:8097/apiAshx/UpdateRoomRate.ashx?type=RoomRate&hid={0}&source=5", checkDto.HotelId); WebHttpRequest.Get(url); }); //logWriter.Write("试单失败后报错(美团):试单失败-淘宝酒店id:{0},美团酒店id:{1},{2},失败原因{3},报错{4}", checkDto.Hid, checkDto.HotelId, checkDto.Rpid, response.Result.desc, ex.ToString()); bookOutDto.Message = response.Result.desc; bookOutDto.IsBook = false; } } } catch (Exception ex) { bookOutDto.IsBook = false; bookOutDto.Message = string.Format("满房,系统异常:{0}", ex.ToString()); } if (checkDto.IsCustomer == 0) { try { BookingCheckOutDto CheckOut = new BookingCheckOutDto(); var check = CacheHelper.GetCache(checkKey); //先读取缓存 if (check != null) //如果没有该缓存 { CheckOut = Newtonsoft.Json.JsonConvert.DeserializeObject <BookingCheckOutDto>(check.ToString(), new JsonSerializerSettings { Error = delegate(object obj, Newtonsoft.Json.Serialization.ErrorEventArgs args) { args.ErrorContext.Handled = true; } }); if (CheckOut != null) { return(CheckOut); } } } catch (Exception ex) { } } CacheHelper.SetCache(checkKey, Newtonsoft.Json.JsonConvert.SerializeObject(bookOutDto), 8);//添加缓存 return(bookOutDto); }