public override WuliuNumber GetWuliuNumber(Shop shop, string popSellerNumberId, WuliuPrintTemplate wuliuTemplate, Order order, string[] wuliuIds, string packageId, string senderName, string senderPhone, string senderAddress) { PddReqWaybillGet reqGet = new PddReqWaybillGet(); reqGet.sender = new PddReqWaybillGetSender { name = senderName, mobile = senderPhone, address = ConvertToAddress(senderAddress, PopType.PINGDUODUO) }; reqGet.wp_code = wuliuTemplate.CpCode; reqGet.need_encrypt = true; reqGet.trade_order_info_dtos = new PddReqWaybillGetTradeOrderInfoDto[1] { new PddReqWaybillGetTradeOrderInfoDto() }; reqGet.trade_order_info_dtos[0].object_id = ((long)DateTime.UtcNow.Subtract(UNIX_START_TIME).TotalSeconds).ToString(); reqGet.trade_order_info_dtos[0].user_id = popSellerNumberId; reqGet.trade_order_info_dtos[0].template_url = wuliuTemplate.StandTemplateUrl; reqGet.trade_order_info_dtos[0].recipient = new PddReqWaybillGetTradeOrderInfoDtoRecipient() { name = order.ReceiverName, mobile = order.ReceiverMobile, phone = order.ReceiverPhone, address = ConvertToAddress(order.ReceiverAddress, order.PopType) }; reqGet.trade_order_info_dtos[0].package_info = new PddReqWaybillGetTradeOrderInfoDtoPackageInfo { id = packageId, items = new PddReqWaybillGetTradeOrderInfoDtoPackageInfoItem[] { new PddReqWaybillGetTradeOrderInfoDtoPackageInfoItem { name = "商品", count = 1 } } }; reqGet.trade_order_info_dtos[0].order_info = new PddReqWaybillGetTradeOrderInfoDtoOrderInfo { order_channels_type = "OTHER", trade_order_list = wuliuIds }; SortedDictionary <string, string> param = new SortedDictionary <string, string>(); param["param_waybill_cloud_print_apply_new_request"] = Newtonsoft.Json.JsonConvert.SerializeObject(reqGet); var rspGet = this.Invoke <PddRspWaybillGet>(shop, "pdd.waybill.get", param); var wn = new WuliuNumber { CreateTime = DateTime.Now, DeliveryCompany = wuliuTemplate.DeliveryCompany, DeliveryNumber = rspGet.modules[0].waybill_code, PackageId = packageId, PrintData = rspGet.modules[0].print_data, ReceiverAddress = order.ReceiverAddress, ReceiverMobile = order.ReceiverMobile, ReceiverPhone = order.ReceiverPhone, ReceiverName = order.ReceiverName, SourceType = WuliuPrintTemplateSourceType.PINDUODUO, WuliuIds = string.Join(",", wuliuIds) }; return(wn); }
public abstract void UpdateWuliuNumber(Shop shop, WuliuPrintTemplate wuliuTemplate, Order order, WuliuNumber wuliuNumber);
public override void UpdateWuliuNumber(Shop shop, WuliuPrintTemplate wuliuTemplate, Order order, WuliuNumber wuliuNumber) { PddReqWaybillUpdate reqUpdate = new PddReqWaybillUpdate(); reqUpdate.waybill_code = wuliuNumber.DeliveryNumber; reqUpdate.wp_code = wuliuTemplate.CpCode; reqUpdate.recipient = new PddReqWaybillGetTradeOrderInfoDtoRecipient { name = order.ReceiverName, mobile = order.ReceiverMobile, phone = order.ReceiverPhone, address = ConvertToAddress(order.ReceiverAddress, order.PopType) }; SortedDictionary <string, string> param = new SortedDictionary <string, string>(); param["param_waybill_cloud_print_update_request"] = Newtonsoft.Json.JsonConvert.SerializeObject(reqUpdate); var rspUpdate = this.Invoke <PddRspWaybillUpdate>(shop, "pdd.waybill.update", param); wuliuNumber.PrintData = rspUpdate.print_data; }
public override void UpdateWuliuNumber(Shop shop, WuliuPrintTemplate wuliuTemplate, Order order, WuliuNumber wuliuNumber) { //需要更新菜鸟面单以打印正确的信息 var updateReq = new CainiaoWaybillIiUpdateRequest { }; var updateReqBody = new CainiaoWaybillIiUpdateRequest.WaybillCloudPrintUpdateRequestDomain { CpCode = wuliuTemplate.CpCode, WaybillCode = wuliuNumber.DeliveryNumber, TemplateUrl = wuliuTemplate.StandTemplateUrl, Recipient = TaobaoConvertToUserInfoDtoDomain(order.ReceiverAddress, order.ReceiverName, order.ReceiverPhone, order.ReceiverMobile, order.PopType), }; updateReq.ParamWaybillCloudPrintUpdateRequest_ = updateReqBody; var rsp = InvokeOpenApi <CainiaoWaybillIiUpdateResponse>(shop, updateReq); wuliuNumber.PrintData = rsp.PrintData; }
public override WuliuNumber GetWuliuNumber(Shop shop, string popSellerNumberId, WuliuPrintTemplate wuliuTemplate, Order order, string[] wuliuIds, string packageId, string senderName, string senderPhone, string senderAddress) { if (string.IsNullOrWhiteSpace(senderName) || string.IsNullOrWhiteSpace(senderPhone)) { throw new Exception("淘宝接口发货人不完整请配置"); } if (string.IsNullOrWhiteSpace(popSellerNumberId)) { throw new Exception("淘宝卖家数据编号为空"); } //生成请求参数 CainiaoWaybillIiGetRequest req = new CainiaoWaybillIiGetRequest(); var reqBody = new CainiaoWaybillIiGetRequest.WaybillCloudPrintApplyNewRequestDomain(); reqBody.CpCode = wuliuTemplate.CpCode; reqBody.Sender = new CainiaoWaybillIiGetRequest.UserInfoDtoDomain { Phone = "", Name = senderName, Mobile = senderPhone, Address = TaobaoConvertToAddressDtoDomain(senderAddress, PopType.TAOBAO) }; reqBody.NeedEncrypt = true; reqBody.TradeOrderInfoDtos = new List <CainiaoWaybillIiGetRequest.TradeOrderInfoDtoDomain>();//订单信息,一个请求里面可以包含多个订单,我们系统里面,默认一个 var or = new CainiaoWaybillIiGetRequest.TradeOrderInfoDtoDomain { ObjectId = Guid.NewGuid().ToString() }; or.UserId = long.Parse(popSellerNumberId); or.TemplateUrl = wuliuTemplate.StandTemplateUrl; or.Recipient = new CainiaoWaybillIiGetRequest.UserInfoDtoDomain { Phone = order.ReceiverPhone, Mobile = order.ReceiverMobile, Name = order.ReceiverName, Address = TaobaoConvertToAddressDtoDomain(order.ReceiverAddress, order.PopType), }; or.OrderInfo = new CainiaoWaybillIiGetRequest.OrderInfoDtoDomain { OrderChannelsType = "OTHERS", TradeOrderList = new List <string>(wuliuIds) }; or.PackageInfo = new CainiaoWaybillIiGetRequest.PackageInfoDtoDomain { Id = packageId == "" ? null : packageId, Items = new List <CainiaoWaybillIiGetRequest.ItemDomain>() }; or.PackageInfo.Items.AddRange(order.OrderGoodss.Where(obj => (int)obj.State >= (int)OrderState.PAYED && (int)obj.State <= (int)OrderState.SUCCESS).Select(obj => new CainiaoWaybillIiGetRequest.ItemDomain { Name = obj.Number + "," + obj.Edtion + "," + obj.Color + "," + obj.Size, Count = obj.Count })); if (or.PackageInfo.Items.Count < 1) { or.PackageInfo.Items.Add(new CainiaoWaybillIiGetRequest.ItemDomain { Name = "没有商品或者其它未定义商品", Count = 1 }); } reqBody.TradeOrderInfoDtos.Add(or); req.ParamWaybillCloudPrintApplyNewRequest_ = reqBody; var rsp = InvokeOpenApi <CainiaoWaybillIiGetResponse>(shop, req); if (rsp.Modules == null || rsp.Modules.Count < 1) { throw new Exception("菜鸟电子面单未返回数据:" + rsp.ErrMsg); } var wuliuNumber = new WuliuNumber { CreateTime = DateTime.Now }; wuliuNumber.ReceiverAddress = order.ReceiverAddress; wuliuNumber.ReceiverMobile = order.ReceiverMobile; wuliuNumber.ReceiverName = order.ReceiverName; wuliuNumber.ReceiverPhone = order.ReceiverPhone; wuliuNumber.DeliveryCompany = wuliuTemplate.DeliveryCompany; wuliuNumber.DeliveryNumber = rsp.Modules[0].WaybillCode; wuliuNumber.WuliuIds = string.Join(",", wuliuIds); wuliuNumber.PackageId = packageId; wuliuNumber.PrintData = rsp.Modules[0].PrintData; wuliuNumber.SourceType = WuliuPrintTemplateSourceType.CAINIAO; return(wuliuNumber); }
public void UpdateWuliuNumber(Shop shop, WuliuPrintTemplate wuliuTemplate, Order order, WuliuNumber wuliuNumber) { if (shop.WuliuEnabled == false) { throw new Exception("店铺电子面单接口已禁用,无法调用相应接口操作"); } this.InvokeWithRefreshAccessToken(shop, (Action)(() => GetPop(shop.PopType).UpdateWuliuNumber(shop, wuliuTemplate, order, wuliuNumber))); }
/// <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(); } }