You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

357 lines
11 KiB
C#

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using LiveCharts;
using LiveCharts.Defaults;
using LiveCharts.Wpf;
using Microsoft.Extensions.DependencyInjection;
using SlnMesnac.Business;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using SlnMesnac.WPF.MessageTips;
using SlnMesnac.WPF.Model;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2024 WenJY
* CLR4.0.30319.42000
* LAPTOP-E0N2L34V
* SlnMesnac.WPF.ViewModel
* 14008fcc-0a31-4f1e-bc80-9f9ea84d3de5
*
* WenJY
* wenjy@mesnac.com
* 2024-04-10 16:18:57
* V1.0.0
*
*
*--------------------------------------------------------------------
*
*
*
*
* V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
namespace SlnMesnac.WPF.ViewModel
{
/// <summary>
/// 生产统计ViewModel
/// </summary>
internal class ProdStatisticsViewModel : ViewModelBase
{
private readonly PalletStowBusiness _palletStowBusiness;
private readonly ProdCompletionBusiness _prodCompletionBusiness;
private readonly ISqlSugarClient sqlClient;
public ProdStatisticsViewModel()
{
_palletStowBusiness = App.ServiceProvider.GetService<PalletStowBusiness>();
_prodCompletionBusiness = App.ServiceProvider.GetService<ProdCompletionBusiness>();
sqlClient = App.ServiceProvider.GetService<ISqlSugarClient>();
QueryCommand = new RelayCommand<object>(obj => Query());
BeginDate = DateTime.Now.AddDays(-3);
EndDate = DateTime.Now;
Query();
}
#region 参数定义
#region 投料X轴日期
/// <summary>
/// 日产量柱状图X轴日期
/// </summary>
private List<string> outDayList = new List<string>();
public List<string> OutDayList
{
get { return outDayList; }
set { outDayList = value; }
}
#endregion
#region 投料柱状图
/// <summary>
/// 投料统计柱状图
/// </summary>
private SeriesCollection outAchievement = new SeriesCollection();
public SeriesCollection OutAchievement
{
get { return outAchievement; }
set { outAchievement = value; }
}
#endregion
#region 日产量柱状图X轴日期
/// <summary>
/// 日产量柱状图X轴日期
/// </summary>
private List<string> productDayList = new List<string>();
public List<string> ProductDayList
{
get { return productDayList; }
set { productDayList = value; }
}
#endregion
#region 型号统计柱状图
/// <summary>
/// 日产量统计柱状图
/// </summary>
private SeriesCollection productAchievement = new SeriesCollection();
public SeriesCollection ProductAchievement
{
get { return productAchievement; }
set { productAchievement = value; }
}
#endregion
private DateTime _BeginDate;
public DateTime BeginDate
{
get { return _BeginDate; }
set
{
if (_BeginDate != value)
{
_BeginDate = value;
RaisePropertyChanged();//属性通知
}
}
}
private DateTime _EndDate;
public DateTime EndDate
{
get { return _EndDate; }
set
{
_EndDate = value;
RaisePropertyChanged();//属性通知
}
}
/// <summary>
/// 原材料投料明细DataGrid
/// </summary>
private ObservableCollection<WmsRawOutstockDetail> wmsRawOutstockDetailDataGrid = new ObservableCollection<WmsRawOutstockDetail>();
public ObservableCollection<WmsRawOutstockDetail> WmsRawOutstockDetailDataGrid
{
get { return wmsRawOutstockDetailDataGrid; }
set { wmsRawOutstockDetailDataGrid = value; RaisePropertyChanged(() => WmsRawOutstockDetailDataGrid); }
}
/// <summary>
/// 成品入库记录DataGrid
/// </summary>
private ObservableCollection<WmsProductInstock> productDataGrid = new ObservableCollection<WmsProductInstock>();
public ObservableCollection<WmsProductInstock> ProductDataGrid
{
get { return productDataGrid; }
set { productDataGrid = value; RaisePropertyChanged(() => ProductDataGrid); }
}
#endregion
#region 事件定义
/// <summary>
/// 时间查询事件
/// </summary>
public RelayCommand<object> QueryCommand { get; set; }
public RelayCommand<string> DeleteBarCodeCommand { get; set; }
#endregion
#region 时间查询
private async Task Query()
{
try
{
BeginDate = BeginDate.Date;
EndDate = EndDate.AddDays(1).Date;
if (EndDate < BeginDate)
{
Application.Current.Dispatcher.Invoke(() =>
{
Msg.MsgShow("结束时间要大于开始时间", 2, 3);
});
return;
}
else
{
await RefreshWmsRawOutstockDetailDataGrid(BeginDate, EndDate);
await RefreshProductDataGrid(BeginDate, EndDate);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
#endregion
#region 3F原材料出库记录及图表
/// <summary>
/// 刷新原材料出库记录
/// </summary>
private async Task RefreshWmsRawOutstockDetailDataGrid(DateTime beginDate, DateTime endDate)
{
List<WmsRawOutstockDetail> list;
list = await sqlClient.AsTenant().GetConnection("mes").Queryable<WmsRawOutstockDetail>().Where(x => x.WarehouseId == 311 && x.OutstockTime >= beginDate && x.OutstockTime <= endDate).OrderByDescending(t => t.OutstockTime).ToListAsync();
if (list != null && list.Count > 0)
{
await App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
WmsRawOutstockDetailDataGrid.Clear();
int i = 1;
foreach (WmsRawOutstockDetail verify in list)
{
verify.RawOutstockDetailId = i++;
WmsRawOutstockDetailDataGrid.Add(verify);
}
}));
// 刷新图表
RefreshWmsRawOutstockDetailChart(list);
}
}
/// <summary>
/// 刷新原材料出库图表
/// </summary>
/// <param name="list"></param>
private void RefreshWmsRawOutstockDetailChart(List<WmsRawOutstockDetail> list)
{
App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
OutAchievement.Clear();
OutDayList.Clear();
ChartValues<ObservablePoint> achievement = new ChartValues<ObservablePoint>();
var listByDate = list
.GroupBy(detail => detail.OutstockTime.Value.Date) // 按日期分组
.Select(group => new
{
Date = group.Key,
TotalAmount = group.Count() // 统计出库数量
})
.ToList();
int i = 0;
foreach (var item in listByDate)
{
outDayList.Add(item.Date.ToString("MM-dd"));
achievement.Add(new ObservablePoint(i++, double.Parse(item.TotalAmount.ToString())));
}
//加一个汇总柱状图
outDayList.Add("合计");
achievement.Add(new ObservablePoint(i, list.Count));
var column = new ColumnSeries();
column.DataLabels = true;
column.Title = "日投料量";
column.Values = achievement;
column.Foreground = Brushes.White;
4 weeks ago
column.Fill = new SolidColorBrush(Brushes.YellowGreen.Color);
OutAchievement.Add(column);
}));
}
#endregion
#region 2F成品生产记录及统计图表
private async Task RefreshProductDataGrid(DateTime beginDate, DateTime endDate)
{
List<WmsProductInstock> list;
list = await sqlClient.AsTenant().GetConnection("mes").Queryable<WmsProductInstock>().Where(x => x.warehouseId == 231 && x.updateDate >= beginDate && x.updateDate <= endDate).OrderByDescending(t => t.updateDate).ToListAsync();
if (list != null && list.Count > 0)
{
await App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
productDataGrid.Clear();
int i = 1;
foreach (WmsProductInstock verify in list)
{
verify.productInstockId = i++;
productDataGrid.Add(verify);
}
}));
// 刷新图表
RefreshProductChart(list);
}
}
private void RefreshProductChart(List<WmsProductInstock> list)
{
App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
ProductAchievement.Clear();
ProductDayList.Clear();
ChartValues<ObservablePoint> achievement = new ChartValues<ObservablePoint>();
var listByDate = list
.GroupBy(detail => detail.updateDate.Value.Date) // 按日期分组
.Select(group => new
{
Date = group.Key,
TotalAmount = group.Count() // 统计出库数量
})
.ToList();
int i = 0;
foreach (var item in listByDate)
{
ProductDayList.Add(item.Date.ToString("MM-dd"));
achievement.Add(new ObservablePoint(i++, double.Parse(item.TotalAmount.ToString())));
}
//加一个汇总柱状图
ProductDayList.Add("合计");
achievement.Add(new ObservablePoint(i, list.Count));
var column = new ColumnSeries();
column.DataLabels = true;
column.Title = "日生产量";
column.Values = achievement;
column.Foreground = Brushes.White;
4 weeks ago
column.Fill = new SolidColorBrush(Brushes.LimeGreen.Color);
ProductAchievement.Add(column);
}));
}
#endregion
}
}