Browse Source

U

updatebug
shanji 2 years ago
parent
commit
e675033ab6
  1. 74
      BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  2. 8
      BBWYB.Server.Business/Sync/OrderSyncBusiness.cs
  3. 58
      U/APIServices/BaseApiService.cs
  4. 108
      U/APIServices/MdsApiService.cs
  5. 39
      U/APIServices/ShopService.cs
  6. 9
      U/App.xaml
  7. 87
      U/App.xaml.cs
  8. 10
      U/AssemblyInfo.cs
  9. 26
      U/GlobalContext.cs
  10. 26
      U/MainWindow.xaml
  11. 216
      U/MainWindow.xaml.cs
  12. 49
      U/MemoryHelper.cs
  13. 19
      U/Models/APIModel/Shop/PurchaseAccountResponse.cs
  14. 86
      U/Models/APIModel/Shop/ShopResponse.cs
  15. 17
      U/Models/APIModel/User/MDSUserResponse.cs
  16. 18
      U/Models/Enums.cs
  17. 21
      U/Models/MappingProfile.cs
  18. 23
      U/Models/NotifyObject.cs
  19. 37
      U/Models/Shop/Department.cs
  20. 28
      U/Models/Shop/PurchaseAccount.cs
  21. 89
      U/Models/Shop/Shop.cs
  22. 33
      U/Models/User/User.cs
  23. 22
      U/U.csproj
  24. 69
      U/WebView2Manager.cs
  25. 12
      bbwyb.sln

74
BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs

