using NetLibrary.Data; using NetLibrary.Log; using NetLibrary.WebReference; using RateAvailableServiceWebServiceClient; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Web.Services.Protocols; namespace NetLibrary.Express { public class Fedex { public static string AccountNumber = ""; public static string Key = ""; public static string MeterNumber = ""; public static FedexOrder ormd = new FedexOrder(); public static string Password = ""; public static string PayAccountNumber = ""; public static string PostInfo = ""; private static ProcessShipmentRequest CreateShipmentRequest() { ProcessShipmentRequest request = new ProcessShipmentRequest { WebAuthenticationDetail = new WebAuthenticationDetail() }; request.WebAuthenticationDetail.UserCredential = new WebAuthenticationCredential(); request.WebAuthenticationDetail.UserCredential.Key = Key; request.WebAuthenticationDetail.UserCredential.Password = Password; if (usePropertyFile()) { request.WebAuthenticationDetail.UserCredential.Key = getProperty("key"); request.WebAuthenticationDetail.UserCredential.Password = getProperty("password"); } request.ClientDetail = new ClientDetail(); request.ClientDetail.AccountNumber = AccountNumber; request.ClientDetail.MeterNumber = MeterNumber; if (usePropertyFile()) { request.ClientDetail.AccountNumber = getProperty("accountnumber"); request.ClientDetail.MeterNumber = getProperty("meternumber"); } request.TransactionDetail = new TransactionDetail(); request.TransactionDetail.CustomerTransactionId = ormd.CustomerTransactionId; request.Version = new VersionId(); SetShipmentDetails(request); SetSender(request); SetRecipient(request); SetPayment(request); SetLabelDetails(request); SetPackageLineItems(request); SetCustomsClearanceDetails(request); return request; } private static void DisplayLabel(string labelFileName) { ProcessStartInfo startInfo = new ProcessStartInfo(labelFileName) { UseShellExecute = true, Verb = "open" }; Process.Start(startInfo); } public string GetFedex(out string Error) { string trackingNumber = ""; ProcessShipmentRequest processShipmentRequest = CreateShipmentRequest(); ShipService service = new ShipService { Url = "https://ws.fedex.com:443/web-services/ship" }; if (usePropertyFile()) { service.Url = "https://ws.fedex.com:443/web-services/ship"; } try { ProcessShipmentReply reply = service.processShipment(processShipmentRequest); if ((reply.HighestSeverity != NotificationSeverityType.ERROR) && (reply.HighestSeverity != NotificationSeverityType.FAILURE)) { trackingNumber = reply.CompletedShipmentDetail.CompletedPackageDetails[0].TrackingIds[0].TrackingNumber; ShowShipmentReply(reply); } else { Error = ShowNotifications(reply); ErrorFollow.TraceWrite("Fedex", "processShipment", Error); return ""; } } catch (SoapException exception) { Error = exception.Detail.InnerText; ErrorFollow.TraceWrite("Fedex", "processShipment", Error); return ""; } catch (Exception exception2) { Error = exception2.Message; ErrorFollow.TraceWrite("Fedex", "processShipment", Error); return ""; } Error = ""; return trackingNumber; } private static string getProperty(string propertyname) { try { string path = @"C:\filepath\filename.txt"; if (File.Exists(path)) { StreamReader reader = new StreamReader(path); do { string[] strArray = reader.ReadLine().Split(new char[] { ',' }); if (strArray[0].Equals(propertyname) && (strArray.Length == 2)) { return strArray[1]; } } while (!reader.EndOfStream); } Console.WriteLine("Property {0} set to default 'XXX'", propertyname); return "XXX"; } catch (Exception) { Console.WriteLine("Property {0} set to default 'XXX'", propertyname); return "XXX"; } } private static void SaveLabel(string labelFileName, byte[] labelBuffer) { FileStream stream = new FileStream(labelFileName, FileMode.Create); stream.Write(labelBuffer, 0, labelBuffer.Length); stream.Close(); } public static void SaveTrackCode(string TrackingNumber, string LabelFileName) { string query = @"declare @OrderId int select @OrderId=OrderId fromDT_OrderInfo where state<3 and state>0 and platOrderCode=@OrderCode if @OrderId>0 begin if(select count(0) from DT_TrackCodeApply where TrackCode=@TrackCode and state=1)=0 begin INSERT INTO [dbo].[DT_TrackCodeApply]([PostId],[TrackType],[TrackCode],[TrackCode2],[GetDate],[InName],[OrderId],[State],[UpdateTime],[OrderCode],[OldPostFee],[ScanState],[ScanDate],LabelUrl) values(@PostId,1,@TrackCode,null,getdate(),'系统',@OrderId,1,null,@OrderCode,null,0,null,@LabelFileName)updateDT_OrderXXInfo set PostError=null,TrackState=1,LogisticsId=10,Post=65 where OrderId=@OrderId update DT_OrderXXInfoNew set PostError=null,TrackState=1,LogisticsId=10,Post=65 where OrderId=@OrderId end select 1 end else begin select 0 end"; Database database = DatabaseFactory.CreateDatabase(); DbCommand sqlStringCommand = database.GetSqlStringCommand(query); database.AddInParameter(sqlStringCommand, "@PostId", DbType.Int32, ormd.PostId); database.AddInParameter(sqlStringCommand, "@OrderCode", DbType.String, ormd.CustomerTransactionId); database.AddInParameter(sqlStringCommand, "@TrackCode", DbType.String, TrackingNumber); database.AddInParameter(sqlStringCommand, "@LabelFileName", DbType.String, LabelFileName); database.ExecuteNonQuery(sqlStringCommand); } private static void SetCommodityDetails(ProcessShipmentRequest request) { request.RequestedShipment.CustomsClearanceDetail.Commodities = new Commodity[] { new Commodity() }; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].NumberOfPieces = ormd.GoodsList[0].NumberOfPieces; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Description = ormd.GoodsList[0].Description; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].CountryOfManufacture = "CN"; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight = new Weight(); request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight.Value = 1M; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Weight.Units = WeightUnits.LB; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].Quantity = 1.0M; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].QuantitySpecified = true; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].QuantityUnits = "EA"; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].UnitPrice = new Money(); request.RequestedShipment.CustomsClearanceDetail.Commodities[0].UnitPrice.Amount = 10.000000M; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].UnitPrice.Currency = "USD"; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].CustomsValue = new Money(); request.RequestedShipment.CustomsClearanceDetail.Commodities[0].CustomsValue.Amount = 10.000000M; request.RequestedShipment.CustomsClearanceDetail.Commodities[0].CustomsValue.Currency = "USD"; } private static void SetCustomsClearanceDetails(ProcessShipmentRequest request) { request.RequestedShipment.CustomsClearanceDetail = new CustomsClearanceDetail(); request.RequestedShipment.CustomsClearanceDetail.DutiesPayment = new Payment(); request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.PaymentType = PaymentType.ACCOUNT; request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.Payor = new Payor(); request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.Payor.ResponsibleParty = new Party(); request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.Payor.ResponsibleParty.AccountNumber = AccountNumber; if (usePropertyFile()) { request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.Payor.ResponsibleParty.AccountNumber = getProperty("dutiesaccount"); } request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.Payor.ResponsibleParty.Contact = new Contact(); request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.Payor.ResponsibleParty.Address = new Address(); request.RequestedShipment.CustomsClearanceDetail.DutiesPayment.Payor.ResponsibleParty.Address.CountryCode = "US"; request.RequestedShipment.CustomsClearanceDetail.DocumentContent = InternationalDocumentContentType.NON_DOCUMENTS; request.RequestedShipment.CustomsClearanceDetail.CustomsValue = new Money(); request.RequestedShipment.CustomsClearanceDetail.CustomsValue.Amount = 10.0M; request.RequestedShipment.CustomsClearanceDetail.CustomsValue.Currency = "USD"; SetCommodityDetails(request); } private static void SetLabelDetails(ProcessShipmentRequest request) { request.RequestedShipment.LabelSpecification = new LabelSpecification(); request.RequestedShipment.LabelSpecification.ImageType = ShippingDocumentImageType.PDF; request.RequestedShipment.LabelSpecification.ImageTypeSpecified = true; request.RequestedShipment.LabelSpecification.LabelFormatType = LabelFormatType.COMMON2D; } private static void SetPackageLineItems(ProcessShipmentRequest request) { request.RequestedShipment.RequestedPackageLineItems = new RequestedPackageLineItem[] { new RequestedPackageLineItem() }; request.RequestedShipment.RequestedPackageLineItems[0].SequenceNumber = "1"; request.RequestedShipment.RequestedPackageLineItems[0].Weight = new Weight(); request.RequestedShipment.RequestedPackageLineItems[0].Weight.Value = 1M; request.RequestedShipment.RequestedPackageLineItems[0].Weight.Units = WeightUnits.LB; request.RequestedShipment.RequestedPackageLineItems[0].Dimensions = new Dimensions(); if (ormd.GoodsList[0].Lenght != null) { request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Length = ormd.GoodsList[0].Lenght; } else { request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Length = "60"; } if (ormd.GoodsList[0].Width != null) { request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Width = ormd.GoodsList[0].Width; } else { request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Width = "30"; } if (ormd.GoodsList[0].Height != null) { request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Height = ormd.GoodsList[0].Height; } else { request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Height = "30"; } request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Units = LinearUnits.CM; request.RequestedShipment.RequestedPackageLineItems[0].InsuredValue = new Money(); request.RequestedShipment.RequestedPackageLineItems[0].InsuredValue.Amount = ormd.GoodsList[0].Amount; request.RequestedShipment.RequestedPackageLineItems[0].InsuredValue.Currency = "USD"; request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences = new CustomerReference[] { new CustomerReference() }; request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[0].CustomerReferenceType = CustomerReferenceType.CUSTOMER_REFERENCE; request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[0].Value = ormd.GoodsList[0].SKU; } private static void SetPayment(ProcessShipmentRequest request) { request.RequestedShipment.ShippingChargesPayment = new Payment(); request.RequestedShipment.ShippingChargesPayment.PaymentType = PaymentType.ACCOUNT; request.RequestedShipment.ShippingChargesPayment.Payor = new Payor(); request.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty = new Party(); request.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.AccountNumber = PayAccountNumber; if (usePropertyFile()) { request.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.AccountNumber = getProperty("payoraccount"); } request.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Contact = new Contact(); request.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Address = new Address(); request.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Address.CountryCode = "US"; } private static void SetRecipient(ProcessShipmentRequest request) { request.RequestedShipment.Recipient = new Party(); request.RequestedShipment.Recipient.Tins = new TaxpayerIdentification[] { new TaxpayerIdentification() }; request.RequestedShipment.Recipient.Tins[0].TinType = TinType.BUSINESS_STATE; request.RequestedShipment.Recipient.Tins[0].Number = "123"; request.RequestedShipment.Recipient.Contact = new Contact(); request.RequestedShipment.Recipient.Contact.PersonName = ormd.Rever.PersonName; request.RequestedShipment.Recipient.Contact.CompanyName = ormd.Rever.CompanyName; request.RequestedShipment.Recipient.Contact.PhoneNumber = ormd.Rever.PhoneNumber; request.RequestedShipment.Recipient.Address = new Address(); request.RequestedShipment.Recipient.Address.StreetLines = new string[] { ormd.Rever.StreetLines }; request.RequestedShipment.Recipient.Address.City = ormd.Rever.City; request.RequestedShipment.Recipient.Address.StateOrProvinceCode = ormd.Rever.StateOrProvinceCode; request.RequestedShipment.Recipient.Address.PostalCode = ormd.Rever.PostalCode; request.RequestedShipment.Recipient.Address.CountryCode = ormd.Rever.CountryCode; request.RequestedShipment.Recipient.Address.Residential = false; } private static void SetSender(ProcessShipmentRequest request) { request.RequestedShipment.Shipper = new Party(); request.RequestedShipment.Shipper.Contact = new Contact(); request.RequestedShipment.Shipper.Contact.PersonName = ormd.Shiper.PersonName; request.RequestedShipment.Shipper.Contact.CompanyName = ormd.Shiper.CompanyName; request.RequestedShipment.Shipper.Contact.PhoneNumber = ormd.Shiper.PhoneNumber; request.RequestedShipment.Shipper.Address = new Address(); request.RequestedShipment.Shipper.Address.StreetLines = new string[] { ormd.Shiper.StreetLines }; request.RequestedShipment.Shipper.Address.City = ormd.Shiper.City; request.RequestedShipment.Shipper.Address.StateOrProvinceCode = ormd.Shiper.StateOrProvinceCode; request.RequestedShipment.Shipper.Address.PostalCode = ormd.Shiper.PostalCode; request.RequestedShipment.Shipper.Address.CountryCode = ormd.Shiper.CountryCode; } private static void SetShipmentDetails(ProcessShipmentRequest request) { request.RequestedShipment = new RequestedShipment(); request.RequestedShipment.ShipTimestamp = DateTime.Now; request.RequestedShipment.DropoffType = DropoffType.REGULAR_PICKUP; if (PostInfo == "FEDEX_GROUND") { request.RequestedShipment.ServiceType = ServiceType.FEDEX_GROUND; } else if (PostInfo == "SMART_POST") { request.RequestedShipment.ServiceType = ServiceType.SMART_POST; } else if (PostInfo == "STANDARD_OVERNIGHT") { request.RequestedShipment.ServiceType = ServiceType.STANDARD_OVERNIGHT; } else if (PostInfo == "STANDARD_OVERNIGHT") { request.RequestedShipment.ServiceType = ServiceType.STANDARD_OVERNIGHT; } else if (PostInfo == "GROUND_HOME_DELIVERY") { request.RequestedShipment.ServiceType = ServiceType.GROUND_HOME_DELIVERY; } else if (PostInfo == "FEDEX_FREIGHT_ECONOMY") { request.RequestedShipment.ServiceType = ServiceType.FEDEX_FREIGHT_ECONOMY; } request.RequestedShipment.PackagingType = PackagingType.YOUR_PACKAGING; request.RequestedShipment.PackageCount = "1"; } private static void ShowBarcodeDetails(PackageBarcodes barcodes) { Console.WriteLine("\nBarcode details"); if (barcodes != null) { int num; if (barcodes.StringBarcodes != null) { for (num = 0; num < barcodes.StringBarcodes.Length; num++) { Console.WriteLine("String barcode {0} Type {1}", barcodes.StringBarcodes[num].Value, barcodes.StringBarcodes[num].Type); } } if (barcodes.BinaryBarcodes != null) { for (num = 0; num < barcodes.BinaryBarcodes.Length; num++) { Console.WriteLine("Binary barcode Type {0}", barcodes.BinaryBarcodes[num].Type); } } } } private static string ShowNotifications(ProcessShipmentReply reply) { string str = ""; for (int i = 0; i < reply.Notifications.Length; i++) { Notification notification = reply.Notifications[i]; string str3 = str; str = str3 + "Code:" + notification.Code + ";Message:" + notification.Message + ";Source:" + notification.Source; } return str; } private static void ShowPackageRateDetails(ShipmentRating ShipmentRating) { Console.WriteLine("\nRate details"); for (int i = 0; i < ShipmentRating.ShipmentRateDetails.Length; i++) { Console.WriteLine("RateType: " + ShipmentRating.ActualRateType); Console.WriteLine("Total Billing Weight: " + ShipmentRating.ShipmentRateDetails[i].TotalBillingWeight.Value); Console.WriteLine("Total Base Charge: " + ShipmentRating.ShipmentRateDetails[i].TotalBaseCharge.Amount); Console.WriteLine("Total Freight Discount: " + ShipmentRating.ShipmentRateDetails[i].TotalFreightDiscounts.Amount); Console.WriteLine("Total Surcharges: " + ShipmentRating.ShipmentRateDetails[i].TotalSurcharges.Amount); Console.WriteLine("Total Net Charge: " + ShipmentRating.ShipmentRateDetails[i].TotalNetCharge.Amount); Console.WriteLine("**********************************************************"); } } private static void ShowPackageRouteDetails(ShipmentOperationalDetail routingDetail) { Console.WriteLine("\nRouting details"); Console.WriteLine("URSA prefix {0} suffix {1}", routingDetail.UrsaPrefixCode, routingDetail.UrsaSuffixCode); Console.WriteLine("Service commitment {0} Airport ID {1}", routingDetail.DestinationLocationId, routingDetail.AirportId); if (routingDetail.DeliveryDaySpecified) { Console.WriteLine("Delivery day " + routingDetail.DeliveryDay); } if (routingDetail.DeliveryDateSpecified) { Console.WriteLine("Delivery date " + routingDetail.DeliveryDate.ToShortDateString()); } if (routingDetail.TransitTimeSpecified) { Console.WriteLine("Transit time " + routingDetail.TransitTime); } } private static void ShowShipmentReply(ProcessShipmentReply reply) { foreach (CompletedPackageDetail detail in reply.CompletedShipmentDetail.CompletedPackageDetails) { if (null != detail.Label.Parts[0].Image) { string str = AppDomain.CurrentDomain.BaseDirectory + "ServerCookies/"; string labelFileName = "ServerCookies/" + detail.TrackingIds[0].TrackingNumber + ".pdf"; SaveLabel(str + detail.TrackingIds[0].TrackingNumber + ".pdf", detail.Label.Parts[0].Image); SaveTrackCode(detail.TrackingIds[0].TrackingNumber, labelFileName); } } } private static void ShowTrackingDetails(TrackingId[] TrackingIds) { if (TrackingIds != null) { for (int i = 0; i < TrackingIds.Length; i++) { } } } private static bool usePropertyFile() { return getProperty("usefile").Equals("True"); } } public class FedexOrder { public string CustomerTransactionId { get; set; } public List GoodsList { get; set; } public int? PostId { get; set; } public Rever Rever { get; set; } public Shiper Shiper { get; set; } } public class Shiper { public string City { get; set; } public string CompanyName { get; set; } public string CountryCode { get; set; } public string PersonName { get; set; } public string PhoneNumber { get; set; } public string PostalCode { get; set; } public string StateOrProvinceCode { get; set; } public string StreetLines { get; set; } } public class Rever { public string City { get; set; } public string CompanyName { get; set; } public string CountryCode { get; set; } public string PersonName { get; set; } public string PhoneNumber { get; set; } public string PostalCode { get; set; } public string StateOrProvinceCode { get; set; } public string StreetLines { get; set; } } public class FedexGoods { public decimal Amount { get; set; } public string CountryOfManufacture { get; set; } public string Description { get; set; } public string Height { get; set; } public string Lenght { get; set; } public string NumberOfPieces { get; set; } public decimal Quantity { get; set; } public string SKU { get; set; } public decimal Weight { get; set; } public string Width { get; set; } } }