|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using Haoliang.Models.Device;
|
|
|
|
|
|
namespace Haoliang.Models.Production
|
|
|
{
|
|
|
public class ProductionRecord
|
|
|
{
|
|
|
public int Id { get; set; }
|
|
|
public int DeviceId { get; set; }
|
|
|
public string NCProgram { get; set; }
|
|
|
public DateTime ProductionDate { get; set; }
|
|
|
public int Quantity { get; set; }
|
|
|
public decimal QualityRate { get; set; }
|
|
|
public DateTime? StartTime { get; set; }
|
|
|
public DateTime? EndTime { get; set; }
|
|
|
public int? OperatorId { get; set; }
|
|
|
public DateTime CreatedAt { get; set; }
|
|
|
}
|
|
|
|
|
|
public class ProgramProductionSummary
|
|
|
{
|
|
|
public int Id { get; set; }
|
|
|
public int DeviceId { get; set; }
|
|
|
public string NCProgram { get; set; }
|
|
|
public DateTime ProductionDate { get; set; }
|
|
|
public int TotalQuantity { get; set; }
|
|
|
public int ValidQuantity { get; set; }
|
|
|
public int InvalidQuantity { get; set; }
|
|
|
public decimal QualityRate { get; set; }
|
|
|
}
|
|
|
|
|
|
public class ProductionStatistics
|
|
|
{
|
|
|
public DateTime Date { get; set; }
|
|
|
public int DeviceId { get; set; }
|
|
|
public string DeviceName { get; set; }
|
|
|
public string NCProgram { get; set; }
|
|
|
public int TotalQuantity { get; set; }
|
|
|
public int ValidQuantity { get; set; }
|
|
|
public int InvalidQuantity { get; set; }
|
|
|
public decimal QualityRate { get; set; }
|
|
|
}
|
|
|
|
|
|
public class ProductionRealtimeData
|
|
|
{
|
|
|
public int DeviceId { get; set; }
|
|
|
public string DeviceCode { get; set; }
|
|
|
public string DeviceName { get; set; }
|
|
|
public string Status { get; set; }
|
|
|
public bool IsRunning { get; set; }
|
|
|
public string NCProgram { get; set; }
|
|
|
public int CurrentCount { get; set; }
|
|
|
public int TodayQuantity { get; set; }
|
|
|
public DateTime LastUpdateTime { get; set; }
|
|
|
}
|
|
|
|
|
|
public class ProductionCalculator
|
|
|
{
|
|
|
public static int CalculateProduction(DeviceCurrentStatus current, DeviceCurrentStatus last)
|
|
|
{
|
|
|
// 同一程序连续加工
|
|
|
if (current.NCProgram == last.NCProgram)
|
|
|
{
|
|
|
int diff = current.CumulativeCount - last.CumulativeCount;
|
|
|
return Math.Max(0, diff); // 异常值保护,避免负数
|
|
|
}
|
|
|
|
|
|
// 程序切换逻辑
|
|
|
return CalculateProgramSwitchProduction(current, last);
|
|
|
}
|
|
|
|
|
|
private static int CalculateProgramSwitchProduction(DeviceCurrentStatus current, DeviceCurrentStatus last)
|
|
|
{
|
|
|
// 检查是否切换到新程序
|
|
|
if (IsNewProgram(current.NCProgram, last.NCProgram))
|
|
|
{
|
|
|
// 新程序以当前累计数为起点
|
|
|
return current.CumulativeCount;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// 切回历史程序,视为重新开始
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public static bool IsNewProgram(string currentProgram, string lastProgram)
|
|
|
{
|
|
|
// 实现程序切换判断逻辑
|
|
|
return currentProgram != lastProgram;
|
|
|
}
|
|
|
|
|
|
public static void CrossDayReset(DeviceCurrentStatus current, DeviceCurrentStatus last)
|
|
|
{
|
|
|
// 跨天处理:0点自动重置
|
|
|
if (current.RecordTime.Date != last.RecordTime.Date)
|
|
|
{
|
|
|
// 新日期以首次采集累计值为起点
|
|
|
// 这里需要在业务逻辑中处理
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} |