@ -25,6 +25,7 @@ namespace BBWYB.Server.Business
private FreeSqlMultiDBManager fsqlManager;
private OrderBusiness orderBusiness;
private VenderBusiness venderBusiness;
private PurchaseSchemeBusiness purchaseSchemeBusiness;
private ExpressCompanyNameConverter expressCompanyNameConverter;
private RestApiService restApiService;
@ -36,6 +37,7 @@ namespace BBWYB.Server.Business
FreeSqlMultiDBManager fsqlManager,
OrderBusiness orderBusiness,
VenderBusiness venderBusiness,
PurchaseSchemeBusiness purchaseSchemeBusiness,
ExpressCompanyNameConverter expressCompanyNameConverter,
RestApiService restApiService) : base(fsql, nLogManager, idGenerator)
{
@ -46,6 +48,7 @@ namespace BBWYB.Server.Business
this.venderBusiness = venderBusiness;
this.expressCompanyNameConverter = expressCompanyNameConverter;
this.restApiService = restApiService;
this.purchaseSchemeBusiness = purchaseSchemeBusiness;
}
/// <summary>
@ -410,7 +413,7 @@ namespace BBWYB.Server.Business
insertOrderCost?.ExecuteAffrows();
if (updatePurchaseTimeSchemeIdList.Count() > 0)
fsql.Update<PurchaseScheme>(updatePurchaseTimeSchemeIdList).Set(p => p.LastPurchaseTime, DateTime.Now).ExecuteAffrows();
fsql.Update<Order>(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState. ||
fsql.Update<Order>(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState. ||
dbOrder.OrderState == Enums.OrderState., o => o.OrderState, Model.Enums.OrderState.)
.SetIf(!string.IsNullOrEmpty(request.Remark), o => o.PurchaseRemark, request.Remark)
.Set(o => o.IsPurchased, true)
@ -488,12 +491,46 @@ namespace BBWYB.Server.Business
if (request.AssociationPurchaseOrderList.Any(x => dbInvalidPurchaseOrderIdList.Contains(x.PurchaseOrderId)))
throw new BusinessException("关联采购单时不能包含历史采购单");
#region 读取采购单中的采购账号/采购方案
IList<long> schemeIdList = new List<long>();
IList<string> purchaseAccountIdList = request.AssociationPurchaseOrderList.Select(x => string.IsNullOrEmpty(x.PurchaseAccountId) ?
x.PurchaseAccountName :
x.PurchaseAccountId).Distinct().ToList();
IList<PurchaseSchemeResponse> purchaseSchemeList = null;
IList<Purchaseaccount> dbPurchaseAccountList = null;
foreach (var purchaseOrder in request.AssociationPurchaseOrderList)
{
foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList)
{
if (assOrderCostDetail.PurchaseSchemeId != null)
schemeIdList.Add(assOrderCostDetail.PurchaseSchemeId.Value);
}
}
if (schemeIdList.Count() > 0)
{
purchaseSchemeList = purchaseSchemeBusiness.GetPurchaseSchemeList(new QuerySchemeRequest()
{
ShopId = request.ShopId,
SchemeIdList = schemeIdList
});
}
if (purchaseAccountIdList.Count() > 0)
{
dbPurchaseAccountList = fsqlManager.MDSfsql.Select<Purchaseaccount>().Where(pa => purchaseAccountIdList.Contains(pa.Id) ||
purchaseAccountIdList.Contains(pa.AccountName)).ToList();
}
#endregion
var dbOrderSkuList = fsql.Select<OrderSku>().Where(osku => osku.OrderId == request.OrderId).ToList();
var dbOrderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => ocd.OrderId == request.OrderId && ocd.IsEnabled == true).ToList();
var dbOrderCost = fsql.Select<OrderCost>(request.OrderId).ToOne();
var dbOrder = fsql.Select<Order>(request.OrderId).ToOne();
List<OrderPurchaseInfo> insertOrderPurchaseInfoList = new List<OrderPurchaseInfo>();
List<OrderPurchaseSkuInfo> insertOrderPurchaseSkuInfoList = new List<OrderPurchaseSkuInfo>();
List<OrderPurchaseRelationInfo> insertOrderPurchaseRelationInfoList = new List<OrderPurchaseRelationInfo>();
IList<IUpdate<OrderPurchaseInfo>> updateOrderPurchaseInfoList = new List<IUpdate<OrderPurchaseInfo>>();
List<OrderCostDetail> insertOrderCostDetailList = new List<OrderCostDetail>();
IList<IUpdate<OrderCostDetail>> updateOrderCostDetailList = new List<IUpdate<OrderCostDetail>>();
@ -510,6 +547,32 @@ namespace BBWYB.Server.Business
var dbPurchaserOrder = dbPurchaseOrderList.FirstOrDefault(x => x.PurchaseOrderId == purchaseOrder.PurchaseOrderId);
if (dbPurchaserOrder == null)
{
if (dbPurchaserOrder.PurchasePlatform == Enums.Platform.)
{
#region 验证新采购单是否具备完整的采购方案
if (purchaseOrder.AssocationOrderCostDetailList.Any(x => x.PurchaseSchemeId == null))
throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}缺少采购方案");
#endregion
#region 验证采购方案和订单详情是否完整
var purchaseAccount = dbPurchaseAccountList.FirstOrDefault(pa => pa.Id == purchaseOrder.PurchaseAccountId ||
pa.AccountName == purchaseOrder.PurchaseAccountName);
if (purchaseAccount == null)
throw new BusinessException($"采购单{purchaseOrder.PurchaseOrderId}缺少有效的采购账号");
var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)purchaseOrder.PurchasePlatform);
var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest()
{
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
OrderId = purchaseOrder.PurchaseOrderId
});
#endregion
}
dbPurchaserOrder = new OrderPurchaseInfo()
{
Id = idGenerator.NewLong(),
@ -530,6 +593,7 @@ namespace BBWYB.Server.Business
foreach (var assOrderCostDetail in purchaseOrder.AssocationOrderCostDetailList)
{
#region 订单成本
var dbOrderSku = dbOrderSkuList.FirstOrDefault(osku => osku.SkuId == assOrderCostDetail.SkuId);
var purchaseFreight = purchaseOrder.PurchaseFreight * (1.0M * assOrderCostDetail.PurchaseQuantity / totalQuantity);
var orderCostDetail = new OrderCostDetail()
@ -551,6 +615,7 @@ namespace BBWYB.Server.Business
0M,
0M);
insertOrderCostDetailList.Add(orderCostDetail);
#endregion
}
}
else
@ -632,6 +697,11 @@ namespace BBWYB.Server.Business
{
if (insertOrderPurchaseInfoList.Count() > 0)
fsql.Insert(insertOrderPurchaseInfoList).ExecuteAffrows();
if (insertOrderPurchaseSkuInfoList.Count() > 0)
fsql.Insert(insertOrderPurchaseSkuInfoList).ExecuteAffrows();
if (insertOrderPurchaseRelationInfoList.Count() > 0)
fsql.Insert(insertOrderPurchaseRelationInfoList).ExecuteAffrows();
if (updateOrderPurchaseInfoList.Count() > 0)
{
foreach (var update in updateOrderPurchaseInfoList)
@ -647,7 +717,7 @@ namespace BBWYB.Server.Business
insertOrderCost?.ExecuteAffrows();
updateOrderCost?.ExecuteAffrows();
fsql.Update<Order>(dbOrder.Id).SetIf(dbOrder.OrderState == Enums.OrderState. ||
fsql.Update<Order>(dbOrder.Id).SetIf(dbOrder.OrderState == Enums.OrderState. ||
dbOrder.OrderState == Enums.OrderState., o => o.OrderState, Enums.OrderState.)
.Set(o => o.IsPurchased, true)
.ExecuteAffrows();

8
BBWYB.Server.Business/Sync/OrderSyncBusiness.cs

@ -182,6 +182,7 @@ namespace BBWYB.Server.Business.Sync
var updateBuyerRemark = false;
var updateVenderRemark = false;
var updateBuyerAccount = false;
var updateOrderSn = false;
if (dbOrder.OrderState != orderState)
updateOrderState = true;
@ -197,8 +198,10 @@ namespace BBWYB.Server.Business.Sync
updateVenderRemark = true;
if (dbOrder.BuyerAccount != qtOrder.UserAccount)
updateBuyerAccount = true;
if (dbOrder.OrderSn != qtOrder.OrderSn)
updateOrderSn = true;
if (updateOrderState || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount)
if (updateOrderState || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount || updateOrderSn)
{
var update = fsql.Update<Model.Db.Order>(dbOrder.Id).SetIf(updateOrderState, o => o.OrderState == orderState)
//.SetIf(updateWaybillNo, o => o.WaybillNo, qtOrder.DeliveryResponse.WayBillNo)
@ -206,7 +209,8 @@ namespace BBWYB.Server.Business.Sync
.SetIf(updateModifyTime, o => o.ModifyTime, qtOrder.ModifyTime)
.SetIf(updateBuyerRemark, o => o.BuyerRemark, qtOrder.BuyerRemark)
.SetIf(updateVenderRemark, o => o.VenderRemark, qtOrder.VenderRemark)
.SetIf(updateBuyerAccount, o => o.BuyerAccount, qtOrder.UserAccount);
.SetIf(updateBuyerAccount, o => o.BuyerAccount, qtOrder.UserAccount)
.SetIf(updateOrderSn, o => o.OrderSn, qtOrder.OrderSn);
updateOrderList.Add(update);
}
}

58
U/APIServices/BaseApiService.cs

@ -0,0 +1,58 @@
using BBWYB.Common.Http;
using BBWYB.Common.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
namespace U.APIServices
{
public class BaseApiService
{
private RestApiService restApiService;
protected GlobalContext globalContext;
public BaseApiService(RestApiService restApiService, GlobalContext globalContext)
{
this.restApiService = restApiService;
this.globalContext = globalContext;
}
protected ApiResponse<T> SendRequest<T>(string apiHost,
string apiPath,
object param,
IDictionary<string, string> headers,
HttpMethod httpMethod,
string contentType = RestApiService.ContentType_Json,
ParamPosition paramPosition = ParamPosition.Body,
bool enableRandomTimeStamp = false)
{
try
{
if (headers == null)
headers = new Dictionary<string, string>();
if (!headers.ContainsKey("ClientCode"))
headers.Add("ClientCode", "U");
if (!headers.ContainsKey("ClientVersion"))
headers.Add("ClientVersion", "10000");
if (!headers.ContainsKey("Authorization") && !string.IsNullOrEmpty(globalContext.UserToken))
headers.Add("Authorization", $"Bearer {globalContext.UserToken}");
if (!headers.ContainsKey("qy"))
headers.Add("qy", "qy");
var result = restApiService.SendRequest(apiHost, apiPath, param, headers, httpMethod, contentType, paramPosition, enableRandomTimeStamp);
if (result.StatusCode != System.Net.HttpStatusCode.OK &&
result.Content.Contains("\"Success\"") &&
result.Content.Contains("\"Msg\"") &&
result.Content.Contains("\"Data\""))
throw new BusinessException($"{result.StatusCode} {result.Content}") { Code = (int)result.StatusCode };
return JsonConvert.DeserializeObject<ApiResponse<T>>(result.Content);
}
catch (Exception ex)
{
return ApiResponse<T>.Error((ex is BusinessException) ? (ex as BusinessException).Code : 0, ex.Message);
}
}
}
}

108
U/APIServices/MdsApiService.cs

@ -0,0 +1,108 @@
using BBWYB.Common.Http;
using BBWYB.Common.Models;
using Newtonsoft.Json.Linq;
using U.Models;
using System;
using System.Collections.Generic;
using System.Net.Http;
namespace U.APIServices
{
public class MdsApiService : BaseApiService, IDenpendency
{
public MdsApiService(RestApiService restApiService, GlobalContext globalContext) : base(restApiService, globalContext)
{
}
public ApiResponse<MDSUserResponse> GetUserInfo(string userToken)
{
return SendRequest<MDSUserResponse>(globalContext.MDSApiHost,
"/TaskList/User/GetUserInfo",
null,
new Dictionary<string, string>()
{
{ "Authorization", $"Bearer {userToken}" }
}, HttpMethod.Get);
}
//public ApiResponse<IList<ShopResponse>> GetShopsByUserTeam(long userId)
//{
// return SendRequest<IList<ShopResponse>>(globalContext.MDSApiHost, "TaskList/Shop/GetShopsByUserTeam", $"userId={userId}", null, System.Net.Http.HttpMethod.Get);
//}
public ApiResponse<IList<Department>> GetShopDetailList()
{
var response = new ApiResponse<IList<Department>>();
var response2 = SendRequest<JArray>(globalContext.MDSApiHost, "TaskList/UserDepartment/GetShopDetailList", null, null, HttpMethod.Get);
if (!response.Success)
{
response.Code = response2.Code;
response.Msg = response2.Msg;
return response;
}
response.Data = new List<Department>();
foreach (var jDepartment in response2.Data)
{
var jayShops = jDepartment.Value<JArray>("ShopList");
if (jayShops == null || !jayShops.HasValues)
continue; //排除空店部门
var d = new Department()
{
Id = jDepartment.Value<string>("Id"),
Name = jDepartment.Value<string>("DepartmentName")
};
response.Data.Add(d);
foreach (var jShop in jayShops)
{
if (jShop.Value<long?>("ShopId") == null || string.IsNullOrEmpty(jShop.Value<string>("AppToken")))
continue; //排除未授权
try
{
var shop = new Shop()
{
ShopId = jShop.Value<long>("ShopId"),
AppKey = jShop.Value<string>("AppKey"),
AppSecret = jShop.Value<string>("AppSecret"),
AppToken = jShop.Value<string>("AppToken"),
ManagePwd = jShop.Value<string>("ManagePwd"),
Platform = (Platform)jShop.Value<int>("PlatformId"),
PlatformCommissionRatio = jShop.Value<decimal?>("PlatformCommissionRatio") ?? 0.05M,
ShopName = jShop.Value<string>("ShopName"),
VenderType = jShop.Value<string>("ShopType"),
TeamId = jShop.Value<string>("TeamId")
};
d.ShopList.Add(shop);
//var jayAccounts = jShop.Value<JArray>("AccountList");
//if (jayAccounts == null || !jayAccounts.HasValues)
// continue;
//shop.PurchaseAccountList = new List<PurchaseAccount>();
//foreach (var jPurchaseAccount in jayAccounts)
//{
// shop.PurchaseAccountList.Add(new PurchaseAccount()
// {
// Id = jPurchaseAccount.Value<long>("Id"),
// AccountName = jPurchaseAccount.Value<string>("AccountName"),
// AppKey = jPurchaseAccount.Value<string>("AppKey"),
// AppSecret = jPurchaseAccount.Value<string>("AppSecret"),
// AppToken = jPurchaseAccount.Value<string>("AppToken"),
// ShopId = shop.ShopId
// //PurchasePlatformId = jPurchaseAccount.Value<long>()
// });
//}
}
catch (Exception ex)
{
Console.WriteLine(jShop.ToString());
throw;
}
}
}
return response;
}
}
}

39
U/APIServices/ShopService.cs

@ -0,0 +1,39 @@
using BBWYB.Common.Models;
using U.Models;
using System.Collections.Generic;
using System.Net.Http;
using BBWYB.Common.Http;
namespace U.APIServices
{
public class ShopService : BaseApiService, IDenpendency
{
public ShopService(RestApiService restApiService, GlobalContext globalContext) : base(restApiService, globalContext) { }
/// <summary>
/// 获取部门及下属店铺
/// </summary>
/// <returns></returns>
public ApiResponse<IList<DepartmentResponse>> GetDepartmentList()
{
return SendRequest<IList<DepartmentResponse>>(globalContext.BBYWApiHost, "api/vender/GetDeparmentList", null,
new Dictionary<string, string>()
{
{ "bbwyTempKey", "21jfhayu27q" }
}, HttpMethod.Get);
}
public ApiResponse<IList<ShopResponse>> GetShopListByIds(IList<string> shopIds)
{
return SendRequest<IList<ShopResponse>>(globalContext.BBYWApiHost, "api/vender/GetShopListByShopIds", new
{
shopIds
}, new Dictionary<string, string>()
{
{ "bbwyTempKey", "21jfhayu27q" }
}, HttpMethod.Post);
}
}
}

9
U/App.xaml

@ -0,0 +1,9 @@
<Application x:Class="U.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:U"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

87
U/App.xaml.cs

@ -0,0 +1,87 @@
using BBWYB.Common.Extensions;
using BBWYB.Common.Http;
using BBWYB.Common.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using U.Models;
using Utils;
namespace U
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
public IServiceProvider ServiceProvider { get; private set; }
public IConfiguration Configuration { get; private set; }
protected override void OnStartup(StartupEventArgs e)
{
var pjzsExeList = Process.GetProcessesByName("PJZS");
if (pjzsExeList != null && pjzsExeList.Count() > 1)
{
Environment.Exit(Environment.ExitCode);
}
var gl = new GlobalContext();
string userToken = string.Empty;
#if DEBUG
//齐越山鸡
userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNTM1MzMwMzI4ODkyMTQ5NzYwIiwidGVhbUlkIjoiMTUxNjk3NDI1MDU0MjUwMTg4OCIsInNvblRlYW1JZHMiOiIxNDM2Mjg4NTAwMjM1MjQzNTIwIiwiZXhwIjoxNjk0NjY5NjkxfQ.cSwro-7bGwOu92YejH9JhMenTai7Mvf99i2paQCmxIw";
#else
var tokenResult = ReadMMF();
if (tokenResult.isOk)
userToken = tokenResult.content;
else
{
MessageBox.Show($"读取内存数据失败\r\n{tokenResult.content}", "提示");
Environment.Exit(0);
}
#endif
gl.UserToken = userToken;
//var applicationPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
//var builder = new ConfigurationBuilder().SetBasePath(applicationPath).AddJsonFile("appSettings.json", false, true);
//Configuration = builder.Build();
//gl.BBYWApiHost = Configuration.GetSection("BBWYApiHost").Value;
//gl.MDSApiHost = Configuration.GetSection("MDSApiHost").Value;
//IServiceCollection serviceCollection = new ServiceCollection();
//serviceCollection.AddHttpClient();
//serviceCollection.AddSingleton<RestApiService>();
//serviceCollection.AddSingleton(gl);
//serviceCollection.BatchRegisterServices(new Assembly[] { Assembly.Load("PJZS") }, typeof(IDenpendency));
//serviceCollection.AddMapper(new MappingProfile());
//ServiceProvider = serviceCollection.BuildServiceProvider();
base.OnStartup(e);
}
public (bool isOk, string content) ReadMMF()
{
try
{
var token = MemoryHelper.GetMemoryToken();
if (string.IsNullOrEmpty(token))
return (false, "token为空");
else
return (true, token);
}
catch (Exception ex)
{
return (false, ex.Message);
}
}
}
}

