using Admin.Core.IService; using Admin.Core.Model.Model_New; using Admin.Core.Service; using Aucma.Core.OldBoxFoam.Business; using Aucma.Core.OldBoxFoam.Models; using Aucma.Core.OldBoxFoam.Views; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using LiveCharts.Wpf; using LiveCharts; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers; using System.Windows; using Admin.Core.Model; using NPOI.SS.Formula.Functions; using System.Windows.Documents; using static Npgsql.Replication.PgOutput.Messages.RelationMessage; using System.Windows.Media; using log4net; using System.Windows.Forms; using Aucma.Core.HwPLc; using Aucma.Core.PLc; using System.Windows.Input; namespace Aucma.Core.OldBoxFoam.ViewModels { /** * 发泡计划 * * */ public partial class RealRoadPageViewModel : ObservableObject { private readonly log4net.ILog log = LogManager.GetLogger(typeof(RealRoadPageViewModel)); protected readonly IBoxFoamPlanServices? _boxFoamPlanServices; private IOldBoxFoamTypeServices? _oldBoxFoamTypeServices; private IBoxFoamDataServices? _boxFoamDataServices; System.Timers.Timer timer2 = new System.Timers.Timer(3000); public RealRoadPageViewModel() { YAxisLabelFormatter = value => Math.Round(value, 2).ToString(); _boxFoamPlanServices = App.ServiceProvider.GetService(); _oldBoxFoamTypeServices = App.ServiceProvider.GetService(); _boxFoamDataServices = App.ServiceProvider.GetService(); //InitData(); Collection.RefreshSpaceEvent += InitData; } #region 参数定义 private Func _yAxisLabelFormatter; public Func YAxisLabelFormatter { get { return _yAxisLabelFormatter; } set { _yAxisLabelFormatter = value; OnPropertyChanged(nameof(YAxisLabelFormatter)); } } /// /// 小时产量统计图表 /// private SeriesCollection _hourAchievement = new SeriesCollection(); public SeriesCollection HourAchievement { get { return _hourAchievement; } set { _hourAchievement = value; OnPropertyChanged(nameof(HourAchievement)); } } /// /// 小时产量统计图表X轴 /// private List _hourOutPutList; public List HourOutPutList { get { return _hourOutPutList; } set { _hourOutPutList = value; OnPropertyChanged(nameof(HourOutPutList)); } } /// /// 型号统计图表 /// private SeriesCollection _materialTypeAchievement = new SeriesCollection(); public SeriesCollection MaterialTypeAchievement { get { return _materialTypeAchievement; } set { _materialTypeAchievement = value; OnPropertyChanged(nameof(MaterialTypeAchievement)); } } private List _materialTypeOutPutList; public List MaterialTypeOutPutList { get { return _materialTypeOutPutList; } set { _materialTypeOutPutList = value; OnPropertyChanged(nameof(MaterialTypeOutPutList)); } } #endregion #region 原货道信息刷新 Delete By wenjy 2024-01-13 //public async void InitData(object? sender, ElapsedEventArgs e) //{ // List list = await _oldBoxFoamTypeServices.QueryAsync(); // if(list != null) // { // if(list.Count > 0) // { // list = list.OrderBy(x=>x.ObjId).ToList(); // int totalItems = list.Count; // int half = totalItems / 2; // List spaceInfoLeft = list.Take(half).ToList(); // List spaceInfoRight = list.Skip(half).ToList(); // System.Windows.Application.Current.Dispatcher.Invoke((Action)(() => // { // ListItems.Clear(); // if (spaceInfoLeft == null) return; // for (int i = 0; i < spaceInfoLeft.Count; i++) // { // if (i != 1) // { // spaceInfoLeft[i].Local = ""; // } // ListItems.Add(new OldBoxFoamTypeModel() // { // SpaceName = $"{i + 1}#货道", // Local = spaceInfoLeft[i].Local, // Status = spaceInfoLeft[i].Storeamount == 3 ? "1" : "0", // Storeamount = spaceInfoLeft[i].Storeamount > 3 ? 0 : spaceInfoLeft[i].Storeamount, // MaterialCode = spaceInfoLeft[i].MaterialCode, // MaterialName = spaceInfoLeft[i].MaterialName, // Boxtype = spaceInfoLeft[i].Boxtype, // }); // } // if (spaceInfoRight == null) return; // for (int i = 0; i < spaceInfoRight.Count; i++) // { // if (i != 1) // { // spaceInfoRight[i].Local = ""; // } // ListItems.Add(new OldBoxFoamTypeModel() // { // SpaceName = $"{i + 1}#货道", // Local = spaceInfoRight[i].Local, // Status = spaceInfoRight[i].Storeamount == 3 ? "1" : "0", // Storeamount = spaceInfoRight[i].Storeamount > 3 ? 0 : spaceInfoRight[i].Storeamount, // MaterialCode = spaceInfoRight[i].MaterialCode, // MaterialName = spaceInfoRight[i].MaterialName, // Boxtype = spaceInfoRight[i].Boxtype, // }); // } // })); // } // } //} #endregion #region 初始化datagrid private ObservableCollection listItems = new ObservableCollection(); public ObservableCollection ListItems { get { return listItems; } set { listItems = value; OnPropertyChanged();//属性通知 } } #endregion /// /// 更新货道信息 /// /// public async void InitData(List spaceDetailModel, List fixtureStatus) { if (spaceDetailModel == null) return; var spaceList = _oldBoxFoamTypeServices.QueryAsync().Result; List storeList = new List(); foreach (var item in spaceDetailModel) { var space = spaceList.FirstOrDefault(x=>x.ObjId == item.ObjId); if(spaceList != null) { if(spaceDetailModel.Count > 0) { var spaceInfo = space; spaceInfo.Storeamount = item.StoreAmount; spaceInfo.Boxtype = item.StoreType; storeList.Add(spaceInfo); //_oldBoxFoamTypeServices.UpdateAsync(spaceInfo); } } } if (storeList!=null&&storeList.Count>0) { await _oldBoxFoamTypeServices.UpdateAsync(storeList); } RefreshSpaceInfoDataGrid(spaceDetailModel, fixtureStatus); RefreshHourOutPutChart(); RefreshMaterialTypeChart(); } private void RefreshSpaceInfoDataGrid(List spaceDetailModel, List fixtureStatus) { try { if (spaceDetailModel != null) { if (spaceDetailModel.Count > 0) { spaceDetailModel = spaceDetailModel.OrderBy(x => x.ObjId).ToList(); int totalItems = spaceDetailModel.Count; int half = totalItems / 2; List spaceInfoLeft = spaceDetailModel.Take(half).ToList(); List spaceInfoRight = spaceDetailModel.Skip(half).ToList(); List list = _oldBoxFoamTypeServices.QueryAsync().Result; System.Windows.Application.Current.Dispatcher.Invoke((Action)(() => { ListItems.Clear(); if (spaceInfoLeft == null) return; for (int i = 0; i < spaceInfoLeft.Count; i++) { var spaceInfo = list.Where(x => x.ObjId == spaceInfoLeft[i].ObjId).ToList().First(); if (i != 1) { spaceInfo.Local = ""; } var boxType = spaceInfo.Boxtype; int fixtureAmount = fixtureStatus.Where(x => x.FixtureBoxType == boxType && x.Status != 3 && x.Status != 0).ToList().Count(); ListItems.Add(new OldBoxFoamTypeModel() { ObjId = spaceInfoLeft[i].ObjId, SpaceName = $"{i + 1}#货道", Local = spaceInfo.Local, Status = spaceInfoLeft[i].StoreAmount == 3 ? "1" : "0", Storeamount = spaceInfoLeft[i].StoreAmount > 3 ? 0 : spaceInfoLeft[i].StoreAmount, MaterialCode = spaceInfo.MaterialCode, MaterialName = spaceInfo.MaterialName, Boxtype = spaceInfoLeft[i].StoreType, QualityResult = fixtureAmount, }); } if (spaceInfoRight == null) return; for (int i = 0; i < spaceInfoRight.Count; i++) { var spaceInfo = list.Where(x => x.ObjId == spaceInfoRight[i].ObjId).ToList().First(); if (i != 1) { spaceInfo.Local = ""; } var boxType = spaceInfo.Boxtype; int fixtureAmount = fixtureStatus.Where(x => x.FixtureBoxType == boxType && x.Status != 3 && x.Status != 0).ToList().Count(); ListItems.Add(new OldBoxFoamTypeModel() { ObjId = spaceInfoRight[i].ObjId, SpaceName = $"{i + 1}#货道", Local = spaceInfo.Local, Status = spaceInfoRight[i].StoreAmount == 3 ? "1" : "0", Storeamount = spaceInfoRight[i].StoreAmount > 3 ? 0 : spaceInfoRight[i].StoreAmount, MaterialCode = spaceInfo.MaterialCode, MaterialName = spaceInfo.MaterialName, Boxtype = spaceInfoRight[i].StoreType, QualityResult = fixtureAmount, }); } })); } } }catch(Exception ex) { log.Error($"货道信息列表刷新异常:{ex.Message}"); } } /// /// 小时统计图表 /// private void RefreshHourOutPutChart() { try { ChartValues hourAchievement = new ChartValues(); HourOutPutList = new List(); App.Current.Dispatcher.BeginInvoke((Action)(() => { DateTime now = DateTime.Now; // 判断当前是否是白班时间段 if (now.Hour >= 8 && now.Hour < 20) { HourOutPutList = new List() { "8:00", "9:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00" }; } else { HourOutPutList = new List() { "20:00", "21:00", "22:00", "23:00", "00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "0:007" }; } var hourFoamDataList = _boxFoamDataServices.Query(x => x.ProductLineCode == "CX_01" && x.StationCode == "1105"); List hours = new List(); if (hourFoamDataList != null) { hourAchievement.Add(hourFoamDataList.Sum(x => x.AnHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.TwoHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.ThreeHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.FourHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.FiveHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.SixHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.SevenHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.EightHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.NineHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.TenHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.ElevenHour)); hourAchievement.Add(hourFoamDataList.Sum(x => x.TwelveHour)); } var shellColumn = new ColumnSeries(); shellColumn.DataLabels = true; shellColumn.Title = "小时产量"; shellColumn.Values = hourAchievement; shellColumn.Foreground = Brushes.White; if (HourAchievement.Count > 0) { for (int i = 0; i < hourAchievement.Count; i++) { //hours HourAchievement.FirstOrDefault().Values[i] = hourAchievement.ElementAt(i); } } else { HourAchievement.Add(shellColumn); } })); }catch(Exception ex) { log.Error($"小时统计图表刷新异常:{ex.Message}"); } } /// /// 型号统计图表 /// private void RefreshMaterialTypeChart() { try { ChartValues materialTypeAchievement = new ChartValues(); MaterialTypeOutPutList = new List(); App.Current.Dispatcher.BeginInvoke((Action)(() => { DateTime now = DateTime.Now; var hourFoamDataList = _boxFoamDataServices.Query(x => x.ProductLineCode == "CX_01" && x.StationCode == "1105"); if (hourFoamDataList != null) { var grouped = hourFoamDataList.GroupBy(x => x.Fixtureboxtype); foreach (var item in grouped) { var flattenedList = item.SelectMany(p => new[] { p.AnHour, p.TwoHour, p.ThreeHour, p.FourHour, p.FiveHour, p.SixHour, p.SevenHour, p.EightHour, p.NineHour, p.TenHour, p.ElevenHour, p.TwelveHour }).ToList(); MaterialTypeOutPutList.Add(item.Key); materialTypeAchievement.Add(flattenedList.Sum()); } } var shellColumn = new ColumnSeries(); shellColumn.DataLabels = true; shellColumn.Title = "型号统计"; shellColumn.Values = materialTypeAchievement; shellColumn.Foreground = Brushes.White; if (MaterialTypeAchievement.Count > 0) { for (int i = 0; i < materialTypeAchievement.Count; i++) { MaterialTypeAchievement.FirstOrDefault().Values[i] = materialTypeAchievement.ElementAt(i); } } else { MaterialTypeAchievement.Add(shellColumn); } })); }catch(Exception ex) { log.Error($"型号统计图表刷新异常:{ex.Message}"); } } private OldBoxFoamTypeModel selectedDataItem; public OldBoxFoamTypeModel SelectedDataItem { get => selectedDataItem; set => SetProperty(ref selectedDataItem, value); } /// /// 设置夹具箱型 /// /// public void BoxTypeClick(object obj) { var info = SelectedDataItem as OldBoxFoamTypeModel; if (info != null) { SetBoxTypeView setBoxTypeView = new SetBoxTypeView(info.Boxtype); setBoxTypeView.ShowDialog(); if(setBoxTypeView.boxTypeResult != info.Boxtype) { if (!string.IsNullOrEmpty(setBoxTypeView.boxTypeResult)) { HwPLc.PlcModel plc = null; //下发给PLC var address = GetSpaceBoxTypeAddress(Convert.ToInt32(info.ObjId)); if (info.ObjId <= 4) { plc = HwPLc.PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc1")); } else { plc = HwPLc.PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc3")); } if(plc != null) { bool isFlag = plc.plc.WriteInt16(address, setBoxTypeView.boxTypeResult); if (isFlag) { System.Windows.MessageBox.Show("货道型号设置成功"); } else { System.Windows.MessageBox.Show("货道型号设置失败"); } } } } } } private string GetSpaceBoxTypeAddress(int spaceCode) { string address = string.Empty; switch(spaceCode) { case 1: address = "D2010"; break; case 2: address = "D2020"; break; case 3: address = "D2030"; break; case 4: address = "D2040"; break; case 5: address = "D2010"; break; case 6: address = "D2020"; break; case 7: address = "D2030"; break; case 8: address = "D2040"; break; } return address; } /// /// 设置夹具箱型 /// /// public void MaterialCodeClick(object obj) { var info = SelectedDataItem as OldBoxFoamTypeModel; if (info != null) { //SelectType selectType = new SelectType(info.ObjId.ToString(),info.Boxtype); //selectType.ShowDialog(); SplitPlanView splitPlanView = new SplitPlanView("1", 1, info.Boxtype,info.ObjId.ToString()); splitPlanView.ShowDialog(); } } } }