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.
AUCMA_SCADA/Aucma.Core.OldBoxFoam/ViewModels/OldBoxFoamPageViewModel.cs

543 lines
21 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Model.Model_New;
using Admin.Core.Model.ViewModels;
using Admin.Core.Service;
using Admin.Core.Tasks;
using Aucma.Core.HwPLc;
using Aucma.Core.OldBoxFoam.Business;
using Aucma.Core.OldBoxFoam.Models;
using Aucma.Core.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using log4net;
using Microsoft.Extensions.DependencyInjection;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Documents;
/**
* 老发泡线监控
* */
namespace Aucma.Core.OldBoxFoam.ViewModels
{
public partial class OldBoxFoamPageViewModel : ObservableObject
{
IBoxFoamDataServices? _oldBoxFoamDataServices;
IOldBoxFoamTypeServices _oldBoxFoamTypeServices;
private readonly IBoxFoamPlanServices _boxFoamPlanServices;
private readonly ISysUserInfoServices _sysUserInfoServices;
private readonly ICurrentTeamTimeServices _currentTeamTimeServices;
private readonly IBoxFoamDataRecordServices _boxFoamDataRecordServices;
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OldBoxFoamPageViewModel));
Collection collection = new Collection();
System.Timers.Timer timer2 = new System.Timers.Timer(3000);
int totalAmount = 0;
bool flag = true;
public OldBoxFoamPageViewModel() {
_oldBoxFoamDataServices = App.ServiceProvider.GetService<IBoxFoamDataServices>();
_oldBoxFoamTypeServices = App.ServiceProvider.GetService<IOldBoxFoamTypeServices>();
_boxFoamPlanServices = App.ServiceProvider.GetService<IBoxFoamPlanServices>();
_sysUserInfoServices = App.ServiceProvider.GetService<ISysUserInfoServices>();
_currentTeamTimeServices = App.ServiceProvider.GetService<ICurrentTeamTimeServices>();
// _currentTeamTimeServices = App.ServiceProvider.GetService<ICurrentTeamTimeServices>();
_boxFoamDataRecordServices = App.ServiceProvider.GetService<IBoxFoamDataRecordServices>();
//AucamTaskService.RefreshOldBoxFoamDataDelegateEvent += OldBoxFoamOnLoad3;
//timer1.Elapsed += new System.Timers.ElapsedEventHandler(OldBoxFoamOnLoad); //到达时间的时候执行事件;
//timer1.AutoReset = true;//设置是执行一次false还是一直执行(true)
//timer1.Enabled = true;//需要调用 timer.Start()或者timer.Enabled = true来启动它
//timer1.Start();//timer.Start()的内部原理还是设置timer.Enabled = true;
timer2.Elapsed += new System.Timers.ElapsedEventHandler(RealTimeFoamingTask); //到达时间的时候执行事件;
timer2.AutoReset = true;//设置是执行一次false还是一直执行(true)
timer2.Enabled = true;//需要调用 timer.Start()或者timer.Enabled = true来启动它
timer2.Start();//timer.Start()的内部原理还是设置timer.Enabled = true;
//Task.WaitAll(OldBoxFoamOnLoad3());
}
#region 初始化加载数据
private void OldBoxFoamOnLoad(List<FixtureStatus> prderList)
{
try
{
//collection.startCollect();
///if (collection.listFixtureStatus == null) return;
//var prderList= collection.listFixtureStatus;
int num = prderList.Sum(d => d.Yield);
if (prderList.Count==0) return;
totalAmount = 0;
_fixtureName.Clear();
_production.Clear();
_beat.Clear();
_statusColor.Clear();
foreach (var item in prderList)
{
if (item.Status == 2)//生产
{
_statusColor.Add("green");
}
else
{
_statusColor.Add("red");
}
_fixtureName.Add(item.FixtureBoxType);
_production.Add(item.Yield);
//_beat.Add(item.BoxBeat);
totalAmount = totalAmount + item.Yield;
}
Totle = totalAmount.ToString();
}
catch (Exception ex)
{
log.Error("获取库存接口数据异常." + ex.Message);
}
}
public async Task OldBoxFoamOnLoad3()
{
try
{
collection.startCollect();
if (collection.listFixtureStatus == null) return;
var prderList = collection.listFixtureStatus;
int num = prderList.Sum(d => d.Yield);
if (prderList.Count==0) return;
totalAmount = 0;
_fixtureName.Clear();
_production.Clear();
_beat.Clear();
_statusColor.Clear();
foreach (var item in prderList)
{
if (item.Status == 1)//生产
{
_statusColor.Add("green");
}
else
{
_statusColor.Add("red");
}
_fixtureName.Add(item.FixtureBoxType);
_production.Add(item.Yield);
//_beat.Add(item.BoxBeat);
totalAmount = totalAmount + item.Yield;
}
Totle = totalAmount.ToString();
}
catch (Exception ex)
{
log.Error("获取库存接口数据异常." + ex.Message);
}
}
public async Task OldBoxFoamTypeOnLoad()
{
var list =await _oldBoxFoamTypeServices.QueryAsync();
if (list == null) return;
foreach (var item in list)
{
OldBoxFoamTypeModel model = new OldBoxFoamTypeModel();
model.ObjId = item.ObjId;
model.Local = item.Local;
model.Boxtype = item.Boxtype;
model.Storeamount = item.Storeamount;
_oldBoxFoamTypeDataGrid.Add(model);
}
}
public Task OldBoxFoamTypeOnLoad3(List<OldBoxFoamType> list)
{
if (list == null) return Task.CompletedTask;
System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
{
OldBoxFoamTypeDataGrid.Clear();
foreach (var item in list)
{
OldBoxFoamTypeModel model = new OldBoxFoamTypeModel();
model.ObjId = item.ObjId;
model.Local = item.Local;
model.Boxtype = item.Boxtype;
model.Storeamount = item.Storeamount;
OldBoxFoamTypeDataGrid.Add(model);
}
}));
return Task.CompletedTask;
}
#endregion
#region 初始化发泡线 datagrid
private ObservableCollection<OldBoxFoamDataModel> _oldBoxFoamDataGrid = new ObservableCollection<OldBoxFoamDataModel>();
public ObservableCollection<OldBoxFoamDataModel> OldBoxFoamDataGrid
{
get => _oldBoxFoamDataGrid;
set => SetProperty(ref _oldBoxFoamDataGrid, value);
}
#endregion
#region 初始化泡前库 datagrid
private ObservableCollection<OldBoxFoamTypeModel> _oldBoxFoamTypeDataGrid = new ObservableCollection<OldBoxFoamTypeModel>();
public ObservableCollection<OldBoxFoamTypeModel> OldBoxFoamTypeDataGrid
{
get => _oldBoxFoamTypeDataGrid;
set => SetProperty(ref _oldBoxFoamTypeDataGrid, value);
}
#endregion
#region 夹具状态
private ObservableCollection<string> _statusColor = new ObservableCollection<string>();
public ObservableCollection<string> StatusColor
{
get => _statusColor;
set => SetProperty(ref _statusColor, value);
}
#endregion
#region 夹具名称
private ObservableCollection<string> _fixtureName = new ObservableCollection<string>();
public ObservableCollection<string> FixtureName
{
get => _fixtureName;
set => SetProperty(ref _fixtureName, value);
}
#endregion
#region 夹具产量
/// <summary>
///夹具产量
/// </summary>
private ObservableCollection<int> _production = new ObservableCollection<int>();
public ObservableCollection<int> Production
{
get => _production;
set => SetProperty(ref _production, value);
}
#endregion
#region 节拍
/// <summary>
///夹具产量
/// </summary>
private ObservableCollection<int> _beat = new ObservableCollection<int>();
public ObservableCollection<int> Beat
{
get => _beat;
set => SetProperty(ref _beat, value);
}
#endregion
#region 总计
private string _totle;
public string Totle
{
get => _totle;
set => SetProperty(ref _totle, value);
}
#endregion
/// <summary>
/// 将采集到的数据保存
/// </summary>
/// <param name="mode"></param>
public async void RealTimeFoamingTask(object? sender, ElapsedEventArgs e)
{
semaphore.WaitOne();
try
{
string productLineCode = Appsettings.app("StationInfo", "ProductLineCode");
if (collection.listFixtureStatus == null) return;
DateTime now = DateTime.Now;
CurrentTeamTime time = await _currentTeamTimeServices.FirstAsync(d => d.StartTime <= now && d.EndTime >= now);
if (time != null)
{
ExecHourData(productLineCode);
}
else
{
ShiftChange(productLineCode);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
semaphore.Release();
}
}
private async void ShiftChange(string productLineCode)
{
//切换班组计划
var list = await _oldBoxFoamDataServices.QueryAsync(d => d.ProductLineCode == productLineCode);
List<BoxFoamDataRecord> recordList = new List<BoxFoamDataRecord>();
var currentTeamTimeList = await _sysUserInfoServices.GetTeamData();
if (currentTeamTimeList.Count == 0) return;
//更新计划表操作
CurrentTeamTime currentTeamTime = await _currentTeamTimeServices.FirstAsync();
currentTeamTime.TeamName = currentTeamTimeList.FirstOrDefault().TeamName;
currentTeamTime.StartTime = currentTeamTimeList.Min(d => d.StartTime);
currentTeamTime.EndTime = currentTeamTimeList.Max(d => d.EndTime);
await _currentTeamTimeServices.UpdateAsync(currentTeamTime);
//可以使用Mapping 映射
list.ForEach(d =>
{
BoxFoamDataRecord record = new BoxFoamDataRecord();
record.OrderCode = d.OrderCode;
record.ProductLineCode = d.ProductLineCode;
record.Fixturestatus = d.Production;
record.CuringTimeSettingValue = d.CuringTimeSettingValue;
record.ActualValue = d.ActualValue;
record.AnHour = d.AnHour;
record.TwoHour = d.TwoHour;
record.ThreeHour = d.ThreeHour;
record.FourHour = d.FourHour;
record.FiveHour = d.FiveHour;
record.SixHour = d.SixHour;
record.SevenHour = d.SevenHour;
record.EightHour = d.EightHour;
record.NineHour = d.NineHour;
record.TenHour = d.TenHour;
record.ElevenHour = d.ElevenHour;
record.TwelveHour = d.TwelveHour;
record.BoxFixturesideplate = d.BoxFixturesideplate;
record.BoxClosebetatemperature = d.BoxClosebetatemperature;
record.BoxBeat = d.BoxBeat;
record.CreateTime = DateTime.Now;
});
int result = await _boxFoamDataRecordServices.AddAsync(recordList);
if (result > 0)
{
var obj2 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc1"));
if (obj2 == null) { return; }
//obj2.plc.WriteInt16("M216", "1");//换班 数据清空
//清空 当班计划
await _oldBoxFoamDataServices.DeletesAsync(list);
}
}
Semaphore semaphore = new Semaphore(1, 1);
private async void ExecHourData(string productLineCode)
{
try
{
List<FixtureStatus> bLis = new List<FixtureStatus>();
collection.startCollect();
bLis = collection.listFixtureStatus;
if (bLis.Count == 0) return;
List<BoxFoamData> bfds = await _oldBoxFoamDataServices.QueryAsync();
List<OldBoxFoamType> spaceList = await _oldBoxFoamTypeServices.QueryAsync();
List<BoxFoamPlan> planList = await _boxFoamPlanServices.QueryAsync();
for (int j = 0; j < bLis.Count; j++)
{
try
{
OldBoxFoamType space = spaceList.FirstOrDefault(d => d.Boxtype == bLis[j].FixtureBoxType);
//根据夹具找货道,根据货道找物料
if (space != null)
{
BoxFoamPlan plan = planList.FirstOrDefault(d => d.MaterialCode == space.MaterialCode && d.PlanAmount > d.CompleteAmount);
if (plan != null)
{
int complateAmount = 0;
//更新小时数据
BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bLis[j].FixtureBoxType && d.MainId == bLis[j].ObjId);
if (bfd != null)
{
//更新计划数量
complateAmount = bLis[j].Yield - bfd.Production;
UpdateBoxData(bLis[j], bfd);
}
else
{
SaveBoxData(productLineCode, bLis[j]);
}
plan.CompleteAmount = plan.CompleteAmount + complateAmount;
await _boxFoamPlanServices.UpdateAsync(plan);
}
else
{
//更新小时数据
BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bLis[j].FixtureBoxType && d.MainId == bLis[j].ObjId);
if (bfd != null)
{
UpdateBoxData(bLis[j], bfd);
}
else
{
SaveBoxData(productLineCode, bLis[j]);
}
}
}
else
{
//更新小时数据
//List<BoxFoamData> bfd = await _oldBoxFoamDataServices.QueryAsync(d => d.Fixtureboxtype == bLis[j].FixtureBoxType && d.MainId == bLis[j].ObjId);
BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bLis[j].FixtureBoxType && d.MainId == bLis[j].ObjId);
if (bfd != null)
{
UpdateBoxData(bLis[j], bfd);
}
else
{
SaveBoxData(productLineCode, bLis[j]);
}
}
}
catch { }
}
OldBoxFoamOnLoad(bLis);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private async void UpdateBoxData(FixtureStatus item, BoxFoamData bfd)
{
int hour = GetTeamHour(DateTime.Now).Seq;
switch (hour)
{
case 1:
bfd.AnHour = item.Yield - bfd.Production;
break;
case 2:
bfd.TwoHour = item.Yield - bfd.Production;
break;
case 3:
bfd.ThreeHour = item.Yield - bfd.Production;
break;
case 4:
bfd.FourHour = item.Yield - bfd.Production;
break;
case 5:
bfd.FiveHour = item.Yield - bfd.Production;
break;
case 6:
bfd.SixHour = item.Yield - bfd.Production;
break;
case 7:
bfd.SevenHour = item.Yield - bfd.Production;
break;
case 8:
bfd.EightHour = item.Yield - bfd.Production;
break;
case 9:
bfd.NineHour = item.Yield - bfd.Production;
break;
case 10:
bfd.TenHour = item.Yield - bfd.Production;
break;
case 11:
bfd.ElevenHour = item.Yield - bfd.Production;
break;
case 12:
bfd.TwelveHour = item.Yield - bfd.Production;
break;
default:
break;
}
bfd.Production = item.Yield;
await _oldBoxFoamDataServices.UpdateAsync(bfd);
}
private async void SaveBoxData(string productLineCode, FixtureStatus item)
{
BoxFoamData bfdata = new BoxFoamData();
bfdata.MainId = item.ObjId;
bfdata.ProductLineCode = productLineCode;
bfdata.Fixtureboxtype = item.FixtureBoxType;
bfdata.Fixturestatus = item.Status;
bfdata.Production = item.Yield;
bfdata.CuringTimeSettingValue = item.PlanCuringTime.ToString();
bfdata.ActualValue = item.RealCuringTime.ToString();
int hour = GetTeamHour(DateTime.Now).Seq;
switch (hour)
{
case 1:
bfdata.AnHour = item.Yield = bfdata.Production;
break;
case 2:
bfdata.TwoHour = item.Yield = bfdata.Production;
break;
case 3:
bfdata.ThreeHour = item.Yield = bfdata.Production;
break;
case 4:
bfdata.FourHour = item.Yield = bfdata.Production;
break;
case 5:
bfdata.FiveHour = item.Yield = bfdata.Production;
break;
case 6:
bfdata.SixHour = item.Yield = bfdata.Production;
break;
case 7:
bfdata.SevenHour = item.Yield = bfdata.Production;
break;
case 8:
bfdata.EightHour = item.Yield = bfdata.Production;
break;
case 9:
bfdata.NineHour = item.Yield = bfdata.Production;
break;
case 10:
bfdata.TenHour = item.Yield = bfdata.Production;
break;
case 11:
bfdata.ElevenHour = item.Yield = bfdata.Production;
break;
case 12:
bfdata.TwelveHour = item.Yield = bfdata.Production;
break;
default:
break;
}
bfdata.MainId = item.ObjId;
await _oldBoxFoamDataServices.AddAsync(bfdata);
}
public CurrentTeamTimeView GetTeamHour()
{
DateTime now = DateTime.Now;
var list = _sysUserInfoServices.GetTeamData().Result;
if (list != null)
{
//var obj = list.FirstOrDefault().EndTime.ToString("HH:mm");
var view = list.FirstOrDefault();
return view;
}
return null;
}
public CurrentTeamTimeView GetTeamHour(DateTime now)
{
var obj = _sysUserInfoServices.GetTeamData(now).Result;
if (obj != null)
{
return obj;
}
return null;
}
}
}