using HighWayIot.Log4net;
using HighWayIot.Repository.domain;
using HighWayIot.Repository.service;
using HighWayIot.Winform.Business;
using HighWayIot.Winform.UserControlPages.MonitorMainPages;
using Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Timer = System.Threading.Timer;
namespace HighWayIot.Winform.UserControlPages
{
public partial class MonitorMainPage : UserControl
{
LogHelper logHelper = LogHelper.Instance;
///
/// 班次服务类
///
private SysShiftTimeService _shiftTimeService = SysShiftTimeService.Instance;
///
/// 报表服务类
///
private ZxDailyReportService _zxDailyReportService = ZxDailyReportService.Instance;
///
/// datagridview 数据源
/// 必须使用BindingList, 如果使用LIST,无法实现更改,添加、删除数据源自动更新datagridview
///
//private BindingList _monitorDataSources = new BindingList();
private List _monitorDataSources = new List();
///
/// 白班开始时间
///
private DateTime DayStartTime;
///
/// 白班结束时间
///
private DateTime DayEndTine;
///
/// 夜班开始时间
///
private DateTime NightStartTime;
///
/// 夜班结束时间
///
private DateTime NightEndTime;
///
/// 上次白班开始时间
///
private DateTime LastDayStartTime;
///
/// 上次夜班结束时间
///
private DateTime LastNightEndTime;
public static Action MonitorRefreshAction;
///
/// 前端刷新锁
///
private static readonly object GridRefreshLocker = new object();
public MonitorMainPage()
{
InitializeComponent();
MonitorDataGridView.AutoGenerateColumns = false;
DateTimeRefresh();
MonitorRefreshAction += BindData;
MonitorRefreshAction.Invoke();
}
///
/// TImer事件
///
///
///
private void DataRefresh_Tick(object sender, EventArgs e)
{
if (DateTime.Now.Second == 0)
{
DateTimeRefresh();
}
}
///
/// 白夜班时间,现在时间控件刷新
///
private void DateTimeRefresh()
{
var timeList = _shiftTimeService.GetShiftInfos();
var morningShift = timeList.Where(x => x.ShiftName == "早").FirstOrDefault();
var midShift = timeList.Where(x => x.ShiftName == "中").FirstOrDefault();
var nightShift = timeList.Where(x => x.ShiftName == "夜").FirstOrDefault();
if (morningShift == null || midShift == null || nightShift == null)
{
logHelper.Error("检查班次数据库是否早中夜班配置齐全!");
return;
}
DateTime Today = DateTime.Now.Date;
var startArray = morningShift.ShiftStartTime.Split(':');
var endArray = midShift.ShiftEndTime.Split(':');
if (startArray.Length != 3 || endArray.Length != 3)
{
return;
}
TimeSpan StartTime = new TimeSpan(Convert.ToInt32(startArray[0]), Convert.ToInt32(startArray[1]), Convert.ToInt32(startArray[2]));
TimeSpan EndTime = new TimeSpan(Convert.ToInt32(endArray[0]), Convert.ToInt32(endArray[1]), Convert.ToInt32(endArray[2]));
if (DateTime.Now.TimeOfDay > StartTime && DateTime.Now.TimeOfDay < EndTime)
{//白班
DayStartTime = DateTime.Now.Date + StartTime;
DayEndTine = DateTime.Now.Date + EndTime;
NightStartTime = DateTime.Now.Date - TimeSpan.FromDays(1) + EndTime;
NightEndTime = DateTime.Now.Date + StartTime;
LastDayStartTime = DateTime.Today - TimeSpan.FromDays(1) + StartTime;
LastNightEndTime = DateTime.Today + StartTime;
DayProductNumTextBox.BackColor = Color.LightGreen;
NightProductNumTextBox.BackColor = Color.LightGray;
}
else
{//夜班
DayProductNumTextBox.BackColor = Color.LightGray;
NightProductNumTextBox.BackColor = Color.LightGreen;
if (DateTime.Now.TimeOfDay < StartTime) //前半夜
{
DayStartTime = DateTime.Now.Date + StartTime;
DayEndTine = DateTime.Now.Date + EndTime;
NightStartTime = DateTime.Now.Date + EndTime;
NightEndTime = DateTime.Now + TimeSpan.FromDays(1) + StartTime;
LastDayStartTime = DateTime.Today - TimeSpan.FromDays(1) + StartTime;
LastNightEndTime = DateTime.Today + StartTime;
}
else if (DateTime.Now.TimeOfDay > EndTime) //后半夜
{
DayStartTime = DateTime.Now.Date - TimeSpan.FromDays(1) + StartTime;
DayEndTine = DateTime.Now.Date - TimeSpan.FromDays(1) + EndTime;
NightStartTime = DateTime.Now.Date - TimeSpan.FromDays(1) + EndTime;
NightEndTime = DateTime.Now + StartTime;
LastDayStartTime = DateTime.Today - TimeSpan.FromDays(2) + StartTime;
LastNightEndTime = DateTime.Today - TimeSpan.FromDays(1) + StartTime;
}
}
string dayString = morningShift.ShiftStartTime.Substring(0, 5) + "-" + midShift.ShiftEndTime.Substring(0, 5);
string nightString = nightShift.ShiftStartTime.Substring(0, 5) + "-" + nightShift.ShiftEndTime.Substring(0, 5);
DayTimeLabel.Text = dayString;
NightTimeLabel.Text = nightString;
NowDateProductNumLabel.Text = (DateTime.Now - TimeSpan.FromDays(1)).ToString("MM 月 dd 日 产量");
}
///
/// 数据刷新
///
private void BindData()
{
lock (GridRefreshLocker)
{
try
{
//取出近两日的报表数据
List dailyEntity = _zxDailyReportService.GetDailyReportInfos();
_monitorDataSources.Clear();
if (dailyEntity == null)
{
return;
}
int showCount = 0;
if (dailyEntity.Count >= 50)
{
showCount = 50;
}
else
{
showCount = dailyEntity.Count;
}
for (int i = 0; i < showCount; i++)
{
_monitorDataSources.Add(new MonitorDataSource()
{
No = i + 1,
VulcanizationNo = dailyEntity[i].VulcanizationNo ?? "",
StartTime = dailyEntity[i].StartTime.ToString("HH:mm:ss"),
RecipeName = dailyEntity[i].RecipeName ?? "",
RecipeCode = dailyEntity[i].RecipeCode ?? "",
SpecCode = dailyEntity[i].SpecCode ?? "",
DeviceNo = (dailyEntity[i].DeviceNo ?? 0).ToString(),
StandardWeight = dailyEntity[i].StandardWeight ?? 0,
RawTireWeight = dailyEntity[i].RawTireWeight ?? 0,
BaseRubTimeSpan = GeneralUtils.DateTimeToString(dailyEntity[i].StartTime, dailyEntity[i].BaseEndTime),
MidRubTimeSpan = GeneralUtils.DateTimeToString(dailyEntity[i].StartTime, dailyEntity[i].MidEndTime),
FaceRubTimeSpan = GeneralUtils.DateTimeToString(dailyEntity[i].StartTime, dailyEntity[i].FaceEndTime),
RepeatWeight = dailyEntity[i].RepeatWeight ?? 0,
IsDone = dailyEntity[i].IsDone == 1 ? "已完成" : "未完成"
});
}
MonitorDataGridView.DataSource = null;
MonitorDataGridView.DataSource = _monitorDataSources;
MonitorDataGridView.CellFormatting += MonitorDataGridView_CellFormatting;
int daycount = dailyEntity.Count(x => x.StartTime >= DayStartTime && x.StartTime <= DayEndTine && x.IsDone == 1);
DayProductNumTextBox.Text = daycount.ToString();
int nightcount = dailyEntity.Count(x => x.StartTime >= NightStartTime && x.StartTime <= NightEndTime && x.IsDone == 1);
NightProductNumTextBox.Text = nightcount.ToString();
NowDateProductNumTextBox.Text = dailyEntity.Count(x => x.StartTime >= LastDayStartTime && x.StartTime <= LastNightEndTime).ToString();
ZxDailyReportEntity first = dailyEntity.FirstOrDefault();
if (first == null)
{
return;
}
RecipeCodeLabel.Text = first.RecipeCode;
SpecCodeLabel.Text = first.SpecCode;
RecipeNameLabel.Text = first.RecipeName;
ZxRecipeEntity recipeEntity = ZxRecipeService.Instance.GetRecipeInfosByRecipeCode(first.RecipeCode).FirstOrDefault();
if (recipeEntity != null)
{
//SpecNameLabel.Text = recipeEntity.RecipeName;
ZxRecipeParaEntity paraEntity = ZxRecipeParaService.Instance.GetRecipeParaInfoByRecipeCode(recipeEntity.RecipeCode).FirstOrDefault();
if (paraEntity != null)
{
RawTireWeightLabel.Text = paraEntity.TireWeight.ToString();
}
}
RgvNoLabel.Text = first.DeviceNo.ToString();
}
catch(Exception ex)
{
}
}
}
///
/// 单元格格式回调方法
///
///
///
private void MonitorDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
// 确保是针对 "IsDone" 列的操作
try
{
if (MonitorDataGridView.Columns[e.ColumnIndex].Name == "IsDone" && e.RowIndex >= 0)
{
var cell = MonitorDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
string status = cell.Value?.ToString();
if (status == "已完成")
{
cell.Style.BackColor = Color.LightGreen; // 绿色
}
else if (status == "未完成")
{
cell.Style.BackColor = Color.Yellow; // 黄色
}
else
{
cell.Style.BackColor = Color.Transparent;
}
}
}
catch
{
}
}
///
/// 滚动文本框双击事件
///
///
///
private void MoveText_DoubleClick(object sender, EventArgs e)
{
ScrollTextSetForm form = new ScrollTextSetForm();
if (form.ShowDialog() == DialogResult.OK)
{
MoveText.Text = form.OutValue;
}
}
private void MonitorDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
lock (GridRefreshLocker)
{
MonitorDataGridView.DataSource = null;
MonitorDataGridView.DataSource = _monitorDataSources;
}
}
}
}