Browse Source

Merge branch '1688purchase' of http://code.qiyue666.com/pengcong001/bbwy into 1688purchase

qianyi
shanji 3 years ago
parent
commit
ec6405a360
  1. 9
      BBWY.Client/APIServices/StatisticsService.cs
  2. 1
      BBWY.Client/App.xaml.cs
  3. 2
      BBWY.Client/BBWY.Client.csproj
  4. 18
      BBWY.Client/Models/Product/PurchaseSchemeProductSku.cs
  5. 5
      BBWY.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs
  6. 10
      BBWY.Client/ViewModels/Order/OrderListViewModel.cs
  7. 16
      BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs
  8. 4
      BBWY.Client/Views/Order/ChoosePurchaseScheme.xaml
  9. 4
      BBWY.Client/Views/Order/OrderList.xaml
  10. 24
      BBWY.Client/Views/Purchase/1688Purchase.xaml
  11. 7
      BBWY.Client/Views/Purchase/1688Purchase.xaml.cs
  12. 70
      BBWY.Common/TaskSchedulers/DelayTrigger.cs
  13. 4
      BBWY.Server.API/Controllers/StatisticsController.cs
  14. 9
      BBWY.Server.Business/Statistics/StatisticsBusiness.cs
  15. 10
      BBWY.Server.Model/Dto/Request/Statistics/ToDayOrderAchievementRequest.cs
  16. 2
      BBWY.Server.Model/Dto/Response/Statistics/OrderAchievementResponse.cs

9
BBWY.Client/APIServices/StatisticsService.cs

@ -1,6 +1,7 @@
using BBWY.Client.Models;
using BBWY.Common.Http;
using BBWY.Common.Models;
using System;
using System.Net.Http;
namespace BBWY.Client.APIServices
@ -16,11 +17,13 @@ namespace BBWY.Client.APIServices
/// 今日业绩统计
/// </summary>
/// <returns></returns>
public ApiResponse<ToDayOrderAchievementResponse> GetTodayAchievementStatistics()
public ApiResponse<ToDayOrderAchievementResponse> GetTodayAchievementStatistics(DateTime startTime, DateTime endTime)
{
return SendRequest<ToDayOrderAchievementResponse>(globalContext.BBYWApiHost, "Api/Statistics/GetTodayAchievementStatistics", new
return SendRequest<ToDayOrderAchievementResponse>(globalContext.BBYWApiHost, "Api/Statistics/GetOrderAchievementStatistics", new
{
ShopId = globalContext.User.Shop.ShopId
globalContext.User.Shop.ShopId,
startTime,
endTime
},
null, HttpMethod.Post);
}

1
BBWY.Client/App.xaml.cs

@ -3,6 +3,7 @@ using BBWY.Client.ViewModels;
using BBWY.Common.Extensions;
using BBWY.Common.Http;
using BBWY.Common.Models;
using BBWY.Common.Trigger;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;

2
BBWY.Client/BBWY.Client.csproj

@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>true</UseWPF>
<ApplicationIcon>Resources\Images\bbwylogo.ico</ApplicationIcon>

18
BBWY.Client/Models/Product/PurchaseSchemeProductSku.cs

@ -1,4 +1,6 @@
namespace BBWY.Client.Models
using System;
namespace BBWY.Client.Models
{
/// <summary>
/// 采购商品的Sku
@ -33,11 +35,23 @@
public long SkuPurchaseSchemeId { get; set; }
public long UserId { get; set; }
public int ItemTotal { get => itemTotal; set { Set(ref itemTotal, value); } }
public int ItemTotal
{
get => itemTotal; set
{
if (Set(ref itemTotal, value))
{
SkuAmount = value * Price;
OnItemTotalChanged?.Invoke(value);
}
}
}
public decimal SkuAmount { get => skuAmount; set { Set(ref skuAmount, value); } }
private int itemTotal;
private decimal skuAmount;
public Action<int> OnItemTotalChanged { get; set; }
}
}

5
BBWY.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs

