• C#快递跟踪(基于快递100深度定制)


    本文主要介绍快递跟踪的相关信息。如根据快递单号预测所属快递公司,判断快递是否已被签收,以及改良官方model后可在不用申请授权的情况下实现json,html,xml及text等多种格式以及单行多行,降序升序等方式的输出。本文仅供大家学习使用,任何商业相关的调用请使用官方接口。

    先定义SortList数组用于存放快递公司的简称和全称

      public SortedList Ht = new SortedList()
            {
                {"zhongyouwuliu", "中邮物流"},
                {"zhongtong", "中通速递"},
                {"zhongtiewuliu", "中铁快运"},
                {"zhaijisong", "宅急送"},
                {"yuntongkuaidi", "运通快递"},
                {"yuananda", "源安达"},
                {"yunda", "韵达快运"},
                {"yuefengwuliu", "越丰物流"},
                {"yuanzhijiecheng", "元智捷诚快递"},
                {"yuanweifeng", "源伟丰快递"},
                {"yuantong", "圆通速递"},
                {"yuanchengwuliu", "远成物流"},
                {"youshuwuliu", "优速物流"},
                {"yibangwuliu", "一邦速递"},
                {"yafengsudi", "亚风速递"},
              //........  
    }    

    原始模型:

       public class Detail
        {
            public DateTime time;
            public string context;
            public DateTime ftime;
    
            public Detail()
            {
            }
        }
    
        public class Info
        {
            public string message;
            public string nu;
            public int ischeck;
            public string com;
            public string status;
            public string condition;
            public int state;
            public Detail[] data;
    
            public Info()
            {
            }
        }

    改良后模型:

      public class Kuaididetail
        {
            public string Time;
            public string Context;
            public Kuaididetail()
            {
            }
    
            public Kuaididetail(string time,string context)
            {
                this.Time = time;
                this.Context = context;
            }
        }
    
        public class KuaidiInfo
        {
            public string No;   //快递单号
            public string Name;  //快递公司名称
            public string ShortName; //快递公司简称
            public string Message;   //状态信息,ok为有快递信息
            public string HtmlStatus; //html状态码 详见:http://yige.org/tags/ref_httpmessages.php
            public int State;   /*快递单当前的状态 :  
                                    0:在途,即货物处于运输过程中;
                                    1:揽件,货物已由快递公司揽收并且产生了第一条跟踪信息;
                                    2:疑难,货物寄送过程出了问题;
                                    3:签收,收件人已签收;
                                    4:退签,即货物由于用户拒签、超区等原因退回,而且发件人已经签收;
                                    5:派件,即快递正在进行同城派件;
                                    6:退回,货物正处于退回发件人的途中;*/
            public string Days;   //快递在途时间
            public List<Kuaididetail> Detail; //快递详情
    
            public KuaidiInfo()
            {
            }
        }

    1.根据快递单号模糊搜索出快递公司名称

    Demo图:

    输入数字动态加载匹配度最高的快递公司名称:

      $("#search_input").keyup(function () {
                var value = $("#search_input").val();
                $("#search_list").html("");
                $.ajax({
                    type: "GET",
                    url: "/KuaiDi/GetData",
                    data: {no:value},
                    dataType: 'json',
                    timeout: 5000,
                    cache: false,
                    success: function (result) {
                        var html = "";
                        $.each(result, function (k, v) {
                                html += "<li>"+v+"</li>";                  
                        });
                        $("#search_list").html(html);
                        $("#search_list li").click(function (e) {
                            e.stopPropagation();
                            var _text = $(this).text();
                            $("#search_input").val(_text);
                            $("#search_list").hide();
                        });
                    },
                    error: function () {
    
                    }
                });
            });

    json请求代码:

          public JsonResult GetData(string no)
            {
                List<string> list = new List<string>();
                try
                {
                    string apiurl = "http://www.kuaidi100.com/autonumber/auto?num="+no;
                    WebClient webClient = new WebClient();
                    byte[] result = webClient.DownloadData(apiurl);
                    string tip = Encoding.GetEncoding("utf-8").GetString(result);
                    JavaScriptSerializer jss = new JavaScriptSerializer();
                    var info = jss.Deserialize<List<KuaiduTip>>(tip);
                    if (info.Count > 0)
                    {
                        foreach (var item in info)
                        {
                            string temp =no + " " + (Ht.ContainsKey(item.comCode) ? Ht[item.comCode].ToString() : item.comCode);
                            list.Add(temp);
                        }
                    }
                }
                catch (Exception)
                {
    
                }
                return Json(list, JsonRequestBehavior.AllowGet);            
            }

    2.从快递100那里拿取数据

            /// <summary>
            /// 从快递100那里拿取数据
            /// </summary>
            /// <param name="name">快递公司简称</param>
            /// <param name="no">快递单号</param>
            /// <returns></returns>
            public Info GetInfo(string name, string no)
            {
                string apiurl = "http://www.kuaidi100.com/query?id=1&type=" + name + "&postid=" + no + "&valicode=11&temp=12";
                WebClient webClient = new WebClient();
                byte[] result = webClient.DownloadData(apiurl);
                string wuliu = Encoding.GetEncoding("utf-8").GetString(result);
                JavaScriptSerializer jss = new JavaScriptSerializer();
                Info info = jss.Deserialize<Info>(wuliu);
                return info;
            }

    3.判断快递是否已被签收

        /// <summary>
            /// 判断快递是否已被签收
            /// </summary>
            /// <param name="name">快递公司简称</param>
            /// <param name="no">快递单号</param>
            /// <returns></returns>
            public bool IsSigned(string name, string no)
            {
                Info info = GetInfo(name, no);
                if (info.message == "ok")
                {
                    Detail[] details = info.data;
                    if (details[0].context.Contains("签收") || info.state == 3)
                    {
                        return true;
                    }
                }
                return false;
            }

    4.快递接口调用(可实现json,html,xml及text等格式及单行多行,降序升序输出)

          //快递接口调用
            /// <summary>
            /// 
            /// </summary>
            /// <param name="name">快递公司简称</param>
            /// <param name="no">快递单号</param>
            /// <param name="type">0表示json,1表示html,2表示xml,3表示文本</param>
            /// <param name="muti">true表示显示多行,false表示只显示一行</param>
            /// <param name="isDesc">true表示降序,false表示升序</param>
            /// <returns></returns>
            public ActionResult Index(string name, string no,int type,bool muti,bool isDesc)
            {
                try
                {
                    Info info = GetInfo(name,no);              
                    string expressName = Ht[name].ToString();
    
                    KuaidiInfo kuaidiInfo = new KuaidiInfo();
                    kuaidiInfo.No = no;
                    kuaidiInfo.Name = expressName;
                    kuaidiInfo.ShortName = name;
                    kuaidiInfo.State = info.state;
                    kuaidiInfo.HtmlStatus = info.status;
                    if (info.message == "ok")
                    {
                        Detail[] details = info.data;
                        DateTime starTime = details[0].time;
                        DateTime endTime = details[details.Length - 1].time;
                        TimeSpan ts = starTime.Subtract(endTime);
                        double ss = ts.TotalHours;
                        kuaidiInfo.Days = ((int)ss / 24).ToString() + "" + ((int)ss % 24).ToString() + "小时";
                        kuaidiInfo.Message = "OK";
                        List<Detail> dd = details.ToList();
                        if (muti)
                        {
                            if (isDesc)
                            {
                                List<Kuaididetail> kdList = new List<Kuaididetail>();
                                foreach (Detail t in dd)
                                {
                                    Kuaididetail kd = new Kuaididetail(t.time.ToString(), t.context);
                                    kdList.Add(kd);
                                }
                                kuaidiInfo.Detail = kdList;
                            }
                            else
                            {
                                dd = dd.OrderBy(p => p.time).ToList();
                                List<Kuaididetail> kdList = new List<Kuaididetail>();
                                foreach (Detail t in dd)
                                {
                                    Kuaididetail kd = new Kuaididetail(t.time.ToString(), t.context);
                                    kdList.Add(kd);
                                }
                                kuaidiInfo.Detail = kdList;
                            }
                        }
                        else
                        {
                            if (isDesc)
                            {
                                Kuaididetail kd = new Kuaididetail(dd[0].time.ToString(), dd[0].context);
                                List<Kuaididetail> kdList = new List<Kuaididetail>();
                                kdList.Add(kd);
                                kuaidiInfo.Detail = kdList;
                            }
                            else
                            {
                                dd = dd.OrderBy(p => p.time).ToList();
                                Kuaididetail kd = new Kuaididetail(dd[0].time.ToString(), dd[0].context);
                                List<Kuaididetail> kdList = new List<Kuaididetail>();
                                kdList.Add(kd);
                                kuaidiInfo.Detail = kdList;
                            }
                        }
                    }
                    else
                    {
                        kuaidiInfo.Message = info.message.Split('')[1];
                    }
    
                    /////////////////////////////////////////////////////////////////////////////
    
                    switch (type)
                    {
                        case 0:
                        {
                            JavaScriptSerializer jss = new JavaScriptSerializer();
                            string json = jss.Serialize(kuaidiInfo); //序列化成JSON
                            return Content(json);
                        }
                        case 1:
                            return View(kuaidiInfo);
                        case 2:
                            CreateXmlFromBy(kuaidiInfo);                         
                            return null;
                        case 3:
                            string result = String.Empty;
                            foreach (var item in kuaidiInfo.Detail)
                            {
                                result += item.Time + "	" + item.Context + "
    ";
                            }
                            return Content(result);
                        default:
                            return null;
                    }
                }
                catch
                {
                    return null;
                }
            }
        }

    5.将数据导出到xml并显示在页面

      public void CreateXmlFromBy(KuaidiInfo info)
            {
                var m =info.Detail.Select(p => new XElement("Data", new XElement("Time", p.Time), new XElement("Context", p.Context)));
                XElement x = new XElement("xml",new XElement("No",info.No),new XElement("Name",info.Name),new XElement("Message",info.Message),new XElement("HtmlStatus",info.HtmlStatus),new XElement("State",info.State),new XElement("Days",info.Days),m);
                Response.Charset = "utf-8";//格式
                Response.ContentType = "text/xml";//类型
                Response.Write(x);
            }

    6.输出Demo演示

    json格式:

    {"No":"1900916254100","Name":"韵达快运","ShortName":"yunda","Message":"OK","HtmlStatus":"200","State":3,"Days":"2天19小时","Detail":[{"Time":"2014/10/27 16:33:31","Context":"到达:山东烟台莱山区公司大学分部 由 图片 签收"},{"Time":"2014/10/27 16:27:24","Context":"到达:山东烟台莱山区公司大学分部 指定:王师傅(15165747011) 派送"},{"Time":"2014/10/27 10:37:09","Context":"到达:山东烟台莱山区公司大学分部 上级站点:山东烟台莱山区公司 发往:"},{"Time":"2014/10/27 8:42:04","Context":"到达:山东烟台分拨中心 发往:山东烟台莱山区公司"},{"Time":"2014/10/27 8:40:26","Context":"到达:山东烟台分拨中心 上级站点:山东济南分拨中心"},{"Time":"2014/10/26 18:30:31","Context":"到达:山东济南分拨中心 发往:山东烟台分拨中心"},{"Time":"2014/10/26 18:28:53","Context":"到达:山东济南分拨中心 上级站点:江西南昌分拨中心"},{"Time":"2014/10/25 1:16:43","Context":"到达:江西南昌分拨中心 发往:山东济南分拨中心"},{"Time":"2014/10/25 1:13:51","Context":"到达:江西南昌分拨中心"},{"Time":"2014/10/24 20:38:26","Context":"到达:江西南昌青山湖区罗家集公司 已收件"}]}

    html格式:

    XML格式:

    文本格式:

    2014/10/27 16:33:31    到达:山东烟台莱山区公司大学分部 由 图片 签收 2014/10/27 16:27:24    到达:山东烟台莱山区公司大学分部 指定:王师傅(15165747011) 派送 2014/10/27 10:37:09    到达:山东烟台莱山区公司大学分部 上级站点:山东烟台莱山区公司 发往: 2014/10/27 8:42:04    到达:山东烟台分拨中心 发往:山东烟台莱山区公司 2014/10/27 8:40:26    到达:山东烟台分拨中心 上级站点:山东济南分拨中心 2014/10/26 18:30:31    到达:山东济南分拨中心 发往:山东烟台分拨中心 2014/10/26 18:28:53    到达:山东济南分拨中心 上级站点:江西南昌分拨中心 2014/10/25 1:16:43    到达:江西南昌分拨中心 发往:山东济南分拨中心 2014/10/25 1:13:51    到达:江西南昌分拨中心 2014/10/24 20:38:26    到达:江西南昌青山湖区罗家集公司 已收件
  • 相关阅读:
    如何让背景图片全屏显示
    浅谈图片如何在页面中居中显示
    clientHeight、offsetHeight 区别 笔记
    使用Flexible实现手淘H5页面的终端适配
    max(min)-device-width和max(min)-width的区别
    HTML5 meta最全使用手册
    常见浏览器兼容性问题与解决方案
    响应式设计的性能优化(转)
    移动H5前端性能优化指南
    SQL Server Profiler使用方法
  • 原文地址:https://www.cnblogs.com/xuhang/p/4242452.html
Copyright © 2020-2023  润新知