private void HandelPrintEnded()
        {
            //删除所有成功的打印
            var suOrders = this.OrderViewModels.Where(obj => obj.State == "打印成功").ToArray();

            foreach (var v in suOrders)
            {
                this.OrderViewModels.Remove(v);
            }
            this.PackageId         = 0;
            this.IsUserStop        = false;
            this.printDoc          = null;
            this.IsRunning         = false;
            this.PrintButtonString = "打印";
            this.WorkStateMessage  = "已完成输出";
        }
        /// <summary>
        /// </summary>
        /// <returns></returns>
        public void Print()
        {
            try
            {
                this.orderVmToOrder             = new Dictionary <Order, List <PrintOrderViewModel> >();
                this.IsUserStop                 = false;
                this.IsRunning                  = true;
                this.PrintButtonString          = "停止";
                this.WuliuPrintTemplate.XOffset = this.XOffset;
                this.WuliuPrintTemplate.YOffset = this.YOffset;
                string senderName  = ServiceContainer.GetService <SystemConfigService>().Get(-1, SystemNames.CONFIG_CAINIAO_SENDER_NAME, "");
                string senderPhone = ServiceContainer.GetService <SystemConfigService>().Get(-1, SystemNames.CONFIG_CAINIAO_SENDER_PHONE, "");

                if (string.IsNullOrWhiteSpace(senderName) || string.IsNullOrWhiteSpace(senderPhone))
                {
                    throw new Exception("系统中没有配置发货姓名和电话无法打印");
                }
                var selectedOrderVMs = this.OrderViewModels.Where(obj => obj.IsChecked).ToArray();
                var selectedOrders   = selectedOrderVMs.Select(obj => obj.Source).ToArray();
                if (selectedOrderVMs.Length < 1)
                {
                    throw new Exception("没有需要打印的订单");
                }

                this.WorkStateMessage = "第一步:正在检查是否打印过...";
                WPFHelper.DoEvents();
                foreach (var o in selectedOrderVMs)
                {
                    if (printHistoryService.GetByAll(o.Source.Id, "", "", 0, DateTime.Now.AddDays(-30), DateTime.Now, 0, 0).Total > 0)
                    {
                        o.State      = "已经打印过,请先删除打印历史";
                        o.Background = Brushes.Red;
                        throw new Exception("订单编号:" + o.Source.Id + " 已经打印过,请先删除打印历史");
                    }
                    WPFHelper.DoEvents();
                }

                this.WorkStateMessage = "第二步:正在重置当前打印数据...";
                WPFHelper.DoEvents();
                foreach (var v in selectedOrderVMs)
                {
                    v.WuliuNumber     = null;
                    v.DeliveryNumber  = "";
                    v.DeliveryCompany = "";
                    v.State           = "";
                    v.Background      = null;
                    WPFHelper.DoEvents();
                }

                this.WorkStateMessage = "第三步:正在合并订单数据...";
                WPFHelper.DoEvents();
                //在线支付,需要合并订单
                var mergedOrders = new List <Order>();
                if (selectedOrders[0].PopPayType == PopPayType.ONLINE)
                {
                    //合并相同订单
                    foreach (var or in selectedOrders)
                    {
                        if (this.IsUserStop)
                        {
                            throw new Exception("用户已停止打印");
                        }
                        WPFHelper.DoEvents();
                        var first = mergedOrders.FirstOrDefault(obj => HasSameReceiverInfo(or, obj));
                        if (first == null)
                        {
                            mergedOrders.Add(or);
                            List <PrintOrderViewModel> vms = new List <PrintOrderViewModel>();
                            vms.Add(this.OrderViewModels.First(obj => obj.Source.Id == or.Id));
                            orderVmToOrder.Add(or, vms);
                        }
                        else
                        {
                            //合并商品,订单可能被重复打印,以前合并过的,不再合并
                            foreach (var og in or.OrderGoodss)
                            {
                                if (first.OrderGoodss.Any(obj => obj.Id == og.Id) == false)
                                {
                                    first.OrderGoodss.Add(og);
                                }
                            }
                            orderVmToOrder[first].Add(this.OrderViewModels.First(obj => obj.Source.Id == or.Id));
                        }
                    }
                }
                else
                {
                    mergedOrders.AddRange(selectedOrders);
                    foreach (var mo in mergedOrders)
                    {
                        orderVmToOrder.Add(mo, this.OrderViewModels.Where(obj => obj.Source.Id == mo.Id).ToList());
                    }
                }
                //生成快递单号
                var wuliuNumbers = new WuliuNumber[mergedOrders.Count];
                for (int i = 0; i < wuliuNumbers.Length; i++)
                {
                    if (this.IsUserStop)
                    {
                        throw new Exception("用户已停止打印");
                    }

                    try
                    {
                        this.WorkStateMessage = string.Format("第四步:正在获取快递单号{0}/{1}...", i + 1, wuliuNumbers.Length);
                        WPFHelper.DoEvents();
                        wuliuNumbers[i] = ServiceContainer.GetService <WuliuNumberService>().GenWuliuNumber(this.Shop, this.WuliuPrintTemplate, mergedOrders[i], GetMatchOrderViewModelsWuliuId(mergedOrders[i]), this.PackageId > 0 ? this.PackageId.ToString() : "", senderName, senderPhone, this.WuliuBranch.SenderAddress).First;
                        foreach (var ov in this.orderVmToOrder[mergedOrders[i]])
                        {
                            ov.WuliuNumber     = wuliuNumbers[i];
                            ov.DeliveryCompany = wuliuNumbers[i].DeliveryCompany;
                            ov.DeliveryNumber  = wuliuNumbers[i].DeliveryNumber;
                            ov.State           = "";
                            ov.PageNumber      = i + 1;
                        }
                    }
                    catch (Exception ex)
                    {
                        var vms = this.orderVmToOrder[mergedOrders[i]];
                        foreach (var v in vms)
                        {
                            v.State      = ex.Message;
                            v.Background = Brushes.Red;
                        }
                        throw;
                    }
                }

                var allShops = ServiceContainer.GetService <ShopService>().GetByAll().Datas;
                var vs       = ServiceContainer.GetService <VendorService>();
                //生成自定义打印数据
                var userDatas = new Dictionary <string, string> [mergedOrders.Count];
                for (int i = 0; i < userDatas.Length; i++)
                {
                    if (this.IsUserStop)
                    {
                        throw new Exception("用户已停止打印");
                    }

                    this.WorkStateMessage = string.Format("第五步:正在生成自定义数据{0}/{1}...", i + 1, wuliuNumbers.Length);
                    WPFHelper.DoEvents();
                    userDatas[i] = new Dictionary <string, string>();
                    StringBuilder goods_commment = new StringBuilder();
                    if (mergedOrders[i].Type == OrderType.NORMAL)
                    {
                        if (mergedOrders[i].OrderGoodss != null && mergedOrders[i].OrderGoodss.Count > 0)
                        {
                            foreach (var goods in mergedOrders[i].OrderGoodss.Where(obj => (int)obj.State <= (int)OrderState.SUCCESS))
                            {
                                goods_commment.AppendLine(vs.GetVendorPingyingName(goods.Vendor).ToUpper() + " " + goods.Number + " " + goods.Edtion + " " + goods.Color + " " + goods.Size + " (" + goods.Count + ")");
                            }
                        }
                        if (mergedOrders[i].PopPayType != PopPayType.COD)
                        {
                            goods_commment.AppendLine(mergedOrders[i].PopSellerComment);
                        }
                    }
                    userDatas[i].Add("goodsInfoSellerComment", goods_commment.ToString());
                    userDatas[i].Add("suminfo", string.Format("店:{0},数:{1},付:{2}", allShops.FirstOrDefault(obj => obj.Id == mergedOrders[i].ShopId).Mark, mergedOrders[i].OrderGoodss.Select(obj => obj.Count).Sum().ToString(), mergedOrders[i].PopPayTime.ToString("yyyy-MM-dd HH:mm:ss")));
                }

                this.WorkStateMessage = string.Format("第六步:输出打印数据...");
                WPFHelper.DoEvents();
                this.printDoc = new CainiaoPrintDocument(mergedOrders.ToArray(), wuliuNumbers, userDatas, this.WuliuPrintTemplate);
                string file = printDoc.StartPrint(this.Printer, this.PrintServerAdd);
                this.WorkStateMessage = string.Format("第七步:保存打印记录...");
                WPFHelper.DoEvents();
                UploadPrintHistory(selectedOrderVMs);
                HandelPrintEnded();
                if (this.WuliuPrintTemplate.SourceType == WuliuPrintTemplateSourceType.CAINIAO)
                {
                    LocalConfigService.UpdateValue(SystemNames.CONFIG_PRINTSERVERADD_CAINIAO, this.PrintServerAdd);
                }
                else if (this.WuliuPrintTemplate.SourceType == WuliuPrintTemplateSourceType.PINDUODUO)
                {
                    LocalConfigService.UpdateValue(SystemNames.CONFIG_PRINTSERVERADD_PDD, this.PrintServerAdd);
                }
                if (string.IsNullOrWhiteSpace(file) == false && file.StartsWith("http"))
                {
                    //下载文件
                    byte[] content = MsHttpRestful.GetUrlEncodeBodyReturnBytes(file, null);
                    Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog();
                    sfd.AddExtension     = true;
                    sfd.DefaultExt       = "pdf";
                    sfd.Filter           = "*.pdf|PDF 文件";
                    sfd.FileName         = "快递单 " + this.WuliuPrintTemplate.DeliveryCompany + " " + DateTime.Now.ToString("MM-dd") + ".pdf";
                    sfd.InitialDirectory = LocalConfigService.GetValue("PrintFileSaveDir_" + this.shipper, "");
                    if (sfd.ShowDialog().Value == false)
                    {
                        return;
                    }
                    File.WriteAllBytes(sfd.FileName, content);
                    LocalConfigService.UpdateValue("PrintFileSaveDir_" + this.shipper, new FileInfo(sfd.FileName).DirectoryName);
                }
                LocalConfigService.UpdateValue(SystemNames.CONFIG_PRINTER_DELIVERY_HOT, this.Printer);
                var    offsets   = LocalConfigService.GetValue(SystemNames.CONFIG_PRINT_OFFSETS, "").Split(new string[] { "###" }, StringSplitOptions.RemoveEmptyEntries).ToList();
                string url       = this.WuliuPrintTemplate.UserOrIsvTemplateAreaUrl ?? this.WuliuPrintTemplate.StandTemplateUrl;
                string urlOffset = url + "," + XOffset + "," + YOffset;
                offsets.RemoveAll(obj => obj.Contains(url));
                offsets.Add(urlOffset);
                string strOffsets = string.Join("###", offsets);
                LocalConfigService.UpdateValue(SystemNames.CONFIG_PRINT_OFFSETS, strOffsets);
            }
            finally
            {
                HandelPrintEnded();
            }
        }