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.
363 lines
12 KiB
C#
363 lines
12 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using LiveCharts.Wpf;
|
|
using LiveCharts;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Media;
|
|
using Admin.Core.IService;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Admin.Core.Model.ViewModels;
|
|
using System.Collections.ObjectModel;
|
|
using Aucma.Core.DoorFoam.Models;
|
|
using Admin.Core.Model;
|
|
using Castle.Core.Internal;
|
|
using Aucma.Core.Scanner;
|
|
using Admin.Core.Service;
|
|
using Admin.Core.IRepository;
|
|
using Admin.Core.Repository;
|
|
using Admin.Core.Common;
|
|
using log4net;
|
|
using System.Collections;
|
|
using System.Windows.Documents;
|
|
using NPOI.SS.Formula.Functions;
|
|
using Microsoft.Extensions.FileSystemGlobbing.Internal;
|
|
using System.Text.RegularExpressions;
|
|
using System.Windows.Controls;
|
|
|
|
namespace Aucma.Core.DoorFoam.ViewModels
|
|
{
|
|
public partial class RealTimePageViewModel : ObservableObject
|
|
{
|
|
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(RealTimePageViewModel));
|
|
protected readonly IProductPlanInfoServices? _productPlanInfoServices;
|
|
protected readonly IDoorMateHistoryServices? _doorMateHistoryServices;
|
|
protected readonly IPrintBarCodeServices? _printBarCodeServices;
|
|
protected readonly ISysUserInfoRepository _sysUserInfoRepository;
|
|
private ObservableCollection<dynamic> listItems = new ObservableCollection<dynamic>();
|
|
public RealTimePageViewModel()
|
|
{
|
|
_productPlanInfoServices = App.ServiceProvider.GetService<IProductPlanInfoServices>();
|
|
_doorMateHistoryServices = App.ServiceProvider.GetService<IDoorMateHistoryServices>();
|
|
_sysUserInfoRepository = App.ServiceProvider.GetService<ISysUserInfoRepository>();
|
|
_printBarCodeServices = App.ServiceProvider.GetService<IPrintBarCodeServices>();
|
|
InitEveryDayMethodAsync();
|
|
|
|
MvCodeHelper.DoorReceiveCodeDelegateEvent += OnLoadPlanData;
|
|
|
|
OnLoadPlanData("B24010181060282920001");
|
|
}
|
|
/// <summary>
|
|
/// 获取今天的数据
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
private void InitEveryDayMethodAsync()
|
|
{
|
|
|
|
ChartValues<double> achievement = new ChartValues<double>();
|
|
MaterialNameList = new List<string>();
|
|
|
|
var info = _doorMateHistoryServices.Query(x => x.ScanTime.ToString("yyyy-MM-dd").Contains(DateTime.Now.ToString("yyyy-MM-dd")));
|
|
|
|
App.Current.Dispatcher.BeginInvoke((Action)(() =>
|
|
{
|
|
ModelStatistics.Clear();
|
|
|
|
if (info != null)
|
|
{
|
|
var groupResult = from p in info
|
|
group p by p.MaterialName into g
|
|
select new { MaterialName = g.Key, Count = g.Count() };
|
|
foreach (var groupItem in groupResult)
|
|
{
|
|
achievement.Add(groupItem.Count);
|
|
|
|
MaterialNameList.Add(FormatMaterialType(groupItem.MaterialName));
|
|
}
|
|
}
|
|
|
|
ModelStatistics.Add(new ColumnSeries()
|
|
{
|
|
DataLabels = true,
|
|
Title = "型号",
|
|
Values = achievement,
|
|
Fill = new SolidColorBrush(Color.FromRgb(15, 209, 226)),
|
|
Foreground = Brushes.White,
|
|
FontSize = 18
|
|
});
|
|
}));
|
|
|
|
|
|
|
|
}
|
|
|
|
#region 扫描信息
|
|
|
|
#region 物料条码
|
|
private string _stationName;
|
|
public string StationName
|
|
{
|
|
get { return _stationName; }
|
|
set
|
|
{
|
|
_stationName = value;
|
|
SetProperty(ref _stationName, value);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 物料名称
|
|
private string _materialName;
|
|
public string MaterialName
|
|
{
|
|
get { return _materialName; }
|
|
set
|
|
{
|
|
_materialName = value;
|
|
SetProperty(ref _materialName, value);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 订单信息
|
|
private string _orderNo;
|
|
public string OrderNo
|
|
{
|
|
get { return _orderNo; }
|
|
set
|
|
{
|
|
_orderNo = value;
|
|
SetProperty(ref _orderNo, value);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 开始时间
|
|
private string _beginTime;
|
|
public string BeginTime
|
|
{
|
|
get { return _beginTime; }
|
|
set
|
|
{
|
|
_beginTime = value;
|
|
SetProperty(ref _beginTime, value);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region 当日产量
|
|
|
|
#region 日产量柱状图X轴日期
|
|
/// <summary>
|
|
/// 日产量柱状图X轴日期
|
|
/// </summary>
|
|
private List<string> productionHourList;
|
|
|
|
public List<string> ProductionHourList
|
|
{
|
|
get { return productionHourList; }
|
|
set { productionHourList = value; }
|
|
}
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// 日产量柱状图
|
|
/// </summary>
|
|
private SeriesCollection achievement = new SeriesCollection();
|
|
|
|
public SeriesCollection Achievement
|
|
{
|
|
get { return achievement; }
|
|
set { achievement = value; }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 型号统计
|
|
|
|
#region 型号统计柱状图x轴物料类型
|
|
/// <summary>
|
|
/// 型号统计柱状图x轴物料类型
|
|
/// </summary>
|
|
private List<string> materialNameList;
|
|
|
|
public List<string> MaterialNameList
|
|
{
|
|
get { return materialNameList; }
|
|
set { materialNameList = value; }
|
|
}
|
|
#endregion
|
|
|
|
#region 型号统计柱状图
|
|
/// <summary>
|
|
/// 型号统计柱状图
|
|
/// </summary>
|
|
private SeriesCollection modelStatistics = new SeriesCollection();
|
|
|
|
public SeriesCollection ModelStatistics
|
|
{
|
|
get { return modelStatistics; }
|
|
set { modelStatistics = value; }
|
|
}
|
|
#endregion
|
|
#endregion
|
|
|
|
#region 门体匹配队列
|
|
|
|
private int i = 0;
|
|
/// <summary>
|
|
/// 门体匹配队列
|
|
/// </summary>
|
|
/// <param name="code"></param>
|
|
public void OnLoadPlanData(string code)
|
|
{
|
|
string stationCode = Appsettings.app("StationInfo", "StationCode");
|
|
string productLineCode = Appsettings.app("StationInfo", "ProductlineCode");
|
|
if (string.IsNullOrEmpty(code)) return;
|
|
var plan = _productPlanInfoServices.QueryAsync(d => d.ProductLineCode == stationCode && d.PlanAmount > d.CompleteAmount).Result;
|
|
if (plan == null) return;
|
|
var obj = _printBarCodeServices.FirstAsync(d => d.MaterialBarcode == code).Result;
|
|
if (obj == null) return;
|
|
//string materialCode = this.SubString(code);
|
|
ProductPlanInfo stationPlan = plan.FirstOrDefault(d => d.OrderCode == obj.OrderCode);
|
|
if (stationPlan == null) return;
|
|
|
|
DoorMateHistory model = new DoorMateHistory();
|
|
if (planInfoDataGrid.Count() == 0) model.ObjId = 1;
|
|
else model.ObjId = planInfoDataGrid.Count() + 1;
|
|
|
|
model.PlanCode = stationPlan.PlanCode;
|
|
model.OrderCode = stationPlan.OrderCode;
|
|
model.MaterialCode = stationPlan.MaterialCode;
|
|
model.MaterialName = stationPlan.MaterialName;
|
|
model.ScanTime = DateTime.Now;
|
|
SaveMateHistory(code,obj, productLineCode, plan, model);
|
|
|
|
model.MaterialName = this.FormatMaterialType(stationPlan.MaterialName);
|
|
model.ObjId = i+1;
|
|
planInfoDataGrid.Insert(0, model);
|
|
|
|
InitEveryDayMethodAsync();//刷新型号统计图表
|
|
|
|
}
|
|
|
|
#region 记录历史
|
|
/// <summary>
|
|
/// 记录历史
|
|
/// </summary>
|
|
/// <param name="code"></param>
|
|
/// <param name="productLineCode"></param>
|
|
/// <param name="plan"></param>
|
|
/// <param name="model"></param>
|
|
private void SaveMateHistory(string code, PrintBarCode obj, string productLineCode, List<ProductPlanInfo> plan, DoorMateHistory model)
|
|
{
|
|
var planObj = plan.FirstOrDefault(d => d.OrderCode == obj.OrderCode);
|
|
if (planObj == null) return;
|
|
|
|
var stationList = _sysUserInfoRepository.GetProductLineInfo(productLineCode).Result;
|
|
if (stationList != null)
|
|
{
|
|
var station = stationList.FirstOrDefault();
|
|
model.ProductLineCode = planObj.ProductLineCode;
|
|
model.PlantCode = station.PlantCode;
|
|
model.StationCode = station.StationCode;
|
|
int result = _doorMateHistoryServices.AddAsync(model).Result;
|
|
if (result <= 0)
|
|
PrintMessageToListBox($"箱门匹配记录异常!扫描箱体条码:【{code}】");
|
|
else
|
|
PrintMessageToListBox($"箱门匹配成功!扫描箱体条码:【{code}】");
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
#region 初始化datagrid
|
|
private ObservableCollection<DoorMateHistory> planInfoDataGrid = new ObservableCollection<DoorMateHistory>();
|
|
public ObservableCollection<DoorMateHistory> PlanInfoDataGrid
|
|
{
|
|
get { return planInfoDataGrid; }
|
|
set
|
|
{
|
|
planInfoDataGrid = value;
|
|
OnPropertyChanged();//属性通知
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 实时展示数据
|
|
/// <summary>
|
|
/// LisBox数据模板
|
|
/// </summary>
|
|
private IEnumerable logInfoListBox;
|
|
public IEnumerable LogInfoListBox
|
|
{
|
|
get => logInfoListBox;
|
|
set => SetProperty(ref logInfoListBox, value);
|
|
}
|
|
#endregion
|
|
|
|
#region listBox绑定日志
|
|
/// <summary>
|
|
/// listBox绑定日志
|
|
/// </summary>
|
|
/// <param name="message"></param>
|
|
private void PrintMessageToListBox(string message)
|
|
{
|
|
try
|
|
{
|
|
listItems.Add($"{DateTime.Now.ToString("HH:mm:ss")}==>{message}");
|
|
|
|
LogInfoListBox = listItems.OrderByDescending(x => x);
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
log.Error("日志数据绑定异常", ex);
|
|
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 截取物料编码
|
|
public string SubString(string barCode)
|
|
{
|
|
string result = string.Empty;
|
|
if (!string.IsNullOrEmpty(barCode))
|
|
{
|
|
result = barCode.Substring(7, 10);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
#endregion
|
|
|
|
|
|
/// <summary>
|
|
/// 格式化物料类型
|
|
/// </summary>
|
|
/// <param name="materialType"></param>
|
|
/// <returns></returns>
|
|
private string FormatMaterialType(string materialType)
|
|
{
|
|
string result = "";
|
|
System.Text.RegularExpressions.Match match = Regex.Match(materialType, @".*?,(.*?),");
|
|
|
|
if (match.Success && match.Groups.Count > 1)
|
|
{
|
|
result = match.Groups[1].Value;
|
|
}
|
|
else
|
|
{
|
|
result = materialType;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|