10
U/AssemblyInfo.cs

@ -0,0 +1,10 @@
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

26
U/GlobalContext.cs

@ -0,0 +1,26 @@
using Newtonsoft.Json;
using System.Runtime.InteropServices;
namespace U
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class GlobalContext
{
public User User { get; set; }
public string UserToken { get; set; }
#region APIHost
public string BBYWApiHost { get; set; }
public string MDSApiHost { get; set; }
#endregion
public string GetUserString()
{
return JsonConvert.SerializeObject(User);
}
}
}

26
U/MainWindow.xaml

@ -0,0 +1,26 @@
<b:BWindow x:Class="U.MainWindow"
xmlns:b="clr-namespace:SJ.Controls;assembly=SJ.Controls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:U"
mc:Ignorable="d"
Title="U" Height="560" Width="700"
RightButtonGroupMargin="0,5,5,0">
<Grid x:Name="grid">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border BorderThickness="0,0,0,1" BorderBrush="#D7D7D7" Background="#8080FF">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0"
TextBlock.Foreground="White">
<TextBlock Text="商品条形码生成"/>
<TextBlock Text="v10000" Margin="5,0,0,0"/>
<TextBlock x:Name="txtUserName" Margin="5,0,0,0"/>
</StackPanel>
</Border>
</Grid>
</b:BWindow>

