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(); } }