using _29WxOrderWpf.CefHelper; using CefSharp; using CefSharp.Handler; using CefSharp.Wpf; using Newtonsoft.Json.Linq; using NPOI.XWPF.UserModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Controls; using Work._29Tools.CefTools; using Work.BaseForms; using WxOrder.Framework.Commons; using WxOrder.Framework.Helpers; namespace _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels; public partial class PDDInvoiceViewModel { /// /// 内容浏览器 /// 订单详情 /// 发票详情 /// 申请发票 /// public ChromiumWebBrowser BrowserDetail { get; private set; } partial void InitBrowserDetail() { BrowserDetailZIndex = -1; BrowserDetail = WPFCEFBrowser.CreateChromiumWebBrowser("about:blank", false); LocalResourceRequestHandler detailResourceRequestHandler = new LocalResourceRequestHandler(); detailResourceRequestHandler.ResourceLoadCompleteEvent += DetailRequestHandler_ResourceLoadComplete; BrowserDetail.RequestHandler = new LocalRequestHandler(detailResourceRequestHandler); BrowserDetail.LifeSpanHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow); BrowserDetail.KeyboardHandler = new KeyboardHandler(); BrowserDetail.LoadingStateChanged += BrowserDetail_LoadingStateChanged; } public int BrowserDetailZIndex { get => GetValue(); set => SetValue(value); } /// /// 显示子浏览器 /// public void ShowOrderBrowserDetail() { BrowserZIndex = -1; BrowserDetailZIndex = 10; } public void HidenOrderBrowserDetail() { BrowserDetailZIndex = -1; } private void BrowserDetail_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e) { if (e.IsLoading == false) { var b = (ChromiumWebBrowser)sender; b.Dispatcher.InvokeAsync(async () => { if (b.Address != null && b.Address.StartsWith("https://mobile.yangkeduo.com/transac_return_compensation.html")) { string orderSN = Regex.Match(b.Address, "order_sn=(?\\d+-\\d+)").Groups["sn"].Value; string html = await b.GetBrowser().GetSourceAsync(); if (html.Contains("window.rawData")) { if (html.Contains("\"hasApplied\":true,")) { _currentInvoiceTcs?.TrySetResult(new Result { Data = true }); return; } await ExecuteInvoiceApplyScriptAsync(b); } else { // 页面异常(未渲染出发票表单)时直接判定失败,避免批量开票长时间等待 _currentInvoiceTcs?.TrySetResult(new Result { Data = false }); } } }); } } /// /// 注入发票填写脚本并执行。 /// 单张申请模式保持原有行为;批量开票模式下轮询脚本写入的 /// window.__invoiceApplyResult,完成后通过 回传结果。 /// private async Task ExecuteInvoiceApplyScriptAsync(ChromiumWebBrowser b) { string content = ResourceHelper.GetResourceText("/Ctrls/PDDInvoice/Resources/invoice.js", "29WxFindOrder"); content = content.Replace("{公司}", Config.Title); content = content.Replace("{税号}", Config.TaxNo); if (string.IsNullOrEmpty(content)) return; await b.EvaluateScriptAsync(content);//执行js // 检查是否注入成功 if (await IsInstalledDetailAsync(b) == false) { IsBatchInvoicing = false; BaseMsgForm.ShowError("JS错误,开票失败"); _currentInvoiceTcs.TrySetResult(new Result { Data = false }); return; } //for (int i = 0; i < 120; i++)//循环获取结果 //{ // await Task.Delay(500); // try // { // var res = await b.EvaluateScriptAsync("window.__invoiceApplyResult"); // if (res.Success && res.Result != null) // { // _currentInvoiceTcs.TrySetResult(Convert.ToBoolean(res.Result)); // return; // } // } // catch // { // } //} //_currentInvoiceTcs.TrySetResult(false); } public async Task IsInstalledDetailAsync(ChromiumWebBrowser frame, int timeoutMs = 3000) { var deadline = DateTime.Now.AddMilliseconds(timeoutMs); while (DateTime.Now < deadline) { var r = await frame.EvaluateScriptAsync("!!(window.InvoiceApply && window.InvoiceApply.__installed)") .ConfigureAwait(false); if (r != null && r.Success && r.Result is bool && (bool)r.Result) return true; await Task.Delay(100).ConfigureAwait(false); } return false; } private void DetailRequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) { if (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/order/invoice/apply")) { var obj = JObject.Parse(responseData); bool isSuccess = obj.Value("result") == true; if (isSuccess) { _currentInvoiceTcs.TrySetResult(new Result { Data = true }); } else { string errMsg = obj.Value("error_msg"); _currentInvoiceTcs.TrySetResult(new Result { Data = false, Msg = errMsg }); } return; //{"order_sn":"260921-458426969742556","mall_id":697300659,"trigger_status":1,"business_type":1,"payer_name":"合肥弘贸电子商务有限公司","invoice_kind":0,"invoice_type":0,"letter_head_id":"690562059266556","letterhead_snapshot_id":"SI298036413700604","paper_certificate_url":"","entrust_certify_url":"","source":1,"anti_content":"0asAfoyqYiPs6gd2J0WQ9QOUtOrZ44_LwPI3lrN83FY_wympvl577D6QppXrSLrHJn8eNWv8uXBTdg6_iPUC1aDYt-JuCI1dMpKg2wsf65KUBPzEhRU8pGAbTnWhcJ29ooVcncR90coLgWQiLJ0Xjo0Y4aHEJnnk2lr2PRkY2Kj9ibYc9QW-i2Mr23mjyQMQIahwAhEX-xjSVJEd35qSDQo9VrbY0Fb4kiiL0tHoKEQqmgMcn1BIH9LQB30NJ9s857b25NDDXQyuIT9hR2fCiRoY-96khLJ8QI6wqNL8Q406RBojM6oYsKqEGEFNn7Qyr4N3q-FELBTkkmyToyzs4cM1iUKl3Zaqe0MtFefxmZcLUj3FFxQ6GdAAfKO2WlAkwx7QuMppG7UtkEpRuNjrkojzegy1jaIBWzPrzevvx3egES52PIHEFZASpZ2gNPXaDGSbVGu8shqGDmXuu94aWgXxEE3CzPfVcUZooGs40ThX0ouQF7IFTKM6-NSsk8ZrVjEHdWO1-EE_SCngMCC1vFeAr1g5NvaUCC_87CibfVcWPe5lhgRaq6dKfSAYDoT_bA0nPm6wSDZSxAQbSk-1JZC-O6OpFqXcrkKVUZk0atnozQtKlf1cxcyCl_EkEMnpwZll4g3jEKUxLK_XCIUz0TjDUbF1dpZOsWd39crq7VktSKKZ32b_e0sk6ZkvAf5F7GKwfvfy6RX5YbcrCcpfsjJqaXNGy2G2Y_Oj0iPcpgaXv0zmJjkB217RMtwxBybZnjdOMIlGJWUFls4unwncEvdy4Udgi7EdgB_MXwgn2zGa1_wHKltF7n37wKjKBKlysnfv8mFfqzH3Jv7L4jj9cCQ7P5Fb3E8KQ9J","payer_register_no":"91340103MAKBDKB764","payer_phone":"","payer_account":"","payer_address":"","payer_bank":""} //{"server_time":1792493897,"result":true} /* { "server_time": 1792493128, "error_code": 17003, "error_msg": "商家已与您协商开票,如有需要,请联系商家" }*/ } } }