216
U/MainWindow.xaml.cs

@ -0,0 +1,216 @@
using BBWYB.Common.Extensions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Web.WebView2.Core;
using SJ.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using U.APIServices;
namespace U
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : BWindow
{
private GlobalContext globalContext;
private WebView2Manager w2m;
private bool isNavigated;
private IList<string> managerDepartment;
private MdsApiService mdsApiService;
private ShopService shopService;
public MainWindow()
{
InitializeComponent();
this.managerDepartment = new List<string>() { "董事办", "财务部", "技术部", "总经办" };
this.Loaded += MainWindow_Loaded;
this.Closed += MainWindow_Closed;
}
private void MainWindow_Closed(object sender, EventArgs e)
{
Environment.Exit(Environment.ExitCode);
}
private bool CheckWebview2Runtime()
{
bool isInstall = false;
try
{
isInstall = !string.IsNullOrEmpty(CoreWebView2Environment.GetAvailableBrowserVersionString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return isInstall;
}
private void MainWindow_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
if (!CheckWebview2Runtime())
{
MessageBox.Show("缺少webview2 runtime,请下载安装之后再运行评价助手");
//下载webview2 runtime
//Task.Factory.StartNew(DownloadWebview2Runtime);
var webview2RuntimeUrl = "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/238fc310-c6c1-4a3e-a806-4a7c3c17b377/MicrosoftEdgeWebView2RuntimeInstallerX64.exe";
try
{
System.Diagnostics.Process.Start("explorer.exe", webview2RuntimeUrl);
Thread.Sleep(1000);
}
catch (Exception ex)
{
Clipboard.SetText(webview2RuntimeUrl);
MessageBox.Show($"{ex.Message}\r\n调用浏览器失败,网页链接已复制到剪切板,请手动打开浏览器访问", "提示");
}
finally
{
Environment.Exit(Environment.ExitCode);
}
}
//var sp = (App.Current as App).ServiceProvider;
//using (var s = sp.CreateScope())
//{
// w2m = s.ServiceProvider.GetRequiredService<WebView2Manager>();
// //globalContext = s.ServiceProvider.GetRequiredService<GlobalContext>();
// //mdsApiService = s.ServiceProvider.GetRequiredService<MdsApiService>();
// //shopService = s.ServiceProvider.GetRequiredService<ShopService>();
//}
w2m = new WebView2Manager();
//Login();
//txtUserName.Text = globalContext.User.Name;
var url = "http://upc.qiyue666.com/barcode/";
w2m.CoreWebView2InitializationCompleted = (e) =>
{
//w2m.wb2.CoreWebView2.AddHostObjectToScript("uContext", this.globalContext);
isNavigated = true;
w2m.wb2.CoreWebView2.Navigate(url);
};
w2m.Init();
w2m.wb2.SetValue(Grid.RowProperty, 1);
w2m.wb2.Margin = new Thickness(1, 0, 1, 0);
grid.Children.Add(w2m.wb2);
if (w2m.IsInitializationCompleted && !isNavigated)
{
w2m.wb2.CoreWebView2.Navigate(url);
//w2m.wb2.CoreWebView2.NavigateToString(content);
isNavigated = true;
}
}
private void Login()
{
try
{
var mdsUserResponse = mdsApiService.GetUserInfo(globalContext.UserToken);
if (!mdsUserResponse.Success)
throw new Exception($"获取磨刀石用户信息失败 {mdsUserResponse.Msg}");
globalContext.User = mdsUserResponse.Data.Map<User>();
globalContext.User.Token = globalContext.UserToken;
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));
IList<Department> departmentList = null;
if (globalContext.User.TeamName == "刷单组" ||
managerDepartment.Contains(globalContext.User.TeamName) ||
managerDepartment.Any(m => globalContext.User.SonDepartmentNames.Contains(m)))
{
var response = shopService.GetDepartmentList();
if (!response.Success)
throw new Exception(response.Msg);
departmentList = response.Data.Map<List<Department>>();
}
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<string>();
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;
}
}
}
}
}
for (var i = 0; i < departmentList.Count(); i++)
{
var d = departmentList[i];
for (var j = 0; j < d.ShopList.Count(); j++)
{
var shop = d.ShopList[j];
if (string.IsNullOrEmpty(shop.AppToken2))
{
d.ShopList.RemoveAt(j);
j--;
}
}
if (d.ShopList == null || d.ShopList.Count() == 0)
{
departmentList.RemoveAt(i);
i--;
}
}
globalContext.User.DepartmentList = departmentList;
}
catch (Exception ex)
{
App.Current.Dispatcher.Invoke(() =>
{
MessageBox.Show(ex.Message, "登录失败");
});
Environment.Exit(Environment.ExitCode);
}
}
}
}

