From b84ccc4670bcaacfc32617ccb33ab01a819e788b Mon Sep 17 00:00:00 2001 From: wule Date: Sat, 10 Oct 2026 18:59:37 +0800 Subject: [PATCH] =?UTF-8?q?1=E6=B7=98=E5=AE=9D=E6=8B=8D=E5=8D=95=202?= =?UTF-8?q?=E4=B8=AD=E8=BD=AC=E4=BB=93=E8=AE=A2=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml | 1 + .../BuyerCtrls/TaobaoBuyOrderCtrl.xaml.cs | 5 + .../BuyerCtrls/TaobaoBuyOrderViewModel.cs | 215 +- .../BuyerCtrls/TbBuyerOrderReadCtrl.xaml | 735 ++++ .../BuyerCtrls/TbBuyerOrderReadCtrl.xaml.cs | 2976 +++++++++++++++++ .../OrderCtrls/OrderListRowItemCtrl.xaml | 2 + .../OrderCtrls/OrderListRowItemCtrl.xaml.cs | 248 +- .../Model/DBModel/oms_wei_order_item_info.cs | 4 +- 8 files changed, 4044 insertions(+), 142 deletions(-) create mode 100644 29WxOrderWpf/Ctrls/BuyerCtrls/TbBuyerOrderReadCtrl.xaml create mode 100644 29WxOrderWpf/Ctrls/BuyerCtrls/TbBuyerOrderReadCtrl.xaml.cs diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml index 624e165..2ed1e15 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml @@ -337,6 +337,7 @@ diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml.cs b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml.cs index 49b2101..ab0834e 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml.cs +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderCtrl.xaml.cs @@ -44,6 +44,11 @@ public partial class TaobaoBuyOrderCtrl : UserControl private async void taobaoBuyOrderCtrl_Loaded(object sender, RoutedEventArgs e) { + if (this.ViewModel.BuyType == "direct") + { + this.tcBuyAddress.Title = "拍单地址:"; + } + await ViewModel.Start(); } private void ViewModel_BrowserCreated(ChromiumWebBrowser browser) diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs index d92eb36..ebd483a 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/TaobaoBuyOrderViewModel.cs @@ -805,7 +805,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls await client.Runtime.EvaluateAsync(changeReactInputValueStr, null, true, null, null, true, null, true); string name = null, mobile = null, detail = null, address = null; - if (BuyType == "transit") + if (BuyType == "transit") // 中转仓地址 { if (transitWarehouse == null) throw new Exception("中转仓不存在!"); @@ -816,12 +816,17 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls var addressSubValue = Randomx.GetId(1, 35) + Randomx.GetId(1, 9).ToString().PadLeft(2, '0') + "室" + txtSourceCodeVal; detail = transitWarehouse.TransDetail + addressSubValue; address = name + mobile + transitWarehouse.TransFullAddress + addressSubValue; + + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(mobile) || string.IsNullOrEmpty(address)) + throw new Exception("地址获取失败!"); } - else // todo 直发 + else // 直发 { + if (txtBuyTransitWarehouseVal.ParseToString().Contains("****")) + throw new Exception("地址中含有特殊字符,请手动匹配!"); + + address = txtBuyTransitWarehouseVal; } - if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(mobile) || string.IsNullOrEmpty(address)) - throw new Exception("地址获取失败!"); jsRst = "failed"; sb = new StringBuilder(); @@ -893,28 +898,31 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls throw new Exception("识别地址按钮不存在!"); //Thread.Sleep(5000); - // 3.5 比较旧详细地址,详细地址文字有变化才继续操作 - jsRst = "failed"; - sb = new StringBuilder(); - sb.Append("(function() {\r\n"); - sb.Append(" var txts = document.getElementsByTagName('textarea');\r\n"); - sb.Append(" for (i = 0; i < txts.length; i++) {\r\n"); - sb.Append(" var txt = txts[i];\r\n"); - sb.Append(" if (txt.outerHTML.indexOf('请输入详细地址信息') > 0) {\r\n"); - sb.Append(" return txt.innerHTML;\r\n"); - sb.Append(" }\r\n"); - sb.Append(" }\r\n"); - sb.Append(" return 'failed';\r\n"); - sb.Append("})();"); - jsStr = sb.ToString(); - for (int i = 0; i < 20 && (jsRst == "failed" || string.IsNullOrEmpty(jsRst) || jsRst == oldDetailAddressTxt); i++) + // 3.5 比较旧详细地址,详细地址文字有变化才继续操作(为防止直拍万一地址一致,仅校验中转仓) + if (this.BuyType == "transit") { - var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); - jsRst = r.Result.Value.ParseToString(); - Thread.Sleep(500); + jsRst = "failed"; + sb = new StringBuilder(); + sb.Append("(function() {\r\n"); + sb.Append(" var txts = document.getElementsByTagName('textarea');\r\n"); + sb.Append(" for (i = 0; i < txts.length; i++) {\r\n"); + sb.Append(" var txt = txts[i];\r\n"); + sb.Append(" if (txt.outerHTML.indexOf('请输入详细地址信息') > 0) {\r\n"); + sb.Append(" return txt.innerHTML;\r\n"); + sb.Append(" }\r\n"); + sb.Append(" }\r\n"); + sb.Append(" return 'failed';\r\n"); + sb.Append("})();"); + jsStr = sb.ToString(); + for (int i = 0; i < 20 && (jsRst == "failed" || string.IsNullOrEmpty(jsRst) || jsRst == oldDetailAddressTxt); i++) + { + var r = await client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); + jsRst = r.Result.Value.ParseToString(); + Thread.Sleep(500); + } + if (jsRst == "failed" || string.IsNullOrEmpty(jsRst) || jsRst == oldDetailAddressTxt) + throw new Exception("比较旧地址信息失败!"); } - if (jsRst == "failed" || string.IsNullOrEmpty(jsRst) || jsRst == oldDetailAddressTxt) - throw new Exception("比较旧地址信息失败!"); // 4.核对详细地址 jsRst = "failed"; @@ -1051,7 +1059,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls Thread.Sleep(500); } if (jsRst != "success") - throw new Exception("中转仓地址错误,请重试后再拍单付款!"); + throw new Exception("付款前核对地址错误,请确认地址正确再拍单付款!"); } @@ -1635,36 +1643,37 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls Enabled = false; + + var addMdyUrl = BaseClass.Build29WxObjString("order/wx_add_mdy_tb_buyer_order"); + var addMdyData = UserLogin.GetSignaturex(); + //data3 += "&after_sales_status=" + ""; + addMdyData += "&buyerId=" + buyer.buyer_id; + addMdyData += "&buyerName=" + buyer.buyer_name; + addMdyData += "&order_amount=" + (txtBuyPriceVal.ParseToDecimal() * 100).ParseToInt(); + addMdyData += "&pdd_order_sn=" + "tb_" + txtBuyOrderIdVal.Trim(); + addMdyData += "&order_status_prompt=" + "支付成功"; + //data3 += "&outExpressCompanyCode=" + ""; + addMdyData += "&order_time=" + BaseClass.DateTimeToTimestampSeconds(DateTime.Now); // 先设置当前时间,后面能取到下单时间再修改 + //data3 += "&pre_allocated_order_no=" + 1; + //data3 += "&tracking_number=" + ""; + addMdyData += "&TransitCreateTime=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 先设置当前时间,后面有了仓库建仓时间再修改时间 + addMdyData += "&wx_order_id=" + orderItem.order_id; + addMdyData += "&wx_sku_id=" + orderItem.sku_id; + addMdyData += "&wx_send_type=" + (BuyType == "direct" ? 1 : 0); + var html3 = GetHtml.PostUtf8(addMdyUrl, addMdyData); + if (string.IsNullOrEmpty(html3) || !html3.Contains("\"code\":200")) + html3 = GetHtml.PostUtf8(addMdyUrl, addMdyData); + if (string.IsNullOrEmpty(html3) || !html3.Contains("\"code\":200")) + { + ErrorMsg = "拍单信息保存失败,请取消当前拍下的买手订单,再重新尝试拍单!"; + return; + } + if (BuyType == "transit") { #region 正常中转拍单 if (AbnormalTransitWarehouseOrderInfo == null) { - var addMdyUrl = BaseClass.Build29WxObjString("order/wx_add_mdy_tb_buyer_order"); - var addMdyData = UserLogin.GetSignaturex(); - //data3 += "&after_sales_status=" + ""; - addMdyData += "&buyerId=" + buyer.buyer_id; - addMdyData += "&buyerName=" + buyer.buyer_name; - addMdyData += "&order_amount=" + (txtBuyPriceVal.ParseToDecimal() * 100).ParseToInt(); - addMdyData += "&pdd_order_sn=" + "tb_" + txtBuyOrderIdVal.Trim(); - addMdyData += "&order_status_prompt=" + "支付成功"; - //data3 += "&outExpressCompanyCode=" + ""; - addMdyData += "&order_time=" + BaseClass.DateTimeToTimestampSeconds(DateTime.Now); // 先设置当前时间,后面能取到下单时间再修改 - //data3 += "&pre_allocated_order_no=" + 1; - //data3 += "&tracking_number=" + ""; - addMdyData += "&TransitCreateTime=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 先设置当前时间,后面有了仓库建仓时间再修改时间 - addMdyData += "&wx_order_id=" + orderItem.order_id; - addMdyData += "&wx_sku_id=" + orderItem.sku_id; - addMdyData += "&wx_send_type=" + 0; - var html3 = GetHtml.PostUtf8(addMdyUrl, addMdyData); - if (string.IsNullOrEmpty(html3) || !html3.Contains("\"code\":200")) - html3 = GetHtml.PostUtf8(addMdyUrl, addMdyData); - if (string.IsNullOrEmpty(html3) || !html3.Contains("\"code\":200")) - { - ErrorMsg = "拍单信息保存失败,请取消当前拍下的买手订单,再重新尝试拍单!"; - return; - } - JObject body = new JObject(); body["orderNo"] = orderItem.order_id; // 微信订单号 body["orderSkuId"] = orderItem.sku_id; // 微信商品skuId @@ -1792,6 +1801,112 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls BaseMsgWindow.ShowInfo("拍单信息保存成功"); } + if (BuyType == "direct") + { + #region 直发拍单 + + var url = BaseClass.Build29WxObjString("order/wx_get_order_item_ext_info"); + var data = UserLogin.GetSignaturex(); + data += "&wx_order_id_in=" + orderItem.order_id; + data += "&wx_sku_id_in=" + orderItem.sku_id; + var html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + { + this.ErrorMsg = "直发拍单信息保存失败(01) " + BaseRegex.GetStringJson(ref html, "msg"); + return; + } + var existOrderExtList = JsonHelper.DeserializeJsonToList(JsonHelper.JObjectParse(html)["data"].ParseToString()); + order_item_ext orderExt = new order_item_ext() + { + order_id = orderItem.order_id, + sku_id = orderItem.sku_id, + out_order_id = "tb_" + txtBuyOrderIdVal.Trim(), + shop_app_id = orderItem.Shop.ShopId, + shop_name = orderItem.Shop.ShopAccount, + buy_type = "直发", + }; + var url1 = BaseClass.Build29WxObjString("order/wx_add_order_item_ext_info"); + if (existOrderExtList.Any(eoe => eoe.order_id == orderExt.order_id && eoe.sku_id == orderExt.sku_id)) + url1 = BaseClass.Build29WxObjString("order/wx_mdy_order_item_ext_info"); + var data1 = UserLogin.GetSignaturex(); + data1 += "&wx_order_id=" + orderExt.order_id; + data1 += "&wx_sku_id=" + orderExt.sku_id; + data1 += "&out_order_id=" + orderExt.out_order_id; + data1 += "&shop_app_id=" + orderExt.shop_app_id; + data1 += "&shop_name=" + orderExt.shop_name; + data1 += "&buy_type=" + orderExt.buy_type; + var html1 = GetHtml.PostUtf8(url1, data1); + if (string.IsNullOrEmpty(html1) || !html1.Contains("\"code\":200")) + { + this.ErrorMsg = "直发拍单信息保存失败(02) " + BaseRegex.GetStringJson(ref html1, "msg"); + return; + } + + // 拍单后覆盖原售后状态(如果有) + var url2 = BaseClass.Build29WxObjString("order/wx_update_erp_out_after_sale_status"); + var data2 = UserLogin.GetSignaturex(); + data2 += "&order_id=" + orderItem.order_id; + data2 += "&out_after_sale_status=NULL"; + var html2 = GetHtml.PostUtf8(url2, data2); + if (string.IsNullOrEmpty(html2) || !html2.Contains("\"code\":200")) + html2 = GetHtml.PostUtf8(url2, data2); + if (string.IsNullOrEmpty(html2) || !html2.Contains("\"code\":200")) + { + this.ErrorMsg = "直发拍单信息保存失败(03) " + BaseRegex.GetStringJson(ref html2, "msg"); + return; + } + + JObject obj = new JObject(); + obj["platform"] = "WEISHOP"; + obj["outAmount"] = (txtBuyPriceVal.ParseToDecimal() * 100).ParseToInt() + ""; + obj["outAccount"] = buyer.buyer_name; + obj["orderId"] = orderItem.order_id; + obj["outOrderNo"] = "tb_" + txtBuyOrderIdVal.ParseToString().Trim(); + //if (!order.outExpressCompanyCode.IsNullOrEmpty() && !order.tracking_number.IsNullOrEmpty()) + //{ + // obj["outExpressCompany"] = order.outExpressCompanyCode; + // obj["outExpressNo"] = order.tracking_number; + //} + var dataStr = JsonHelper.SerializeObject(obj); + url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/bind/v2"; + //成功 "0SUCCESS" + //更新微信外采订单状态成功1 + //失败 已存在 1505调用微信接口更新物流信息失败: 非法参数, 同运单号拦截 rid: 69d8ab9c-22baa3b1-67de0d95 + var exportRst = HttpResponseWXBLL.e57PostResponse(url, dataStr, ""); + var code = BaseRegex.GetStringXml(ref exportRst, "code"); + var msg = BaseRegex.GetStringXml(ref exportRst, "msg"); + + if (code == "0" || code == "1") + { + // 利润计算重置为最小值,控件Resource更新时将计算利润 + orderItem.ProfitCount = decimal.MinValue; + var order = orderItem?.ItemOrder; + if (order != null) + { + orderItem.OrderItemExt = orderExt; + order.out_account = buyer.buyer_id; + order.out_express_company = "OTHER"; + order.out_order_no = "tb_" + txtBuyOrderIdVal.ParseToString().Trim(); + orderItem.SetOrderItemTextProperty(); + order.SetOrderTextProperty(); + MainWindow.Instance.orderListCtrl.FilterOneOrder(order, true); + } + + if (!IsAutoBuy) + BaseMsgForm.ShowInfo("拍单信息保存成功"); + } + else + { + //order.sendStatus = "发送失败 " + (string.IsNullOrEmpty(msg) ? data : msg); + //NaiBa.Util.Helper.ConfigHelper.SaveConfig("other_buyer_order_list", lstOtherBuyerOrderInfoLite); + this.ErrorMsg = "直发拍单保存失败,服务端返回 " + msg; + return; + } + #endregion + } + this.IsBuySuccess = true; if (_isWindowLoaded) { diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/TbBuyerOrderReadCtrl.xaml b/29WxOrderWpf/Ctrls/BuyerCtrls/TbBuyerOrderReadCtrl.xaml new file mode 100644 index 0000000..cc849b9 --- /dev/null +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/TbBuyerOrderReadCtrl.xaml @@ -0,0 +1,735 @@ + + + + + + + + + + + + + + + + + + + + + + + +