182 lines
6.5 KiB
C#
182 lines
6.5 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 内容浏览器
|
|
/// 订单详情
|
|
/// 发票详情
|
|
/// 申请发票
|
|
/// </summary>
|
|
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<int>();
|
|
set => SetValue(value);
|
|
}
|
|
/// <summary>
|
|
/// 显示子浏览器
|
|
/// </summary>
|
|
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=(?<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<bool> { Data = true });
|
|
return;
|
|
}
|
|
await ExecuteInvoiceApplyScriptAsync(b);
|
|
}
|
|
else
|
|
{
|
|
// 页面异常(未渲染出发票表单)时直接判定失败,避免批量开票长时间等待
|
|
_currentInvoiceTcs?.TrySetResult(new Result<bool> { Data = false });
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注入发票填写脚本并执行。
|
|
/// 单张申请模式保持原有行为;批量开票模式下轮询脚本写入的
|
|
/// <c>window.__invoiceApplyResult</c>,完成后通过 <see cref="_currentInvoiceTcs"/> 回传结果。
|
|
/// </summary>
|
|
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<bool> { 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<bool> 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<bool?>("result") == true;
|
|
if (isSuccess)
|
|
{
|
|
_currentInvoiceTcs.TrySetResult(new Result<bool> { Data = true });
|
|
}
|
|
else
|
|
{
|
|
string errMsg = obj.Value<string>("error_msg");
|
|
_currentInvoiceTcs.TrySetResult(new Result<bool> { 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": "商家已与您协商开票,如有需要,请联系商家"
|
|
}*/
|
|
|
|
}
|
|
|
|
}
|
|
}
|