49
U/MemoryHelper.cs

@ -0,0 +1,49 @@
using System;
using System.IO;
using System.IO.Pipes;
namespace Utils
{
public class MemoryHelper
{
/// <summary>
/// 获取token
/// </summary>
/// <returns></returns>
public static string GetMemoryToken()
{
try
{
string pipeId = Environment.GetCommandLineArgs()[1];
//创建输入类型匿名管道
using (PipeStream pipeClient = new AnonymousPipeClientStream(PipeDirection.In, pipeId))
{
using (StreamReader sr = new StreamReader(pipeClient))
{
string temp;
do
{
temp = sr.ReadLine();
}
while (!temp.StartsWith("SYNC"));
while ((temp = sr.ReadLine()) != null)
{
return temp;
}
}
}
return string.Empty;
}
catch (Exception ex)
{
return string.Empty;
}
}
}
}

19
U/Models/APIModel/Shop/PurchaseAccountResponse.cs

@ -0,0 +1,19 @@
namespace U.Models
{
public class PurchaseAccountResponse
{
public long Id { get; set; }
public string AccountName { get; set; }
public long ShopId { get; set; }
public Platform PurchasePlatformId { get; set; }
public string AppKey { get; set; }
public string AppSecret { get; set; }
public string AppToken { get; set; }
}
}