@ -1,5 +1,6 @@
using BBWY.Client.APIServices;
using BBWY.Client.Models;
using BBWY.Client.Views.Purchase;
using BBWY.Common.Models;
using GalaSoft.MvvmLight.Command;
using System.Collections.Generic;
@ -46,6 +47,7 @@ namespace BBWY.Client.ViewModels
protected override void Unload()
{
this.ItemTotal = 0;
this.OrderId = this.SkuId = this.SkuName = string.Empty;
PurchaseSchemeList.Clear();
}
@ -100,7 +102,8 @@ namespace BBWY.Client.ViewModels
public void PreviewPurchase(PurchaseScheme purchaseScheme)
{
var p = new _1688Purchase(this.OrderId, this.ItemTotal, purchaseScheme);
p.ShowDialog();
}
}
}

10
BBWY.Client/ViewModels/Order/OrderListViewModel.cs

@ -108,7 +108,7 @@ namespace BBWY.Client.ViewModels
{
PageIndex = 1;
Task.Factory.StartNew(() => LoadOrder(1));
Task.Factory.StartNew(LoadTodayAchievement);
Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
});
CopyTextCommand = new RelayCommand<string>(s => Clipboard.SetText(s));
CopyOrderWaybillCommand = new RelayCommand<Order>(o => Clipboard.SetText(o.WaybillNo));
@ -118,12 +118,12 @@ namespace BBWY.Client.ViewModels
StartDate = DateTime.Now.Date.AddDays(d * -1);
PageIndex = 1;
Task.Factory.StartNew(() => LoadOrder(1));
Task.Factory.StartNew(LoadTodayAchievement);
Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
});
OrderPageIndexChangedCommand = new RelayCommand<PageArgs>(p =>
{
Task.Factory.StartNew(() => LoadOrder(p.PageIndex));
Task.Factory.StartNew(LoadTodayAchievement);
Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
});
DecodeConsigneeCommand = new RelayCommand<Order>(DecodeConsignee);
ChooseStorageTypeCommand = new RelayCommand<object>(ChooseStorageType);
@ -187,9 +187,9 @@ namespace BBWY.Client.ViewModels
IsLoading = false;
}
private void LoadTodayAchievement()
private void LoadTodayAchievement(DateTime startTime, DateTime endTime)
{
var response = statisticsService.GetTodayAchievementStatistics();
var response = statisticsService.GetTodayAchievementStatistics(startTime, endTime);
if (!response.Success)
return;
_ = response.Data.Map(ToDayOrderAchievement);

16
BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs

@ -1,5 +1,6 @@
using BBWY.Client.APIServices;
using BBWY.Client.Models;
using BBWY.Common.Trigger;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
@ -21,10 +22,13 @@ namespace BBWY.Client.ViewModels
private int skuItemCount;
private bool isLoading;
private OneBoundAPIService oneBoundAPIService;
private DelayTrigger delayTrigger;
public _1688PreviewPurchaseViewModel(OneBoundAPIService oneBoundAPIService)
{
this.oneBoundAPIService = oneBoundAPIService;
this.delayTrigger = new DelayTrigger();
this.delayTrigger.OnExecute = OnDelayTriggerExecute;
PurchaseSchemeProductSkuList = new ObservableCollection<PurchaseSchemeProductSku>();
}
@ -74,6 +78,7 @@ namespace BBWY.Client.ViewModels
{
PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku);
purchaseSchemeProductSku.ItemTotal = skuItemCount;
purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged;
}
}
});
@ -139,5 +144,16 @@ namespace BBWY.Client.ViewModels
}
return "pack://application:,,,/Resources/Images/defaultItem.png";
}
private void OnItemTotalChanged(int itemTotal)
{
Console.WriteLine($"OnItemTotalChanged {DateTime.Now} {itemTotal}");
this.delayTrigger.SetKey(itemTotal.ToString());
}
private void OnDelayTriggerExecute(string key)
{
}
}
}

