Exemple #1
0
        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);
        }
Exemple #2
0
 public abstract void UpdateWuliuNumber(Shop shop, WuliuPrintTemplate wuliuTemplate, Order order, WuliuNumber wuliuNumber);
Exemple #3
0
        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;
        }
Exemple #4
0
        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;
        }
Exemple #5
0
        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);
        }
Exemple #6
0
 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();
            }
        }