86
U/Models/APIModel/Shop/ShopResponse.cs

@ -0,0 +1,86 @@
using System.Collections.Generic;
namespace U.Models
{
public class ShopResponse
{
public string Id { get; set; }
public Platform PlatformId { get; set; }
public long? ShopId { get; set; }
public string ShopName { get; set; }
public string ShopType { get; set; }
public string AppKey { get; set; }
public string AppSecret { get; set; }
public string AppToken { get; set; }
public string AppKey2 { get; set; }
public string AppSecret2 { get; set; }
public string AppToken2 { get; set; }
//public IList<PurchaseAccountResponse> PurchaseList { get; set; }
public string ManagePwd { get; set; }
public decimal? PlatformCommissionRatio { get; set; }
public string TeamId { get; set; }
public string TeamName { get; set; }
public string DingDingWebHook { get; set; }
public string DingDingKey { get; set; }
public int SkuSafeTurnoverDays { get; set; }
/// <summary>
/// 司南策略等级
/// </summary>
public int SiNanPolicyLevel { get; set; }
/// <summary>
/// 司南钉钉WebHook地址
/// </summary>
public string SiNanDingDingWebHook { get; set; }
/// <summary>
/// 司南钉钉密钥
/// </summary>
public string SiNanDingDingKey { get; set; }
/// <summary>
/// U钉钉WebHook地址
/// </summary>
public string UDingDingWebHook { get; set; }
/// <summary>
/// U钉钉密钥
/// </summary>
public string UDingDingKey { get; set; }
}
public class DepartmentResponse
{
public string Id { get; set; }
public string Name { get; set; }
public IList<ShopResponse> ShopList { get; set; }
}
public class DepartmentResponse2
{
public string DepartmentId { get; set; }
public string DepartmentName { get; set; }
}
}

17
U/Models/APIModel/User/MDSUserResponse.cs

