工单 优化 ,增加图片
This commit is contained in:
1 parent
bf5a70597c
commit
cf2efbcb16
27 files changed
+3555
-1538
No files matched your search
@@ -1,234 +1,105 @@
|
||||
using _29WxOrderWpf.ToolCtrls;
|
||||
using OrderSupportTicket.Models;
|
||||
using OrderSupportTicket.Services;
|
||||
using OrderSupportTicket.ViewModels;
|
||||
using System.Runtime.InteropServices;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace OrderSupportTicket.Views;
|
||||
|
||||
/// <summary>
|
||||
/// 工单对话页面。页面生命周期只负责激活/停用 ViewModel,业务交互均在 ViewModel 中。
|
||||
/// 工单页面外壳,只负责组合子视图以及管理页面生命周期。
|
||||
/// </summary>
|
||||
public partial class OrderSupportTicketView : UserControl
|
||||
{
|
||||
private bool _active;
|
||||
private Window _hostWindow;
|
||||
private bool _active;
|
||||
private Window _hostWindow;
|
||||
|
||||
public OrderSupportTicketView()
|
||||
: this(new TicketService(), CreateDefaultOptions())
|
||||
{
|
||||
}
|
||||
public OrderSupportTicketView() : this(new TicketService(), CreateDefaultOptions()) { }
|
||||
|
||||
/// <summary>
|
||||
/// 使用工单业务服务创建工单页。
|
||||
/// </summary>
|
||||
public OrderSupportTicketView(
|
||||
TicketService ticketService,
|
||||
TicketClientOptions options = null)
|
||||
{
|
||||
InitializeComponent();
|
||||
ViewModel = new OrderSupportTicketViewModel(
|
||||
ticketService,
|
||||
options ?? CreateDefaultOptions());
|
||||
DataContext = ViewModel;
|
||||
Loaded += OnLoaded;
|
||||
Unloaded += OnUnloaded;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当前联调使用的默认参数。正式接入时可由宿主替换为登录账号和店铺 APPID。
|
||||
/// </summary>
|
||||
public static TicketClientOptions CreateDefaultOptions(string fallbackUserName = null)
|
||||
{
|
||||
var configured = TicketClientOptions.FromApplicationSettings();
|
||||
var userName = !string.IsNullOrWhiteSpace(configured.UserName)
|
||||
? configured.UserName
|
||||
: (!string.IsNullOrWhiteSpace(fallbackUserName)
|
||||
? fallbackUserName.Trim()
|
||||
: "18990991234");
|
||||
var appIds = configured.AppIds != null && configured.AppIds.Count > 0
|
||||
? configured.AppIds
|
||||
: new List<string>
|
||||
{
|
||||
"wx316b1291351558aa",
|
||||
"wx7999743c3d64c05c"
|
||||
};
|
||||
|
||||
return new TicketClientOptions
|
||||
{
|
||||
UserName = userName,
|
||||
AppIds = appIds,
|
||||
Orders =
|
||||
[
|
||||
new TicketOrderOption
|
||||
{
|
||||
Amount = 109m,
|
||||
AppId = "wx316b1291351558aa",
|
||||
GoodsName = "梵客隆收腹内裤女新款高腰无痕磨毛暖融收小肚子提臀塑身平角裤",
|
||||
OrderId = "9000000000000000001",
|
||||
OrderedAt = new DateTime(2020, 1, 1),
|
||||
},
|
||||
new TicketOrderOption
|
||||
{
|
||||
Amount = 109m,
|
||||
AppId = "wx7999743c3d64c05c",
|
||||
GoodsName = "洁柔抽纸粉Face家用实惠装批发纸巾大包面纸餐巾纸抽整箱可湿水纸",
|
||||
OrderId = "9000000000000000002",
|
||||
OrderedAt = new DateTime(2020, 1, 1),
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当前页面对应的工单 ViewModel。
|
||||
/// </summary>
|
||||
public OrderSupportTicketViewModel ViewModel { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 宿主可在页面加载前注入账号、APPID 与本地订单数据。
|
||||
/// </summary>
|
||||
public void Configure(TicketClientOptions options)
|
||||
{
|
||||
ViewModel.Configure(options);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从订单页直接打开新工单草稿。
|
||||
/// </summary>
|
||||
public void OpenNewTicket(TicketOrderOption order)
|
||||
{
|
||||
ViewModel.OpenNewTicket(order);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 打开并定位到指定工单。
|
||||
/// </summary>
|
||||
public void OpenTicket(string appId, string wechatOrderId)
|
||||
{
|
||||
ViewModel.OpenTicket(appId, wechatOrderId);
|
||||
}
|
||||
|
||||
private void TicketSearchBox_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel.CancelNewTicketDraft();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 点击订单号复制到剪贴板,并使用宿主窗口的 Toast 提示结果。
|
||||
/// </summary>
|
||||
private void CopyOrderId_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (sender is not FrameworkElement element)
|
||||
return;
|
||||
|
||||
var orderId = element.Tag as string;
|
||||
if (string.IsNullOrWhiteSpace(orderId)
|
||||
&& element.DataContext is WorkOrderSummaryViewModel ticket)
|
||||
{
|
||||
orderId = ticket.WechatOrderId;
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(orderId))
|
||||
return;
|
||||
|
||||
var window = Window.GetWindow(this) ?? _hostWindow;
|
||||
if (window == null)
|
||||
return;
|
||||
|
||||
if (ClipboardHelper.TrySetText(orderId))
|
||||
{
|
||||
ToastHelper.Show(window, "订单号已复制");
|
||||
}
|
||||
else
|
||||
{
|
||||
ToastHelper.Show(window, "复制失败");
|
||||
}
|
||||
public OrderSupportTicketView(TicketService ticketService, TicketClientOptions options = null)
|
||||
{
|
||||
InitializeComponent();
|
||||
ViewModel = new OrderSupportTicketViewModel(ticketService, options ?? CreateDefaultOptions());
|
||||
DataContext = ViewModel;
|
||||
Loaded += OnLoaded;
|
||||
Unloaded += OnUnloaded;
|
||||
}
|
||||
|
||||
private async void OnLoaded(object sender, System.Windows.RoutedEventArgs e)
|
||||
{
|
||||
if (_active)
|
||||
return;
|
||||
_active = true;
|
||||
AttachHostWindow(Window.GetWindow(this));
|
||||
UpdateWindowActiveState();
|
||||
await ViewModel.InitializeAsync();
|
||||
}
|
||||
public static TicketClientOptions CreateDefaultOptions(string fallbackUserName = null)
|
||||
{
|
||||
var configured = TicketClientOptions.FromApplicationSettings();
|
||||
var userName = !string.IsNullOrWhiteSpace(configured.UserName)
|
||||
? configured.UserName
|
||||
: (!string.IsNullOrWhiteSpace(fallbackUserName) ? fallbackUserName.Trim() : "18990991234");
|
||||
var appIds = configured.AppIds != null && configured.AppIds.Count > 0
|
||||
? configured.AppIds
|
||||
: new List<string> { "wx316b1291351558aa", "wx7999743c3d64c05c" };
|
||||
|
||||
private async void OnUnloaded(object sender, System.Windows.RoutedEventArgs e)
|
||||
{
|
||||
if (!_active)
|
||||
return;
|
||||
_active = false;
|
||||
ViewModel.IsWindowActive = false;
|
||||
DetachHostWindow();
|
||||
await ViewModel.DeactivateAsync();
|
||||
}
|
||||
return new TicketClientOptions
|
||||
{
|
||||
UserName = userName,
|
||||
AppIds = appIds,
|
||||
Orders =
|
||||
[
|
||||
new TicketOrderOption { Amount = 109m, AppId = "wx316b1291351558aa", GoodsName = "梵客隆收腹内裤女新款高腰无痕磨毛暖融收小肚子提臀塑身平角裤", OrderId = "9000000000000000001", OrderedAt = new DateTime(2020, 1, 1) },
|
||||
new TicketOrderOption { Amount = 109m, AppId = "wx7999743c3d64c05c", GoodsName = "洁柔抽纸粉Face家用实惠装批发纸巾大包面纸餐巾纸抽整箱可湿水纸", OrderId = "9000000000000000002", OrderedAt = new DateTime(2020, 1, 1) }
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
private void AttachHostWindow(Window window)
|
||||
{
|
||||
DetachHostWindow();
|
||||
_hostWindow = window;
|
||||
if (_hostWindow == null)
|
||||
return;
|
||||
public OrderSupportTicketViewModel ViewModel { get; }
|
||||
public void Configure(TicketClientOptions options) => ViewModel.Configure(options);
|
||||
public void OpenNewTicket(TicketOrderOption order) => ViewModel.OpenNewTicket(order);
|
||||
public void OpenTicket(string appId, string wechatOrderId) => ViewModel.OpenTicket(appId, wechatOrderId);
|
||||
|
||||
_hostWindow.Activated += OnHostWindowActivated;
|
||||
_hostWindow.Deactivated += OnHostWindowDeactivated;
|
||||
_hostWindow.IsVisibleChanged += OnHostWindowIsVisibleChanged;
|
||||
_hostWindow.StateChanged += OnHostWindowStateChanged;
|
||||
_hostWindow.Closed += OnHostWindowClosed;
|
||||
}
|
||||
private async void OnLoaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (_active) return;
|
||||
_active = true;
|
||||
AttachHostWindow(Window.GetWindow(this));
|
||||
UpdateWindowActiveState();
|
||||
await ViewModel.InitializeAsync();
|
||||
}
|
||||
|
||||
private void DetachHostWindow()
|
||||
{
|
||||
if (_hostWindow == null)
|
||||
return;
|
||||
private async void OnUnloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (!_active) return;
|
||||
_active = false;
|
||||
ViewModel.IsWindowActive = false;
|
||||
DetachHostWindow();
|
||||
await ViewModel.DeactivateAsync();
|
||||
}
|
||||
|
||||
_hostWindow.Activated -= OnHostWindowActivated;
|
||||
_hostWindow.Deactivated -= OnHostWindowDeactivated;
|
||||
_hostWindow.IsVisibleChanged -= OnHostWindowIsVisibleChanged;
|
||||
_hostWindow.StateChanged -= OnHostWindowStateChanged;
|
||||
_hostWindow.Closed -= OnHostWindowClosed;
|
||||
_hostWindow = null;
|
||||
}
|
||||
private void AttachHostWindow(Window window)
|
||||
{
|
||||
DetachHostWindow();
|
||||
_hostWindow = window;
|
||||
if (_hostWindow == null) return;
|
||||
_hostWindow.Activated += OnHostWindowStateChanged;
|
||||
_hostWindow.Deactivated += OnHostWindowStateChanged;
|
||||
_hostWindow.IsVisibleChanged += OnHostWindowIsVisibleChanged;
|
||||
_hostWindow.StateChanged += OnHostWindowStateChanged;
|
||||
_hostWindow.Closed += OnHostWindowClosed;
|
||||
}
|
||||
|
||||
private void UpdateWindowActiveState()
|
||||
{
|
||||
var window = _hostWindow;
|
||||
ViewModel.IsWindowActive = window != null
|
||||
&& window.IsVisible
|
||||
&& window.IsActive
|
||||
&& window.WindowState != WindowState.Minimized;
|
||||
}
|
||||
private void DetachHostWindow()
|
||||
{
|
||||
if (_hostWindow == null) return;
|
||||
_hostWindow.Activated -= OnHostWindowStateChanged;
|
||||
_hostWindow.Deactivated -= OnHostWindowStateChanged;
|
||||
_hostWindow.IsVisibleChanged -= OnHostWindowIsVisibleChanged;
|
||||
_hostWindow.StateChanged -= OnHostWindowStateChanged;
|
||||
_hostWindow.Closed -= OnHostWindowClosed;
|
||||
_hostWindow = null;
|
||||
}
|
||||
|
||||
private void OnHostWindowActivated(object sender, EventArgs e)
|
||||
{
|
||||
UpdateWindowActiveState();
|
||||
}
|
||||
private void UpdateWindowActiveState()
|
||||
{
|
||||
ViewModel.IsWindowActive = _hostWindow != null && _hostWindow.IsVisible && _hostWindow.IsActive && _hostWindow.WindowState != WindowState.Minimized;
|
||||
}
|
||||
|
||||
private void OnHostWindowDeactivated(object sender, EventArgs e)
|
||||
{
|
||||
UpdateWindowActiveState();
|
||||
}
|
||||
|
||||
private void OnHostWindowIsVisibleChanged(
|
||||
object sender,
|
||||
DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
UpdateWindowActiveState();
|
||||
}
|
||||
|
||||
private void OnHostWindowStateChanged(object sender, EventArgs e)
|
||||
{
|
||||
UpdateWindowActiveState();
|
||||
}
|
||||
|
||||
private void OnHostWindowClosed(object sender, EventArgs e)
|
||||
{
|
||||
ViewModel.IsWindowActive = false;
|
||||
DetachHostWindow();
|
||||
}
|
||||
private void OnHostWindowStateChanged(object sender, EventArgs e) => UpdateWindowActiveState();
|
||||
private void OnHostWindowIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) => UpdateWindowActiveState();
|
||||
private void OnHostWindowClosed(object sender, EventArgs e) { ViewModel.IsWindowActive = false; DetachHostWindow(); }
|
||||
}
|
||||
Reference in new issue
Block a user