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

557 lines
22 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 Aucma.Core.HwPLc;
using Aucma.Core.OldBoxFoam.Business;
using Aucma.Core.OldBoxFoam.Models;
using CommunityToolkit.Mvvm.ComponentModel;
using log4net;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using static NPOI.HSSF.Util.HSSFColor;
/**
* 老发泡线监控
* */
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 readonly IBoxFoamDataRealTimeServices? _boxFoamDataRealTimeServices;
private readonly IBoxFoamDataRealTimeHistoryServices _boxFoamDataRealTimeHistoryServices;
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OldBoxFoamPageViewModel));
System.Timers.Timer timer2 = new System.Timers.Timer(10000);
int totalAmount = 0;
bool flag = true;
private Collection collection = new Collection();
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>();
_boxFoamDataRealTimeServices = App.ServiceProvider.GetService<IBoxFoamDataRealTimeServices>();
_boxFoamDataRecordServices = App.ServiceProvider.GetService<IBoxFoamDataRecordServices>();
_boxFoamDataRealTimeHistoryServices = App.ServiceProvider.GetService<IBoxFoamDataRealTimeHistoryServices>();
//AucamTaskService.RefreshOldBoxFoamDataDelegateEvent += OldBoxFoamOnLoad3;
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.Run(() =>
//{
// Thread.Sleep(1000 * 5);
// collection.startCollect();
//});
}
#region 初始化加载数据
private void OldBoxFoamOnLoad(List<FixtureStatus> prderList)
{
try
{
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)
{
switch (item.Status)
{
case 1:
_statusColor.Add("Yellow");
Console.WriteLine("Yellow");
break;
case 2:
_statusColor.Add("Green");
Console.WriteLine("Green");
break;
case 3:
_statusColor.Add("Red");
Console.WriteLine("Red");
break;
default:
_statusColor.Add("Gray");
Console.WriteLine("Gray");
break;
}
_fixtureName.Add(item.FixtureBoxType);
_production.Add(item.Yield);
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
Semaphore semaphore = new Semaphore(1, 1);
#region 原数据采集方法
/// <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 || Collection.listFixtureStatus.Count == 0) return;
DateTime now = DateTime.Now;
CurrentTeamTime time = await _currentTeamTimeServices.FirstAsync(d => d.StartTime <= now && d.EndTime >= now);
collection.startCollect();
if (time != null)
{
ExecHourData(productLineCode);
}
else
{
ShiftChange(productLineCode);
}
}
catch (Exception ex)
{
log.Error("拆分异常:" + ex.Message);
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);
//可以使用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;
});
await _currentTeamTimeServices.UpdateAsync(currentTeamTime);
if (recordList == null) return;
int result = await _boxFoamDataRecordServices.AddAsync(recordList);
if (result > 0)
{
var obj1 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc1"));
if (obj1 != null) {
if (obj1.plc.IsConnected)
{
obj1.plc.WriteInt16("M216", "1");//换班 数据清空
}
}
var obj2 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc2"));
if (obj2 != null)
{
if (obj2.plc.IsConnected)
{
obj2.plc.WriteInt16("M216", "1");//换班 数据清空
}
}
var obj3 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc3"));
if (obj3 != null)
{
if (obj3.plc.IsConnected)
{
obj3.plc.WriteInt16("M216", "1");//换班 数据清空
}
}
var obj4 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc4"));
if (obj4 != null)
{
if (obj4.plc.IsConnected)
{
obj4.plc.WriteInt16("M216", "1");//换班 数据清空
}
}
//清空 当班计划
await _oldBoxFoamDataServices.UpdateAsync(list);
var planList=_boxFoamPlanServices.QueryAsync().Result;
planList.ForEach(d => { d.ShiftType = 0; });
await _boxFoamPlanServices.UpdateAsync(planList);
}
}
private async void ExecHourData(string productLineCode)
{
try
{
List<FixtureStatus> bList = new List<FixtureStatus>();
var collectionList = Collection.listFixtureStatus;
if (collectionList.Count == 0) return;
OldBoxFoamOnLoad(collectionList);
bList.AddRange(collectionList);
List<BoxFoamData> bfds = await _oldBoxFoamDataServices.QueryAsync();
List<OldBoxFoamType> spaceList = await _oldBoxFoamTypeServices.QueryAsync();
List<BoxFoamPlan> planList = await _boxFoamPlanServices.QueryAsync();
for (int j = 0; j < bList.Count; j++)
{
try
{
OldBoxFoamType space = spaceList.FirstOrDefault(d => d.Boxtype == bList[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 == bList[j].FixtureBoxType && d.MainId == bList[j].ObjId);
if (bfd != null)
{
//更新计划数量
complateAmount = bList[j].Yield - bfd.Production;
UpdateBoxData(bList[j], bfd);
}
else
{
SaveBoxData(productLineCode, bList[j]);
}
plan.CompleteAmount = plan.CompleteAmount + complateAmount;
await _boxFoamPlanServices.UpdateAsync(plan);
}
else
{
//更新小时数据
BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bList[j].FixtureBoxType && d.MainId == bList[j].ObjId);
if (bfd != null)
{
UpdateBoxData(bList[j], bfd);
}
else
{
SaveBoxData(productLineCode, bList[j]);
}
}
}
else
{
//更新小时数据
BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bList[j].FixtureBoxType && d.MainId == bList[j].ObjId);
if (bfd != null)
{
UpdateBoxData(bList[j], bfd);
}
else
{
SaveBoxData(productLineCode, bList[j]);
}
}
}
catch { }
}
}
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;
}
#endregion
}
}