@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace U.Models
{
public class MDSUserResponse
{
public long Id { get; set; }
public string DepartmentName { get; set; }
public string DepartmentId { get; set; }
public string UserName { get; set; }
public string UserNick { get; set; }
public IList<DepartmentResponse2> SonDepartmentList { get; set; }
}
}

18
U/Models/Enums.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace U.Models
{
/// <summary>
/// 电商平台
/// </summary>
public enum Platform
{
= 0,
= 1,
= 2,
= 3,
= 4
}
}

21
U/Models/MappingProfile.cs

@ -0,0 +1,21 @@
using AutoMapper;
namespace U.Models
{
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<MDSUserResponse, User>().ForMember(t => t.TeamId, opt => opt.MapFrom(f => f.DepartmentId))
.ForMember(t => t.TeamName, opt => opt.MapFrom(f => f.DepartmentName))
.ForMember(t => t.Name, opt => opt.MapFrom(f => f.UserName));
CreateMap<ShopResponse, Shop>().ForMember(t => t.VenderType, opt => opt.MapFrom(f => f.ShopType))
.ForMember(t => t.Platform, opt => opt.MapFrom(f => f.PlatformId));
//.ForMember(t => t.PurchaseAccountList, opt => opt.MapFrom(f => f.PurchaseList));
CreateMap<PurchaseAccountResponse, PurchaseAccount>();
CreateMap<DepartmentResponse, Department>();
}
}
}

23
U/Models/NotifyObject.cs

@ -0,0 +1,23 @@
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace U
{
public class NotifyObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool Set<T>(ref T oldValue, T newValue, [CallerMemberName]string propertyName = "")
{
if (Equals(oldValue, newValue))
return false;
oldValue = newValue;
OnPropertyChanged(propertyName);
return true;
}
}
}

37
U/Models/Shop/Department.cs

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
namespace U
{
public class Department : NotifyObject
{
private bool isSelected;
public string Id { get; set; }
public string Name { get; set; }
public IList<Shop> ShopList { get; set; }
public bool IsSelected
{
get => isSelected;
set
{
if (Set(ref isSelected, value))
OnIsSelectedChanged?.Invoke();
}
}
public Department()
{
ShopList = new List<Shop>();
}
public Action OnIsSelectedChanged { get; set; }
public override string ToString()
{
return this.Name;
}
}
}

28
U/Models/Shop/PurchaseAccount.cs

@ -0,0 +1,28 @@
using U.Models;
using System;
namespace U
{
public class PurchaseAccount : NotifyObject,ICloneable
{
private string accountName;
private Platform purchasePlatformId;
private string appKey;
private string appSecret;
private string appToken;
public long Id { get; set; }
public long ShopId { get; set; }
public string AccountName { get => accountName; set { Set(ref accountName, value); } }
public Platform PurchasePlatformId { get => purchasePlatformId; set { Set(ref purchasePlatformId, value); } }
public string AppKey { get => appKey; set { Set(ref appKey, value); } }
public string AppSecret { get => appSecret; set { Set(ref appSecret, value); } }
public string AppToken { get => appToken; set { Set(ref appToken, value); } }
public object Clone()
{
return this.MemberwiseClone();
}
}
}

89
U/Models/Shop/Shop.cs

@ -0,0 +1,89 @@
using U.Models;
using System.Collections.Generic;
namespace U
{
public class Shop : NotifyObject
{
private bool isSelected;
private string shopName;
public bool IsSelected { get => isSelected; set { Set(ref isSelected, value); } }
/// <summary>
/// 店铺Id
/// </summary>
public long ShopId { get; set; }
/// <summary>
/// 商家类型
/// </summary>
public string VenderType { get; set; }
/// <summary>
/// 店铺平台
/// </summary>
public Platform Platform { get; set; }
public string AppKey { get; set; }
public string AppSecret { get; set; }
public string AppToken { get; set; }
public string AppKey2 { get; set; }
public string AppSecret2 { get; set; }
public string AppToken2 { get; set; }
public string ShopName { get => shopName; set { Set(ref shopName, value); } }
//public IList<PurchaseAccount> PurchaseAccountList { get; set; }
public string ManagePwd { get; set; }
/// <summary>
/// 店铺扣点
/// </summary>
public decimal? PlatformCommissionRatio { get; set; }
public string TeamId { get; set; }
public string TeamName { get; set; }
public string DingDingWebHook { get; set; }
public string DingDingKey { get; set; }
public int SkuSafeTurnoverDays { get; set; }
/// <summary>
/// 司南策略等级
/// </summary>
public int SiNanPolicyLevel { get; set; }
/// <summary>
/// 司南钉钉WebHook地址
/// </summary>
public string SiNanDingDingWebHook { get; set; }
/// <summary>
/// 司南钉钉密钥
/// </summary>
public string SiNanDingDingKey { get; set; }
/// <summary>
/// U钉钉WebHook地址
/// </summary>
public string UDingDingWebHook { get; set; }
/// <summary>
/// U钉钉密钥
/// </summary>
public string UDingDingKey { get; set; }
public override string ToString()
{
return ShopName;
}
}
}

