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

先定义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 + "\t" + item.Context + "\n";
                        }
                        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    到达:江西南昌青山湖区罗家集公司 已收件
时间: 2024-10-14 00:43:31

C#快递跟踪(基于快递100深度定制)的相关文章

android快递跟踪进度条

android 快递跟踪进度条 activity.class import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; public class MainActivity extends

深度定制一个按钮

http://www.cnblogs.com/ygm900/archive/2013/05/28/3104169.html UIButton *btnTemp = [UIButtonbuttonWithType:UIButtonTypeCustom]; 深度定制一个按钮 UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom]; btn1.frame = CGRectMake(0, 0, 200, 140); btn1.cente

solr特点三: 基于Solr实现排序定制化参考

排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说,原因是有些内容不好公开 几点基础概念回顾 (1)排序定制化不同于实现业务排序. 实现业务排序可以是查阶段,通过boost.各种func 组合.离线score等单独或者组合实现排序目标,        或者索引构建阶段的 field boost.document boost        或者索引构

如何使用LESS 深度定制Bootstrap

一.LESS是什么? Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. 中文介绍:http://lesscss.cn/ 有JS基础的同学应该很快就能掌握LESS 二.准备工作,在一个bootstrap项目中使用LESS. 上面的网站介绍了LESS的多种入门方法,这里主要以npm+webstorm 为例:在本地项目中使用LESS生成CSS 通过LESS的语言特性减少编写和维护的难度: 解压npm 得到如下文件: 在web

基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴

国内的mtm系统_百度搜索 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴 PDF文档(共76页) - 下载需1800积分 天津工业大学 硕士学位论文基于网络的服装定制MTM系统研究 姓名:薛煜东 申请学位...目前已成为国内外服装行业的一个研究重点,其本质和核一心就是为客户提供专业化... www.doc88.com/p-209225...?2012-03-21? ? ?-?百度快照?-?74%好评 基于网络的服装定制MTM系统研究 - 硕士论文 - 道客巴巴,布布扣,bubuk

基于FPGA的Ethercat定制栈最大可实现32轴

基于FPGA的Ethercat主栈协议 (最大可带32轴同步运行,同步抖动±75ns,控制精度125us) 各位老板:我司有多年的FPGA研发经验:基于FPGA的Ethercat定制栈更是达到行业领先水平感谢抽空阅读,欢迎合作 市场痛点[PLC厂家的痛点]目前,国内的大多数PLC厂家主要通过增加运控模块来实现轴的运动控制,可控制的轴数比较少(通常是4-6轴),并且模块的价格高昂(一个模块几万).如果要控制多轴成本就更高,而且控制精度不高,轴与轴之间的精度很大,这意味着不能进入高精尖控制领域.[应

基于TensorFlow的深度学习系列教程 2——常量Constant

前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hello World! 常量的概念 在tensorflow中,数据分为几种类型: 常量Constant.变量Variable.占位符Placeholder.其中: 常量:用于存储一些不变的数值,在计算图创建的时候,调用初始化方法时,直接保存在计算图中 变量:模型训练的参数,比如全连接里面的W和bias 占

基于Spring cloud gateway定制的微服务网关

在构建微服务的架构体系过程中,API网关是一个非常重要的组件.那我们应该怎样实现一个微服务API网关,本文主要介绍Spring Cloud Gateway的功能,以及如何基于Spring Cloud Gateway定制自己的网关. Spring Cloud GatewaySpring Cloud Gateway提供的是一个用于在Spring MVC之上构建API网关的library,它的目标是提供一种简单而有效的方式路由API请求,它提供了一个切面,主要关注:安全.监控/metrics.弹性伸缩

学习Keras:《Keras快速上手基于Python的深度学习实战》PDF代码+mobi

有一定Python和TensorFlow基础的人看应该很容易,各领域的应用,但比较广泛,不深刻,讲硬件的部分可以作为入门人的参考. <Keras快速上手基于Python的深度学习实战>系统地讲解了深度学习的基本知识.建模过程和应用,并以深度学习在推荐系统.图像识别.自然语言处理.文字生成和时间序列中的具体应用为案例,详细介绍了从工具准备.数据获取和处理到针对问题进行建模的整个过程和实践经验. <Keras快速上手>PDF,531页,带书签目录,彩色配图,文字可以复制. 配套源代码和