diff --git a/29WxOrder.sln b/29WxOrder.sln index d04f653..2ffd4f3 100644 --- a/29WxOrder.sln +++ b/29WxOrder.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 18 -VisualStudioVersion = 18.4.11620.152 stable +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36221.1 d17.14 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "29WxOrderAllBase", "AllBase\29WxOrderAllBase.csproj", "{6461D807-B1C8-45F0-B388-E0CA1A418DE0}" EndProject @@ -59,8 +59,8 @@ Global {D51A1BB0-17BB-44C3-9129-1F3187E82729}.Release|x64.Build.0 = Release|x64 {D51A1BB0-17BB-44C3-9129-1F3187E82729}.Release|x86.ActiveCfg = Release|x86 {D51A1BB0-17BB-44C3-9129-1F3187E82729}.Release|x86.Build.0 = Release|x86 - {1AD45D66-6872-4522-ACF0-04E2C0514048}.Debug|Any CPU.ActiveCfg = Debug|x86 - {1AD45D66-6872-4522-ACF0-04E2C0514048}.Debug|Any CPU.Build.0 = Debug|x86 + {1AD45D66-6872-4522-ACF0-04E2C0514048}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AD45D66-6872-4522-ACF0-04E2C0514048}.Debug|Any CPU.Build.0 = Debug|Any CPU {1AD45D66-6872-4522-ACF0-04E2C0514048}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {1AD45D66-6872-4522-ACF0-04E2C0514048}.Debug|Mixed Platforms.Build.0 = Debug|x86 {1AD45D66-6872-4522-ACF0-04E2C0514048}.Debug|x64.ActiveCfg = Debug|x64 diff --git a/29WxOrderWpf/29WxOrderWpf.csproj b/29WxOrderWpf/29WxOrderWpf.csproj index 928a4e0..8b1d1ab 100644 --- a/29WxOrderWpf/29WxOrderWpf.csproj +++ b/29WxOrderWpf/29WxOrderWpf.csproj @@ -174,6 +174,7 @@ OrderListCtrl.xaml + Icons.xaml diff --git a/29WxOrderWpf/App.xaml.cs b/29WxOrderWpf/App.xaml.cs index c5af986..b1aa21c 100644 --- a/29WxOrderWpf/App.xaml.cs +++ b/29WxOrderWpf/App.xaml.cs @@ -51,7 +51,7 @@ namespace _29WxOrderWpf //处理非UI线程异常 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); - //StartUp.Init(); + StartUp.Init(); new Initialization().Get(); #region 贴牌 @@ -62,46 +62,45 @@ namespace _29WxOrderWpf //string IbPakFile = "locales/ib.pak";//ico string IcPakFile = "locales/ic.pak";//功能配置 - if (!File.Exists("locales/io.pak")) + if (File.Exists("locales/io.pak")) { - return; - } + var ioTxt = FileBase.ReadAllText("locales/io.pak"); + if (ioTxt.StartsWith("MThd") || !ioTxt.Contains("MThd")) + return; - var ioTxt = FileBase.ReadAllText("locales/io.pak"); - if (ioTxt.StartsWith("MThd") || !ioTxt.Contains("MThd")) - return; - - string agentNameFile = "locales/na.pak"; - if (File.Exists(agentNameFile)) - { - var config = FileBase.ReadAllText(agentNameFile, Encoding.UTF8); - var configArr = config.Split(new string[] { "\r\n", "MThd" }, StringSplitOptions.RemoveEmptyEntries); - if (configArr.Length >= 2) + string agentNameFile = "locales/na.pak"; + if (File.Exists(agentNameFile)) { - BaseClass.ProgramName = configArr[1]; - BaseClass.ToolName = configArr[1]; - BaseClass.AgentName = configArr[0]; + var config = FileBase.ReadAllText(agentNameFile, Encoding.UTF8); + var configArr = config.Split(new string[] { "\r\n", "MThd" }, StringSplitOptions.RemoveEmptyEntries); + if (configArr.Length >= 2) + { + BaseClass.ProgramName = configArr[1]; + BaseClass.ToolName = configArr[1]; + BaseClass.AgentName = configArr[0]; + } } - } - string LogoPakFile = "locales/lo.pak"; // ico - if (File.Exists(LogoPakFile)) - { - BitmapImage bitmap = new BitmapImage(new Uri(LogoPakFile, UriKind.Relative)); - Application.Current.Resources["main29WeixinIcon"] = bitmap; - // winform部分,直接指定路径,从bitmap转换的会丢失颜色 - BaseClass.Ico = new Icon(LogoPakFile); //BitmapImageToIcon(Application.Current.Resources["main29WeixinIcon"] as BitmapImage); - } - //BaseClass.ProgromLogo = Environment.CurrentDirectory + "\\locales\\ia.pak";//logo - //BaseClass.ProgromLogoIco = Environment.CurrentDirectory + "\\locales\\ib.pak";//ico - string ImgPakFile = "locales/im.pak"; - if (File.Exists(ImgPakFile)) - { - BaseClass.LogoImage = Image.FromFile(ImgPakFile); - } + string LogoPakFile = "locales/lo.pak"; // ico + if (File.Exists(LogoPakFile)) + { + BitmapImage bitmap = new BitmapImage(new Uri(LogoPakFile, UriKind.Relative)); + Application.Current.Resources["main29WeixinIcon"] = bitmap; + // winform部分,直接指定路径,从bitmap转换的会丢失颜色 + BaseClass.Ico = new Icon(LogoPakFile); //BitmapImageToIcon(Application.Current.Resources["main29WeixinIcon"] as BitmapImage); + } + //BaseClass.ProgromLogo = Environment.CurrentDirectory + "\\locales\\ia.pak";//logo + //BaseClass.ProgromLogoIco = Environment.CurrentDirectory + "\\locales\\ib.pak";//ico + string ImgPakFile = "locales/im.pak"; + if (File.Exists(ImgPakFile)) + { + BaseClass.LogoImage = Image.FromFile(ImgPakFile); + } - // 待后续完善 - OenMechanism(IgPakFile, OenVersionFile, IaPakFile, LogoPakFile, IcPakFile); + // 待后续完善 + OenMechanism(IgPakFile, OenVersionFile, IaPakFile, LogoPakFile, IcPakFile); + + } #endregion } catch (Exception ex) diff --git a/29WxOrderWpf/Converters/TextToVisibilityConverter.cs b/29WxOrderWpf/Converters/TextToVisibilityConverter.cs index b00a13a..1f0aabc 100644 --- a/29WxOrderWpf/Converters/TextToVisibilityConverter.cs +++ b/29WxOrderWpf/Converters/TextToVisibilityConverter.cs @@ -14,6 +14,8 @@ namespace _29WxOrderWpf.Converters { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + if ( value == null) + return Visibility.Collapsed; return !value.ParseToString().Trim().IsNullOrEmpty() ? Visibility.Visible : Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml index 7f1aaa2..17f9466 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml @@ -28,8 +28,8 @@ - + - - - - - + + + + + + + + + + + diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml.cs b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml.cs index de9d122..56c3722 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml.cs +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerOrderReadCtrl.xaml.cs @@ -51,14 +51,10 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls ConcurrentList lstPddBuyerAfterSaleInfoLite { get; set; } = new ConcurrentList(); public CancellationTokenSource cancellationTokenSource { get; set; } = new CancellationTokenSource(); //public ChromiumWebBrowser cefWebBrowser = null; - public BuyerOrderConfig buyerOrderConfig = new BuyerOrderConfig(); + public BuyerReadOrderConfig buyerReadOrderConfig = new BuyerReadOrderConfig(); public DateTime nextGetOrderTime = DateTime.MinValue; public DateTime lastCefReadOrderTime = DateTime.Now; /// - /// 是否自动读买手单 - /// - public bool IsAutoReadBuyerOrder = true; - /// /// 是否正在读买手单 /// bool isReadBuyerOrder = false; @@ -129,18 +125,20 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls return false; if (isHideNoWxOrderNo && order.ShopOrderIdStr.IsNullOrEmpty()) return false; - if (!string.IsNullOrEmpty(filterTxt) && !order.order_sn.Contains(filterTxt) && !order.ShopOrderIdStr.Contains(filterTxt) && !order.tracking_number.Contains(filterTxt)) + if (!string.IsNullOrEmpty(filterTxt) && !order.order_sn.Contains(filterTxt) && !order.ShopOrderIdStr.ParseToString().Contains(filterTxt) && + !order.tracking_number.Contains(filterTxt) && + !order.sendStatus.ParseToString().Contains(filterTxt)) return false; return true; } private void UserControl_Loaded(object sender, RoutedEventArgs e) { - buyerOrderConfig = NaiBa.Util.Helper.ConfigHelper.LoadConfig("pdd_buyer_order_config"); - if (buyerOrderConfig == null) - buyerOrderConfig = new BuyerOrderConfig(); - this.chkAutoReadBuyerOrder.IsChecked = !buyerOrderConfig.IsPause; - //this.chkAutoAfterSale.IsChecked = buyerOrderConfig.IsAutoAfterSale; + buyerReadOrderConfig = NaiBa.Util.Helper.ConfigHelper.LoadConfig("pdd_buyer_read_order_config"); + if (buyerReadOrderConfig == null) + buyerReadOrderConfig = new BuyerReadOrderConfig(); + this.chkAutoReadBuyerOrder.IsChecked = buyerReadOrderConfig.IsAutoReadOrder; + this.chkAutoAfterSale.IsChecked = buyerReadOrderConfig.IsAutoAfterSale; lstPddBuyerOrderInfoLite = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("pdd_buyer_order_list"); @@ -190,7 +188,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls Thread.Sleep(5000); while (true) { - if (!IsAutoReadBuyerOrder) + if (!buyerReadOrderConfig.IsAutoReadOrder) { Thread.Sleep(1000); Dispatcher.Invoke(new Action(() => @@ -202,7 +200,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls if (DateTime.Now > nextGetOrderTime) { - btnSearch_Click(null, null); + GetOrderAndAfterSale(); } if (isReadBuyerOrder) { @@ -501,10 +499,91 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls //break; } List transitOrderList = new List(); - try { transitOrderList = JsonHelper.DeserializeJsonToList(JObject.Parse(html3)["data"].ParseToString()); } catch { } + try + { + transitOrderList = JsonHelper.DeserializeJsonToList(JObject.Parse(html3)["data"].ParseToString()); + // 直接过滤掉仓库售后单 + transitOrderList = transitOrderList.Where(t => t.transfer_refund_status.IsNullOrZero()).ToList(); + } + catch + { + } return transitOrderList; } + /// + /// 读取订单详情信息 + /// + /// + /// + List GetOrderInfo(string order_ids) + { + Thread.Sleep(100); + var url1 = BaseClass.Build29WxObjString("order/get_erp_order_list"); + var data1 = UserLogin.GetSignaturex(); + data1 += "&erp_order_id_in=" + order_ids; + data1 += "&page_size=" + 1000; + var html1 = GetHtml.PostUtf8(url1, data1); + if (string.IsNullOrEmpty(html1) || !html1.Contains("\"code\":200")) + html1 = GetHtml.PostUtf8(url1, data1); + if (string.IsNullOrEmpty(html1) || !html1.Contains("\"code\":200")) + { + //BaseMsgWindow.ShowError("订单读取失败 " + BaseRegex.GetStringJson(ref html, "msg")); + //break; + } + List orders = new List(); + try + { + orders = JsonHelper.DeserializeJsonToList(JObject.Parse(html1)["data"].ParseToString()); + if (orders == null) + orders = new List(); + } + catch + { + } + var orderItems = GetOrderItemInfo(order_ids); + foreach (var orderItem in orderItems) + { + var order = orders.FirstOrDefault(o => o.order_id == orderItem.order_id); + orderItem.ItemOrder = order; + order.orderItems.Add(orderItem); + } + return orders; + } + + /// + /// 读取订单详情信息 + /// + /// + /// + List GetOrderItemInfo(string order_ids) + { + Thread.Sleep(100); + var url1 = BaseClass.Build29WxObjString("order/get_erp_order_item_list"); + var data1 = UserLogin.GetSignaturex(); + data1 += "&erp_order_id_in=" + order_ids; + data1 += "&page_size=" + 1000; + var html1 = GetHtml.PostUtf8(url1, data1); + if (string.IsNullOrEmpty(html1) || !html1.Contains("\"code\":200")) + html1 = GetHtml.PostUtf8(url1, data1); + if (string.IsNullOrEmpty(html1) || !html1.Contains("\"code\":200")) + { + //BaseMsgWindow.ShowError("订单读取失败 " + BaseRegex.GetStringJson(ref html, "msg")); + //break; + } + List orderItems = new List(); + try + { + orderItems = JsonHelper.DeserializeJsonToList(JObject.Parse(html1)["data"].ParseToString()); + if (orderItems == null) + orderItems = new List(); + } + catch + { + } + return orderItems; + } + /// /// 读取售后单 /// @@ -513,7 +592,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls List GetOrderRefundInfo(string order_ids) { Thread.Sleep(100); - var url2 = BaseClass.Build29WxObjString("order/get_refund_list"); + var url2 = BaseClass.Build29WxObjString("order/get_erp_refund_list"); var data2 = UserLogin.GetSignaturex(); data2 += "&erp_order_id_in=" + order_ids; var html2 = GetHtml.PostUtf8(url2, data2); @@ -529,22 +608,29 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls return refunds; } - void UpdateOrderStatus(PddBuyerOrderLiteInfo o, oms_wei_order_item_info order_item, oms_wei_refund_info refund_item, oms_wei_external_procurement_log transitOrderList) + void UpdateOrderStatus(PddBuyerOrderLiteInfo pdd_order, oms_wei_order_item_info wx_order_item, oms_wei_refund_info wx_refund_item, oms_wei_external_procurement_log wx_transit_order) { - o.ShopOrderIdStr = order_item?.order_id ?? transitOrderList.order_no; - o.ShopOrderSkuIdStr = order_item?.sku_id ?? transitOrderList.order_sku_id; - o.ShopOrderSkuNameStr = order_item?.sku_attr_str; - o.ShopOrderRefundStr = refund_item?.count > 0 ? "店铺售后" : ""; - o.TransitWarehouseIdStr = transitOrderList?.platform; - o.Express1WaybillStr = transitOrderList?.express_1_waybill; - o.Express1CompanyStr = transitOrderList?.express_1_company; - o.Express2WaybillStr = transitOrderList?.express_2_waybill; - o.Express2CompanyStr = transitOrderList?.express_2_company; - o.TransferWareHouseStatus = transitOrderList?.transfer_warehouse_status.ParseToString(); - o.PreAllocatedOrderNoStr = transitOrderList?.pre_allocated_order_no.ParseToString(); + pdd_order.ShopOrderIdStr = wx_order_item?.order_id ?? wx_transit_order?.order_no; + pdd_order.ShopOrderSkuIdStr = wx_order_item?.sku_id ?? wx_transit_order?.order_sku_id; + pdd_order.ShopOrderSkuNameStr = wx_order_item?.sku_attr_str; + pdd_order.WxOrderCreateTime = wx_order_item?.ItemOrder?.create_time == null ? DateTime.MinValue : BaseClass.StampToDateTime((wx_order_item?.ItemOrder?.create_time).ParseToInt()); + pdd_order.ShopOrderRefundStr = ""; // (/*refund_item?.count > 0 &&*/ wx_order_item.refund_status > 1) ? "店铺售后" : ""; + pdd_order.wxRefundStatus = ""; + if (wx_order_item.refund_status > 1) + { + pdd_order.ShopOrderRefundStr = "店铺售后"; + pdd_order.wxRefundStatus = pdd_order.order_status_prompt.Contains("待发货") ? "待退款" : "待退货"; + } + pdd_order.TransitWarehouseIdStr = wx_transit_order?.platform; + pdd_order.Express1WaybillStr = wx_transit_order?.express_1_waybill; + pdd_order.Express1CompanyStr = wx_transit_order?.express_1_company; + pdd_order.Express2WaybillStr = wx_transit_order?.express_2_waybill; + pdd_order.Express2CompanyStr = wx_transit_order?.express_2_company; + pdd_order.TransferWareHouseStatus = wx_transit_order?.transfer_warehouse_status.ParseToString(); + pdd_order.PreAllocatedOrderNoStr = wx_transit_order?.pre_allocated_order_no.ParseToString(); // 更新订单中转取号状态 - o.sendStatus = (o.TransitOrderStatus + " " + o.ShopOrderRefundStr).Trim(); - o.TransitCreateTime = transitOrderList?.created_time ?? DateTime.MinValue; + pdd_order.sendStatus = (pdd_order.TransitOrderStatus + " " + pdd_order.ShopOrderRefundStr).Trim(); + pdd_order.TransitCreateTime = wx_transit_order?.created_time ?? DateTime.MinValue; } void CefReadBuyerOrder(string url, string data) @@ -588,21 +674,32 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls var transitOrderList = GetOrderTransitWarehouseInfo(out_order_nos); var order_ids = string.Join(",", transitOrderList.Select(ts => ts.order_no)); + var orders = GetOrderInfo(order_ids); + foreach(var order in orders) + { + foreach (var orderItem in order.orderItems) + { + // 中转仓订单 + if (orderItem.ItemOrder.orderItems.Count > 1) + orderItem.ItemTransitOrders.AddRange(transitOrderList.Where(t => t.order_no == orderItem.order_id && t.order_sku_id == orderItem.sku_id)); + else + orderItem.ItemTransitOrders.AddRange(transitOrderList.Where(t => t.order_no == orderItem.order_id)); + } + } var refunds = GetOrderRefundInfo(order_ids); foreach (PddBuyerOrderLiteInfo o in list) { o.buyerId = buyer.buyer_id; o.buyerName = buyer.buyer_name; - o.outExpressCompanyMsg = o.extra_info.order_hint?.message; // 查找店铺订单并更新店铺订单状态 - var ShopOrder = GlobalConfig.lstOrder.FirstOrDefault(o1 => o1.orderItems.Any(i1 => i1.ItemTransitOrders.Any(t1 => t1.out_order_no == o.order_sn))); - if (ShopOrder != null) + var transit_item = transitOrderList.FirstOrDefault(t1 => t1.out_order_no == o.order_sn); + if (transit_item != null) { - var order_item = ShopOrder.orderItems.FirstOrDefault(oi => oi.ItemTransitOrders.Any(t1 => t1.out_order_no == o.order_sn)); + var shopOrder = orders.FirstOrDefault(o1 => o1.order_id == transit_item.order_no); + var order_item = shopOrder.orderItems.FirstOrDefault(oi => oi.ItemTransitOrders.Any(t1 => t1.out_order_no == o.order_sn)); var refund_item = refunds.FirstOrDefault(ri => ri.order_id == order_item.order_id) ?? order_item?.ItemRefund; - var transit_item = transitOrderList.FirstOrDefault(t1 => t1.out_order_no == o.order_sn); UpdateOrderStatus(o, order_item, refund_item, transit_item); } @@ -655,7 +752,6 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls order.parent_order_sn = o.parent_order_sn; order.service_amount = o.service_amount; order.shipping_amount = o.shipping_amount; - order.outExpressCompanyMsg = o.outExpressCompanyMsg; order.order_time = o.order_time; order.tracking_number = o.tracking_number; order.ShopOrderIdStr = o.ShopOrderIdStr; @@ -669,6 +765,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls order.TransferWareHouseStatus = o.TransferWareHouseStatus; order.PreAllocatedOrderNoStr = o.PreAllocatedOrderNoStr; order.ShopOrderRefundStr = o.ShopOrderRefundStr; + order.wxRefundStatus = o.wxRefundStatus; var index = lstPddBuyerOrderInfoLite.IndexOf(order); Dispatcher.Invoke(new Action(() => @@ -703,6 +800,14 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls Task.Run(() => { //SendOrderE57(order); + //if (order.sendStatus.ParseToString().Contains("售后")) + if (order.ShopOrderRefundStr.ParseToString().Contains("售后")) + { + if (",2,3,4,5,7,8,10,31,".Contains((order.after_sales?.after_sales_status).ParseToString())) + { + var afterSaleRst = PddAutoAfterSale(order); + } + } SendTransitOrderE57(order); }); @@ -800,7 +905,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls { Task.Run(() => { - SendAfterSaleE57(lstPddBuyerAfterSaleInfoLite.FirstOrDefault(a => a.orderSn == afterSale.orderSn)); + //SendAfterSaleE57(lstPddBuyerAfterSaleInfoLite.FirstOrDefault(a => a.orderSn == afterSale.orderSn)); }); Dispatcher.Invoke(new Action(() => @@ -821,30 +926,25 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls TimeSpan PauseTick = new TimeSpan(1); private void chkAutoReadBuyerOrder_CheckedChanged(object sender, RoutedEventArgs e) { - - IsAutoReadBuyerOrder = chkAutoReadBuyerOrder.IsChecked == true; - - if (!IsAutoReadBuyerOrder) + if (isLoad) { - //if (cancellationTokenSource != null) - // cancellationTokenSource.Cancel(); - } - - if (IsAutoReadBuyerOrder) + buyerReadOrderConfig.IsAutoReadOrder = chkAutoReadBuyerOrder.IsChecked == true; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_buyer_order_config", buyerReadOrderConfig); + //buyerOrderConfig = NaiBa.Util.Helper.ConfigHelper.LoadConfig("pdd_buyer_order_config"); + + if (buyerReadOrderConfig.IsAutoReadOrder) nextGetOrderTime = DateTime.Now + PauseTick; else PauseTick = nextGetOrderTime - DateTime.Now; - - if (isLoad) - { - buyerOrderConfig.IsPause = !IsAutoReadBuyerOrder; - NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_buyer_order_config", buyerOrderConfig); - //buyerOrderConfig = NaiBa.Util.Helper.ConfigHelper.LoadConfig("pdd_buyer_order_config"); - return; } } private void btnSearch_Click(object sender, RoutedEventArgs e) + { + GetOrderAndAfterSale(); + } + + void GetOrderAndAfterSale() { nextGetOrderTime = DateTime.Now.AddMinutes(25); GetPddOrder(); @@ -1148,15 +1248,30 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls var transitOrderList = GetOrderTransitWarehouseInfo(out_order_nos); var order_ids = string.Join(",", transitOrderList.Select(ts => ts.order_no)); + var orders = GetOrderInfo(order_ids); + //foreach (var order in orders) + //{ + // foreach (var orderItem in order.orderItems) + // { + // // 中转仓订单 + // if (orderItem.ItemOrder.orderItems.Count > 1) + // orderItem.ItemTransitOrders.AddRange(transitOrderList.Where(t => t.order_no == orderItem.order_id && t.order_sku_id == orderItem.sku_id)); + // else + // orderItem.ItemTransitOrders.AddRange(transitOrderList.Where(t => t.order_no == orderItem.order_id)); + // } + //} var refunds = GetOrderRefundInfo(order_ids); // 查找店铺订单并更新店铺订单状态 - var ShopOrder = GlobalConfig.lstOrder.FirstOrDefault(o1 => o1.orderItems.Any(i1 => i1.ItemTransitOrders.Any(t1 => t1.out_order_no == buyerOrder.order_sn))); - if (ShopOrder != null) + //var ShopOrder = GlobalConfig.lstOrder.FirstOrDefault(o1 => o1.orderItems.Any(i1 => i1.ItemTransitOrders.Any(t1 => t1.out_order_no == buyerOrder.order_sn))); + //var ShopOrder = orders.FirstOrDefault(o1 => o1.orderItems.Any(i1 => i1.ItemTransitOrders.Any(t1 => t1.out_order_no == buyerOrder.order_sn))); + //if (ShopOrder != null) + var transit_item = transitOrderList.FirstOrDefault(t1 => t1.out_order_no == buyerOrder.order_sn); + if (transit_item != null) { - var order_item = ShopOrder.orderItems.FirstOrDefault(oi => oi.ItemTransitOrders.Any(t1 => t1.out_order_no == buyerOrder.order_sn)); + var shopOrder = orders.FirstOrDefault(o => o.order_id == transit_item.order_no); + var order_item = shopOrder.orderItems.FirstOrDefault(oi => oi.ItemTransitOrders.Any(t1 => t1.out_order_no == buyerOrder.order_sn)); var refund_item = refunds.FirstOrDefault(ri => ri.order_id == order_item.order_id) ?? order_item?.ItemRefund; - var transit_item = transitOrderList.FirstOrDefault(t1 => t1.out_order_no == buyerOrder.order_sn); UpdateOrderStatus(buyerOrder, order_item, refund_item, transit_item); } @@ -1180,81 +1295,82 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls // order.sendStatus = ""; NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_buyer_order_list", lstPddBuyerOrderInfoLite); - // 处理中, "已取号(更正)", 已取号, 提前取号, 取号失败 + // 仓库处理中 + if (order.sendStatus.ParseToString().Contains("仓库处理中")) + { + // 仓库处理中超过10分钟认为已处理完成,否则跳过。 + if (order.TransitCreateTime.AddMinutes(10) < DateTime.Now) + { + order.sendStatus = order.sendStatus.Replace("仓库处理中", "").Trim(); + } + else + { + return; + } + } + + // "已取号(更正)", 已取号, 提前取号, 取号失败 // 正在处理取号、已取号(包括提前取号更正的订单)、有售后或者没有中转仓(非中转系统订单)的订单,不发送 - if (order.sendStatus == "处理中" || order.sendStatus == "已取号" || order.sendStatus == "已取号(更正)" || + if (order.sendStatus == "已取号" || order.sendStatus == "已取号(更正)" || order.sendStatus.ParseToString().Contains("售后") || order.TransitWarehouseIdStr.IsNullOrEmpty()) { return; } - // 物流单号不为空才更新服务端 - if (order.outExpressCompanyCode.IsNullOrEmpty() || order.tracking_number.IsNullOrEmpty()) + // 物流单号为空,先判断是否需要提前取号,无需提前取号则直接返回 + if (order.outExpressCompanyCode.IsNullOrEmpty() || order.tracking_number.IsNullOrEmpty()) { + // 如果是隔天订单,拍单20分钟后立即提前取号 + if (!order.sendStatus.Contains("提前取号") && order.TransitCreateTime != DateTime.MinValue && + DateTime.Now.Date > order.WxOrderCreateTime.Date && DateTime.Now > order.TransitCreateTime.AddMinutes(20)) + { + JObject data = new JObject(); + data["outOrderNo"] = order.order_sn; + data["warehouseCode"] = order.TransitWarehouseIdStr; //transit.TransId; // 中转仓仓库对应编码 + data["platform"] = "WEISHOP"; + var getVirtualTicketUrl = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/order/virtual/create"; + var getVirtualTicketDataStr = JsonHelper.SerializeObject(data); + + var getVirtualTicketRst = HttpResponseWXBLL.e57PostResponse(getVirtualTicketUrl, getVirtualTicketDataStr, ""); + if (!getVirtualTicketRst.ParseToString().Contains("200") && !getVirtualTicketRst.ParseToString().Contains("0")) + { + string msg = ""; + string code = ""; + try + { + System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); + xmlDoc.LoadXml(getVirtualTicketRst); + code = xmlDoc["AjaxResult"]["code"].InnerText; + msg = xmlDoc["AjaxResult"]["msg"].InnerText; + } + catch + { + msg = getVirtualTicketRst.ParseToString(); + } + //BaseMsgForm.ShowError("拍单信息保存成功,接收到erp服务端传递的错误消息:" + msg, "订单提前取号失败"); + order.sendStatus = "提前取号失败,服务端返回 " + msg; + } + } + return; } - // 如果物流不一致,提交物流信息 - if (order.Express1CompanyStr != order.outExpressCompanyCode || order.Express1WaybillStr != order.tracking_number) - { - //JObject obj = new JObject(); - //obj["orderNo"] = order.ShopOrderIdStr; - //obj["orderSkuId"] = order.ShopOrderSkuIdStr; - //obj["outOrderNo"] = order.order_sn; - //obj["outAmount"] = order.order_amount.ParseToString(); - //obj["buyerAccount"] = order.buyerName; - //obj["purchaserNote"] = BaseClass.NickName; - //obj["platform"] = order.TransitWarehouseIdStr; // 中转仓ID - //obj["orderPlatformCode"] = "WEISHOP"; - //if (!order.outExpressCompanyCode.IsNullOrEmpty() && !order.tracking_number.IsNullOrEmpty()) - //{ - // obj["express1Company"] = order.outExpressCompanyCode; // 物流公司编号 - // obj["express1Waybill"] = order.tracking_number; // 物流单号 - //} - //var dataStr = JsonHelper.SerializeObject(obj); - //string url = "https://po.e57.cn/prod-api/api/oms-api/externalProcurement/saveOrUpdate"; - ////保存成功200 - //var exportRst = HttpResponseWXBLL.e57PostResponse(url, dataStr, ""); - - //if (!exportRst.Contains("200")) - //{ - // order.sendStatus = "提交运单信息失败"; - // return; - //} - //if (order.outExpressCompanyCode.IsNullOrEmpty() || order.tracking_number.IsNullOrEmpty()) - //{ - // order.sendStatus = "已提交"; - //} - - //var url3 = BaseClass.Build29WxObjString("order/wx_update_erp_order_express"); - //var data3 = UserLogin.GetSignaturex(); - //data3 += "&out_order_no=" + order.order_sn; - //data3 += "&express_1_company=" + order.outExpressCompanyCode; // 物流公司编号 - //data3 += "&express_1_waybil=" + order.tracking_number; // 物流单号 - //var html3 = GetHtml.PostUtf8(url3, data3); - //if (string.IsNullOrEmpty(html3) || !html3.Contains("\"code\":200")) - // html3 = GetHtml.PostUtf8(url3, data3); - //if (html3.Contains("\"code\":200")) - //{ - // order.sendStatus = "已提交"; - //} - - // 修改上游物流单号 - string url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/update-upstream-waybill"; - JObject obj = new JObject(); - obj["platform"] = "WEISHOP"; - obj["outOrderNo"] = order.order_sn; //外采单号 - obj["outExpressCompany"] = order.outExpressCompanyCode; // 物流公司编号 - obj["outExpressNo"] = order.tracking_number; // 物流单号 - obj["orderCode"] = order.tracking_number; //实际就是外采单号 - var dataStr = JsonHelper.SerializeObject(obj); - var exportRst = HttpResponseWXBLL.e57PostResponse(url, dataStr, ""); - if (exportRst.Contains("0") || exportRst.Contains("200")) - { - order.sendStatus = "提交物流信息失败"; - return; - } - } + //// 如果物流不一致,提交物流信息 临时补救 + //if (order.Express1CompanyStr != order.outExpressCompanyCode || order.Express1WaybillStr != order.tracking_number) + //{ + // //var url3 = BaseClass.Build29WxObjString("order/wx_update_erp_order_express"); + // //var data3 = UserLogin.GetSignaturex(); + // //data3 += "&out_order_no=" + order.order_sn; + // //data3 += "&express_1_company=" + order.outExpressCompanyCode; // 物流公司编号 + // //data3 += "&express_1_waybil=" + order.tracking_number; // 物流单号 + // //var html3 = GetHtml.PostUtf8(url3, data3); + // //if (string.IsNullOrEmpty(html3) || !html3.Contains("\"code\":200")) + // // html3 = GetHtml.PostUtf8(url3, data3); + // //if (html3.Contains("\"code\":200")) + // //{ + // // order.sendStatus = "已提交"; + // //} + //} // 直接取号 if (order.sendStatus != "提前取号" && order.sendStatus != "提前取号(旧订单)") { @@ -1294,7 +1410,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls } else { - order.sendStatus = "直接取号失败" + BaseRegex.GetStringXml(ref dispatchRst, "msg"); + order.sendStatus = "直接取号失败,服务端返回 " + BaseRegex.GetStringXml(ref dispatchRst, "msg"); } } // 修改提前取号 @@ -1303,6 +1419,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls if (order.TransitCreateTime.AddHours(23) > DateTime.Now) { order.sendStatus = "提前取号流程进行中"; + return; } string url2 = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/update-upstream-waybill"; @@ -1313,7 +1430,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls data["outExpressCompany"] = order.outExpressCompanyCode; // 物流公司编号 data["outExpressNo"] = order.tracking_number; data["platform"] = "WEISHOP"; - data["orderCode"] = order.order_sn; // 中转仓订单唯一标识码 = 外采定单号 + data["orderCode"] = order.order_sn; // 中转仓订单唯一标识码 = 外采订单号 var dataStr2 = JsonHelper.SerializeObject(data); var dispatchRst = HttpResponseWXBLL.e57PostResponse(url2, dataStr2, ""); @@ -1346,7 +1463,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls } else { - order.sendStatus = "修改提前取号失败" + BaseRegex.GetStringXml(ref dispatchRst, "msg"); + order.sendStatus = "修改提前取号失败,服务端返回 " + BaseRegex.GetStringXml(ref dispatchRst, "msg"); } } } @@ -1525,7 +1642,6 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls while (isReadBuyerOrder) { Thread.Sleep(500); - //break; } foreach (var buyer in GlobalConfig.PDDBuyerLoginList) @@ -1533,7 +1649,6 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls //postman request POST 'https://po.e57.cn/prod-api/api/oms-api/external_procurement/hasAfterSsale' \ //--header 'Content-Type: application/json' \ //--body '{ "platform": "WEISHOP", "startTime": 1774763836, "endTime": "1776050614" , "userAccount": "闲鱼会开车的鱼2343"}' - JObject body = new JObject(); body["platform"] = "WEISHOP"; body["startTime"] = BaseClass.DateTimeToTimestampSeconds(DateTime.Now.AddDays(-7)); @@ -1561,14 +1676,14 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls order.wxRefundStatus = order.order_status_prompt.Contains("待发货") ? "待退款" : "待退货"; NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_buyer_order_list", lstPddBuyerOrderInfoLite); - Dispatcher.Invoke(new Action(() => - { - ShowOrder(order); - })); - if (chkAutoAfterSale.IsChecked == true) - { - MakeWxToPddAfterSale(order); - } + //Dispatcher.Invoke(new Action(() => + //{ + // ShowOrder(order); + //})); + //if (chkAutoAfterSale.IsChecked == true) + //{ + // PddAutoAfterSale(order); + //} } } catch (Exception ex) @@ -1584,7 +1699,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls /// /// /// - public string MakeWxToPddAfterSale(PddBuyerOrderLiteInfo order) + public string PddAutoAfterSale(PddBuyerOrderLiteInfo order) { //if (isReadOrder) //{ @@ -1625,6 +1740,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls var afterSaleRst = YkdBuyerOrder.SetOrderAfterSale(buyer, mobile, order.order_sn, applyAmount, refundAmount, newMaxApplyAmount); if (afterSaleRst.Contains("\"after_sales_status\":1") || afterSaleRst.Contains("该订单已全额退款")) { + // 保存退款成功状态 //order.refundStatus = "已完成/退货"; order.order_status_prompt = "退款成功"; NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_buyer_order_list", lstPddBuyerOrderInfoLite); @@ -1691,6 +1807,29 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls else Panel.SetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl, -1); } + + private void btnHide_Click(object sender, RoutedEventArgs e) + { + if (btnHide.Content.ParseToString() == "▲") + { + btnHide.Content = "▼"; + gridTable.Visibility = Visibility.Visible; + } + else + { + btnHide.Content = "▲"; + gridTable.Visibility = Visibility.Collapsed; + } + } + + private void chkAutoAfterSale_Checked(object sender, RoutedEventArgs e) + { + if (isLoad) + { + buyerReadOrderConfig.IsAutoAfterSale = chkAutoAfterSale.IsChecked == true; + NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_buyer_order_config", buyerReadOrderConfig); + } + } } public class YkdBuyerOrder @@ -1730,9 +1869,15 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls } } - public class BuyerOrderConfig + public class BuyerReadOrderConfig { - public bool IsPause = false; + /// + /// 是否自动读单 + /// + public bool IsAutoReadOrder = true; + /// + /// 是否自动售后未发货订单 + /// public bool IsAutoAfterSale = true; } } diff --git a/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml b/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml index 60412c6..b30a197 100644 --- a/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml +++ b/29WxOrderWpf/Ctrls/OrderCtrls/OrderListCtrl.xaml @@ -38,7 +38,7 @@ - + @@ -48,22 +48,25 @@