4
BBWY.Client/Views/Order/ChoosePurchaseScheme.xaml

@ -48,7 +48,9 @@
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<c:BButton Content="下单" HorizontalAlignment="Stretch"
Background="#1CC2A2"/>
Background="#1CC2A2"
Command="{Binding DataContext.PreviewPurchaseCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding }"/>
<c:BButton Content="编辑" Grid.Column="1" HorizontalAlignment="Stretch"
Background="#02A7F0"
Command="{Binding DataContext.EditCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"

4
BBWY.Client/Views/Order/OrderList.xaml

@ -154,9 +154,9 @@
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<TextBlock Style="{StaticResource middleTextBlock}" FontSize="25" Foreground="#EC808D" Grid.RowSpan="2">
<Run Text="今日"/>
<LineBreak/>
<Run Text="业绩"/>
<LineBreak/>
<Run Text="统计"/>
</TextBlock>
<TextBlock Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left">

24
BBWY.Client/Views/Purchase/1688Purchase.xaml

@ -5,12 +5,21 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BBWY.Client.Views.Purchase"
xmlns:c="clr-namespace:BBWY.Controls;assembly=BBWY.Controls"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d"
Title="提交订单" Height="600" Width="800"
Style="{StaticResource bwstyle}"
MinButtonVisibility="Collapsed"
MaxButtonVisibility="Collapsed"
DataContext="{Binding _1688PreviewPurchase,Source={StaticResource Locator}}">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding LoadCommand}"/>
</b:EventTrigger>
<b:EventTrigger EventName="Unloaded">
<b:InvokeCommandAction Command="{Binding UnloadCommand}"/>
</b:EventTrigger>
</b:Interaction.Triggers>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
@ -25,7 +34,8 @@
</Border>
<DataGrid Grid.Row="1"
ItemsSource="{Binding PurchaseSchemeProductSkuList}">
ItemsSource="{Binding PurchaseSchemeProductSkuList}"
RowHeight="90">
<DataGrid.Columns>
<DataGridTemplateColumn Header="货品信息" HeaderStyle="{StaticResource ColumnHeaderStyle_Center}" Width="1*">
<DataGridTemplateColumn.CellTemplate>
@ -40,21 +50,25 @@
<c:BAsyncImage UrlSource="{Binding Logo}"
Width="80" DecodePixelWidth="80"
VerticalAlignment="Top" Margin="0,5,0,0"/>
<TextBlock Text="{Binding Title}"/>
<TextBlock Text="{Binding Title}" Grid.Column="1"
VerticalAlignment="Center"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="单价" HeaderStyle="{StaticResource ColumnHeaderStyle_Center}" Width="80" Binding="{Binding Price}"/>
<DataGridTextColumn Header="单价" HeaderStyle="{StaticResource ColumnHeaderStyle_Center}" Width="80" Binding="{Binding Price}"
ElementStyle="{StaticResource middleTextBlock}"/>
<DataGridTemplateColumn Header="数量" HeaderStyle="{StaticResource ColumnHeaderStyle_Center}" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<c:BTextBox Text="{Binding ItemTotal,Converter={StaticResource inputNumberConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<c:BTextBox Text="{Binding ItemTotal,Converter={StaticResource inputNumberConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Width="60"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="金额" HeaderStyle="{StaticResource ColumnHeaderStyle_Center}" Width="80"
Binding="{Binding SkuAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/>
Binding="{Binding SkuAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"
ElementStyle="{StaticResource middleTextBlock}"/>
</DataGrid.Columns>
</DataGrid>

7
BBWY.Client/Views/Purchase/1688Purchase.xaml.cs

@ -1,4 +1,6 @@
using BBWY.Controls;
using BBWY.Client.Models;
using BBWY.Client.ViewModels;
using BBWY.Controls;
namespace BBWY.Client.Views.Purchase
{
@ -7,9 +9,10 @@ namespace BBWY.Client.Views.Purchase
/// </summary>
public partial class _1688Purchase : BWindow
{
public _1688Purchase()
public _1688Purchase(string orderId, int skuItemCount, PurchaseScheme purchaseScheme)
{
InitializeComponent();
(this.DataContext as _1688PreviewPurchaseViewModel).SetData(orderId, skuItemCount, purchaseScheme);
}
}
}

70
BBWY.Common/TaskSchedulers/DelayTrigger.cs

@ -0,0 +1,70 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace BBWY.Common.Trigger
{
/// <summary>
/// 延迟触发组件
/// </summary>
public class DelayTrigger
{
public DelayTrigger(int delayTime = 1000)
{
if (delayTime < 1000)
delayTime = 1000;
this.delayTime = delayTime;
}
/// <summary>
/// 延迟执行时间(ms)
/// </summary>
private int delayTime;
/// <summary>
/// 关键字
/// </summary>
private string currentKey;
/// <summary>
/// 是否可以执行
/// </summary>
private volatile bool canExecute;
/// <summary>
/// 是否正在延迟响应中
/// </summary>
private volatile bool isDelaying;
public Action<string> OnExecute;
public void SetKey(string key)
{
currentKey = key;
if (isDelaying)
{
canExecute = false;
return;
}
Task.Factory.StartNew(delegate
{
isDelaying = true;
while (true)
{
canExecute = true;
Thread.Sleep(delayTime);
if (canExecute)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"DelayTrigger {currentKey} Execute at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff")}");
Console.ResetColor();
OnExecute?.Invoke(currentKey);
isDelaying = false;
break;
}
}
});
}
}
}