33
U/Models/User/User.cs

@ -0,0 +1,33 @@
using System.Collections.Generic;
namespace U
{
public class User : NotifyObject
{
//private string name;
private Shop shop;
public long Id { get; set; }
public string Name { get; set; }
public string TeamId { get; set; }
public string TeamName { get; set; }
public string SonDepartmentNames { get; set; }
public Shop Shop { get => shop; set { Set(ref shop, value); } }
public IList<Department> DepartmentList { get; set; }
/// <summary>
/// 店铺列表 (暂时只有刷单组才需要)
/// </summary>
public IList<Shop> ShopList { get; set; }
public string Token { get; set; }
}
}

22
U/U.csproj

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.2-mauipre.1.22102.15" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.2-mauipre.1.22054.8" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.1829-prerelease" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BBWYB.Common\BBWYB.Common.csproj" />
<ProjectReference Include="..\SJ.Controls\SJ.Controls.csproj" />
</ItemGroup>
</Project>

69
U/WebView2Manager.cs

@ -0,0 +1,69 @@
using BBWYB.Common.Models;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.Wpf;
using System;
using io = System.IO;
namespace U
{
public class WebView2Manager : IDenpendency
{
public WebView2 wb2 { get; private set; }
//public WebView2Manager()
//{
// Init();
//}
public void Init()
{
if (wb2 == null)
{
wb2 = new WebView2();
var wb2Setting = CoreWebView2Environment.CreateAsync(userDataFolder: io.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "WebView2UserData")).Result;
wb2.EnsureCoreWebView2Async(wb2Setting);
wb2.CoreWebView2InitializationCompleted += Wb2_CoreWebView2InitializationCompleted;
wb2.NavigationCompleted += Wb2_NavigationCompleted;
wb2.WebMessageReceived += Wb2_WebMessageReceived;
}
}
public Action<CoreWebView2WebMessageReceivedEventArgs> OnWebMessageReceived;
public Action<CoreWebView2NavigationCompletedEventArgs> OnNavigationCompleted;
public Action<CoreWebView2InitializationCompletedEventArgs> CoreWebView2InitializationCompleted;
public bool IsInitializationCompleted { get ; private set; }
private void Wb2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e)
{
OnWebMessageReceived?.Invoke(e);
}
private void Wb2_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
{
OnNavigationCompleted?.Invoke(e);
}
private void Wb2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
CoreWebView2InitializationCompleted?.Invoke(e);
IsInitializationCompleted = true;
}
public void Close()
{
if (wb2 != null && wb2.CoreWebView2 != null)
{
IsInitializationCompleted = false;
wb2.CoreWebView2InitializationCompleted -= Wb2_CoreWebView2InitializationCompleted;
wb2.NavigationCompleted -= Wb2_NavigationCompleted;
wb2.WebMessageReceived -= Wb2_WebMessageReceived;
var udf = wb2.CoreWebView2.Environment.UserDataFolder;
wb2.Dispose();
wb2 = null;
try
{
io.Directory.Delete(udf, true);
}
catch { }
}
}
}
}

12
bbwyb.sln

@ -40,6 +40,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.editorconfig = .editorconfig
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Other", "Other", "{878D0106-F55F-4813-9158-F2729D460F9C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "U", "U", "{D34B0974-D525-4BD1-90DE-B2CF5FE47AA4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "U", "U\U.csproj", "{FE3D9812-2D75-4850-8AEA-CE88BAF2F17A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -86,6 +92,10 @@ Global
{A4C4F802-D298-42DE-B410-50C8C87EFFAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A4C4F802-D298-42DE-B410-50C8C87EFFAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A4C4F802-D298-42DE-B410-50C8C87EFFAA}.Release|Any CPU.Build.0 = Release|Any CPU
{FE3D9812-2D75-4850-8AEA-CE88BAF2F17A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE3D9812-2D75-4850-8AEA-CE88BAF2F17A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FE3D9812-2D75-4850-8AEA-CE88BAF2F17A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE3D9812-2D75-4850-8AEA-CE88BAF2F17A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -103,6 +113,8 @@ Global
{D5D93778-14D7-45F7-A77C-397FDBA408A1} = {B4ED118A-2CFF-4E8F-B395-608E90C6D0C2}
{450F51B1-29E6-47F3-A517-AD5814EC9129} = {B4ED118A-2CFF-4E8F-B395-608E90C6D0C2}
{A4C4F802-D298-42DE-B410-50C8C87EFFAA} = {B4ED118A-2CFF-4E8F-B395-608E90C6D0C2}
{D34B0974-D525-4BD1-90DE-B2CF5FE47AA4} = {878D0106-F55F-4813-9158-F2729D460F9C}
{FE3D9812-2D75-4850-8AEA-CE88BAF2F17A} = {D34B0974-D525-4BD1-90DE-B2CF5FE47AA4}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0D069898-04B7-4D24-A6A4-D7C703B8BFFC}

Loading…
Cancel
Save