using BBWY.Client.APIServices; using BBWY.Client.Helpers; using BBWY.Client.Models; using BBWY.Client.Views; using BBWY.Common.Extensions; using BBWY.Common.Http; using BBWY.Common.Models; using GalaSoft.MvvmLight.Command; using Microsoft.Web.WebView2.Core; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace BBWY.Client.ViewModels { public class MainViewModel : BaseVM, IDenpendency { #region Properties private IHttpClientFactory httpClientFactory; private MdsApiService mdsApiService; private LogisticsService logisticsService; private ShopService shopService; private MenuModel selectedMenuModel; private bool showShopChoosePanel; private bool showWB2RuntimeDownloadPanel; private double wb2DownloadProgress; private IList managerDepartment; private WebView2Manager w2m; public GlobalContext GlobalContext { get; set; } public IList MenuList { get; set; } public IList ShopList { get; set; } public MenuModel SelectedMenuModel { get => selectedMenuModel; set { if (value == null) return; Set(ref selectedMenuModel, value); foreach (var menu in MenuList) { foreach (var cmenu in menu.ChildList) { if (!ReferenceEquals(value, cmenu)) cmenu.IsSelected = false; } } } } /// /// 是否显示店铺选择列表 /// public bool ShowShopChoosePanel { get => showShopChoosePanel; set { Set(ref showShopChoosePanel, value); } } /// /// 是否显示webview2 runtime下载面板 /// public bool ShowWB2RuntimeDownloadPanel { get => showWB2RuntimeDownloadPanel; set { Set(ref showWB2RuntimeDownloadPanel, value); } } /// /// webview2 runtime下载进度 /// public double Wb2DownloadProgress { get => wb2DownloadProgress; set { Set(ref wb2DownloadProgress, value); } } #endregion #region Commands public ICommand ClosingCommand { get; set; } //public ICommand ChooseShopCommand { get; set; } public ICommand OpenSelectShopCommand { get; set; } #endregion #region Methods public MainViewModel(GlobalContext globalContext, MdsApiService mdsApiService, LogisticsService logisticsService, ShopService shopService, IHttpClientFactory httpClientFactory, WebView2Manager w2m, DongDongHelper dongdongHelper) { this.w2m = w2m; this.managerDepartment = new List() { "董事办", "财务部", "技术部", "总经办" }; this.httpClientFactory = httpClientFactory; this.mdsApiService = mdsApiService; this.logisticsService = logisticsService; this.shopService = shopService; ClosingCommand = new RelayCommand(Exit); //ChooseShopCommand = new RelayCommand((s) => ChooseShop(s)); OpenSelectShopCommand = new RelayCommand(OpenSelectShop); this.GlobalContext = globalContext; ShopList = new ObservableCollection(); MenuList = new ObservableCollection() { }; Task.Factory.StartNew(Login); if (!CheckWebview2Runtime()) { //下载webview2 runtime Task.Factory.StartNew(DownloadWebview2Runtime); } dongdongHelper.StartInJection(); } private void CreateMenu() { if (GlobalContext.User.TeamName == "刷单组") { App.Current.Dispatcher.Invoke(() => MenuList.Add(new MenuModel() { Name = "订单管理", ChildList = new List() { new MenuModel(){ Name="刷单组",Url="/Views/Order/SDGroup.xaml" } } })); return; } App.Current.Dispatcher.Invoke(() => { MenuList.Add(new MenuModel() { Name = "订单管理", ChildList = new List() { new MenuModel(){ Name="最近订单",Url="/Views/Order/OrderList.xaml" } } }); MenuList.Add(new MenuModel() { Name = "商品管理", ChildList = new List() { new MenuModel(){ Name="货源管理",Url="/Views/Ware/WareManager.xaml" }, new MenuModel(){ Name="产品库存",Url="/Views/Ware/WareStock.xaml" } } }); MenuList.Add(new MenuModel() { Name = "设置", ChildList = new List() { new MenuModel(){ Name="店铺设置",Url="/Views/Setting/ShopSetting.xaml" }, new MenuModel(){ Name="团队配置",Url="/Views/Setting/TeamSetting.xaml" } } }); }); if (managerDepartment.Contains(GlobalContext.User.TeamName) || managerDepartment.Any(m => GlobalContext.User.SonDepartmentNames.Contains(m))) { App.Current.Dispatcher.Invoke(() => MenuList.Add(new MenuModel() { Name = "财务端", ChildList = new List() { new MenuModel(){ Name="采购审计",Url="/Views/FinancialTerminal/ProcurementAudit.xaml" }, new MenuModel(){ Name="费用矫正",Url="/Views/BillCorrection/BillCorrectionView.xaml" } } })); } } private void Exit(System.ComponentModel.CancelEventArgs e) { App.Current.Shutdown(); //Environment.Exit(Environment.ExitCode); } private void Login() { try { Thread.Sleep(1000); var mdsUserResponse = mdsApiService.GetUserInfo(GlobalContext.UserToken); if (!mdsUserResponse.Success) throw new Exception($"获取磨刀石用户信息失败 {mdsUserResponse.Msg}"); GlobalContext.User = mdsUserResponse.Data.Map(); GlobalContext.User.SonDepartmentNames = string.Empty; if (mdsUserResponse.Data.SonDepartmentList != null && mdsUserResponse.Data.SonDepartmentList.Count > 0) GlobalContext.User.SonDepartmentNames = string.Join(',', mdsUserResponse.Data.SonDepartmentList.Select(sd => sd.DepartmentName)); CreateMenu(); //if (GlobalContext.User.TeamName == "刷单组") // return; IList departmentList = null; if (GlobalContext.User.TeamName == "刷单组" || managerDepartment.Contains(GlobalContext.User.TeamName) || managerDepartment.Any(m => GlobalContext.User.SonDepartmentNames.Contains(m))) { ShowShopChoosePanel = true; var response = shopService.GetDepartmentList(); if (!response.Success) throw new Exception(response.Msg); departmentList = response.Data.Map>(); //if (GlobalContext.User.TeamName == "刷单组") //{ var shopList = new List(); foreach (var d in departmentList) shopList.AddRange(d.ShopList); GlobalContext.User.ShopList = shopList; //} } else { var response = mdsApiService.GetShopDetailList(); if (!response.Success) throw new Exception(response.Msg); departmentList = response.Data; if (departmentList.Count == 0) throw new Exception("缺少有效的部门数据"); var shopIds = new List(); foreach (var d in departmentList) { if (d.ShopList != null && d.ShopList.Count > 0) { foreach (var s in d.ShopList) shopIds.Add(s.ShopId.ToString()); } } var shopList2Res = shopService.GetShopListByIds(shopIds); if (shopList2Res.Success && shopList2Res.Data != null && shopList2Res.Data.Count() > 0) { foreach (var d in departmentList) { foreach (var shop in d.ShopList) { var s2 = shopList2Res.Data.FirstOrDefault(s => s.ShopId == shop.ShopId); if (s2 != null) { shop.DingDingKey = s2.DingDingKey; shop.DingDingWebHook = s2.DingDingWebHook; shop.SkuSafeTurnoverDays = s2.SkuSafeTurnoverDays; shop.SiNanPolicyLevel = s2.SiNanPolicyLevel; shop.SiNanDingDingKey = s2.SiNanDingDingKey; shop.SiNanDingDingWebHook = s2.SiNanDingDingWebHook; shop.AppKey2 = s2.AppKey2; shop.AppSecret2 = s2.AppSecret2; shop.AppToken2 = s2.AppToken2; } } } } if (departmentList.Count == 1 && departmentList[0].ShopList.Count == 1) { ShowShopChoosePanel = false; ChooseShop(departmentList[0].ShopList[0], true); return; } else ShowShopChoosePanel = true; } GlobalContext.User.DepartmentList = departmentList; if (GlobalContext.User.TeamName == "刷单组") return; App.Current.Dispatcher.Invoke(() => { var selectShop = new SelectShopW(departmentList); if (selectShop.ShowDialog() == true) { ChooseShop(selectShop.Shop, true); } else { Environment.Exit(Environment.ExitCode); } }); } catch (Exception ex) { App.Current.Dispatcher.Invoke(() => { MessageBox.Show(ex.Message, "登录失败"); }); Environment.Exit(Environment.ExitCode); } } private void OpenSelectShop() { try { var selectShop = new SelectShopW(GlobalContext.User.DepartmentList); if (selectShop.ShowDialog() == true) { ChooseShop(selectShop.Shop, true); var vm = App.Current.Resources["Locator"] as ViewModelLocator; if (vm.IsCreateOrderList) vm.OrderList.Refresh(); if (vm.IsCreateWareManager) vm.WareManager.Refresh(); if (vm.IsCreateWareStock) vm.WareStock.Refresh(); try { w2m.Close(); } catch { } } } catch (Exception ex) { MessageBox.Show(ex.Message, "切换失败"); } } private void ChooseShop(Shop shop, bool _throw = false) { if (shop.ShopId == 0 || string.IsNullOrEmpty(shop.AppKey) || string.IsNullOrEmpty(shop.AppSecret) || string.IsNullOrEmpty(shop.AppToken) || (shop.Platform == Platform.京东 && string.IsNullOrEmpty(shop.VenderType))) { var error = $"{shop.ShopName} 店铺数据不完整"; if (_throw) throw new Exception(error); else { MessageBox.Show(error, "选择店铺"); return; } } GlobalContext.User.Shop = shop; //ShowShopChoosePanel = false; Task.Factory.StartNew(GetLogisticsList); if (shop.Platform == Platform.京东) Task.Factory.StartNew(GetJDServiceGroup); } private void GetLogisticsList() { var response = logisticsService.GetLogisticsList(); if (!response.Success) { App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "获取物流公司")); return; } GlobalContext.LogisticsResponseList = response.Data; } private bool CheckWebview2Runtime() { bool isInstall = false; try { isInstall = !string.IsNullOrEmpty(CoreWebView2Environment.GetAvailableBrowserVersionString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } return isInstall; } private void DownloadWebview2Runtime() { ShowWB2RuntimeDownloadPanel = true; var dw = new HttpDownloader(httpClientFactory, null); dw.OnDownloadProgressChanged += Dw_OnDownloadProgressChanged; dw.OnDownloadComplated += Dw_OnDownloadComplated; var url = "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/238fc310-c6c1-4a3e-a806-4a7c3c17b377/MicrosoftEdgeWebView2RuntimeInstallerX64.exe"; dw.DownloadFile(url, System.IO.Path.GetTempPath(), "MicrosoftEdgeWebView2RuntimeInstallerX64.exe", null); dw.OnDownloadProgressChanged -= Dw_OnDownloadProgressChanged; dw.OnDownloadComplated -= Dw_OnDownloadComplated; } private void Dw_OnDownloadComplated(object sender, DownloadCompletedEventArgs e) { try { if (e.Error == null) { System.Diagnostics.Process.Start(System.IO.Path.Combine(System.IO.Path.GetTempPath(), "MicrosoftEdgeWebView2RuntimeInstallerX64.exe")); ShowWB2RuntimeDownloadPanel = false; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Dw_OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { Wb2DownloadProgress = e.ProgressPercentage; } private void GetJDServiceGroup() { var apiResponse = shopService.GetServiceGroupList(); if (!apiResponse.Success) { MessageBox.Show(apiResponse.Msg, "获取客服组"); Environment.Exit(Environment.ExitCode); } GlobalContext.ShopServiceGroupList.Clear(); GlobalContext.ShopServiceGroupLowerList.Clear(); if (apiResponse.Data != null && apiResponse.Data.Count() > 0) { foreach (var waiter in apiResponse.Data) { GlobalContext.ShopServiceGroupList.Add(waiter.Name); GlobalContext.ShopServiceGroupLowerList.Add(waiter.Name.ToLower()); } } } #endregion } }