4
BBWY.Server.API/Controllers/StatisticsController.cs

@ -21,9 +21,9 @@ namespace BBWY.Server.API.Controllers
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public ToDayOrderAchievementResponse GetTodayAchievementStatistics(ToDayOrderAchievementRequest request)
public OrderAchievementResponse GetOrderAchievementStatistics([FromBody] OrderAchievementRequest request)
{
return statisticsBusiness.GetTodayAchievementStatistics(request);
return statisticsBusiness.GetOrderAchievementStatistics(request);
}
}
}

9
BBWY.Server.Business/Statistics/StatisticsBusiness.cs

@ -17,15 +17,16 @@ namespace BBWY.Server.Business
invalidOrderStateList = new List<Enums.OrderState>() { Enums.OrderState., Enums.OrderState. };
}
public ToDayOrderAchievementResponse GetTodayAchievementStatistics(ToDayOrderAchievementRequest request)
public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request)
{
var today = DateTime.Now.Date;
request.EndTime = request.EndTime.Date.AddDays(1);
var response = fsql.Select<Order, OrderCost>().LeftJoin((o, oc) => o.Id == oc.OrderId)
.Where((o, oc) => o.ShopId == request.ShopId &&
o.OrderState != null &&
!invalidOrderStateList.Contains(o.OrderState.Value) &&
o.StartTime >= today)
.ToAggregate((o, oc) => new ToDayOrderAchievementResponse()
o.StartTime >= request.StartTime &&
o.StartTime < request.EndTime)
.ToAggregate((o, oc) => new OrderAchievementResponse()
{
OrderCount = o.Count(),
Profit = oc.Sum(oc.Key.Profit),

10
BBWY.Server.Model/Dto/Request/Statistics/ToDayOrderAchievementRequest.cs

@ -1,7 +1,13 @@
namespace BBWY.Server.Model.Dto
using System;
namespace BBWY.Server.Model.Dto
{
public class ToDayOrderAchievementRequest
public class OrderAchievementRequest
{
public long ShopId { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
}

2
BBWY.Server.Model/Dto/Response/Statistics/ToDayOrderAchievementResponse.cs → BBWY.Server.Model/Dto/Response/Statistics/OrderAchievementResponse.cs

@ -2,7 +2,7 @@
namespace BBWY.Server.Model.Dto
{
public class ToDayOrderAchievementResponse
public class OrderAchievementResponse
{
/// <summary>
Loading…
Cancel
Save