From 2153a1fed93812eefd4ed3f0e32e4821a461c1d3 Mon Sep 17 00:00:00 2001
From: haoliang <821644@qq.com>
Date: Tue, 12 May 2026 21:36:04 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=B4=AF=E8=AE=A1=E6=80=BB?=
=?UTF-8?q?=E6=95=B0(totalPartCount)=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8+?=
=?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8time=5Ffreeze=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Machine entity新增LastTotalPartCount字段映射DB last_total_part_count列
- MachineStatusResponse DTO新增TotalPartCount属性
- MachineRepository SelectColumns新增last_total_part_count列映射
- MachineService.GetStatus填充TotalPartCount值
- 模拟器新增time_freeze/time_unfreeze事件支持(DeviceState/DeviceSimulator/FanucDataGenerator)
---
src/CncModels/Dto/Machine/MachineStatusResponse.cs | 3 +++
src/CncModels/Entity/Machine.cs | 3 +++
src/CncRepository/Impl/MachineRepository.cs | 2 +-
src/CncService/Impl/MachineService.cs | 1 +
src/CncSimulator/Device/DeviceSimulator.cs | 11 +++++++++++
src/CncSimulator/Device/DeviceState.cs | 7 +++++++
src/CncSimulator/Generator/FanucDataGenerator.cs | 5 ++++-
7 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/src/CncModels/Dto/Machine/MachineStatusResponse.cs b/src/CncModels/Dto/Machine/MachineStatusResponse.cs
index 8e45eb2..2572f6e 100644
--- a/src/CncModels/Dto/Machine/MachineStatusResponse.cs
+++ b/src/CncModels/Dto/Machine/MachineStatusResponse.cs
@@ -28,5 +28,8 @@ namespace CncModels.Dto.Machine
/// 主轴负载(%)
public decimal? SpindleLoad { get; set; }
+
+ /// 历史累计加工零件总数(Tag1终身值)
+ public decimal? TotalPartCount { get; set; }
}
}
diff --git a/src/CncModels/Entity/Machine.cs b/src/CncModels/Entity/Machine.cs
index 384425f..983b738 100644
--- a/src/CncModels/Entity/Machine.cs
+++ b/src/CncModels/Entity/Machine.cs
@@ -52,6 +52,9 @@ namespace CncModels.Entity
/// 最近零件数
public decimal? LastPartCount { get; set; }
+ /// 最近累计零件总数(Tag1历史终身值)
+ public decimal? LastTotalPartCount { get; set; }
+
/// 最近操作模式
public string LastOperateMode { get; set; }
diff --git a/src/CncRepository/Impl/MachineRepository.cs b/src/CncRepository/Impl/MachineRepository.cs
index 0ff4846..864ef28 100644
--- a/src/CncRepository/Impl/MachineRepository.cs
+++ b/src/CncRepository/Impl/MachineRepository.cs
@@ -20,7 +20,7 @@ namespace CncRepository.Impl
/// 在线判断SQL片段:last_ping_time在20秒内视为在线
private const string OnlineExpr = "(CASE WHEN last_ping_time IS NOT NULL AND last_ping_time >= NOW() - INTERVAL 20 SECOND THEN 1 ELSE 0 END)";
- private const string SelectColumns = @"id as Id, device_code as DeviceCode, name as Name, workshop_id as WorkshopId, collect_address_id as CollectAddressId, ip_address as IpAddress, brand_id as BrandId, is_enabled as IsEnabled, {0} as IsOnline, last_ping_time as LastPingTime, last_ping_latency as LastPingLatency, last_collect_time as LastCollectTime, last_device_status as LastDeviceStatus, last_run_status as LastRunStatus, last_program_name as LastProgramName, last_part_count as LastPartCount, last_operate_mode as LastOperateMode, last_machining_status as LastMachiningStatus, created_at as CreatedAt, updated_at as UpdatedAt";
+ private const string SelectColumns = @"id as Id, device_code as DeviceCode, name as Name, workshop_id as WorkshopId, collect_address_id as CollectAddressId, ip_address as IpAddress, brand_id as BrandId, is_enabled as IsEnabled, {0} as IsOnline, last_ping_time as LastPingTime, last_ping_latency as LastPingLatency, last_collect_time as LastCollectTime, last_device_status as LastDeviceStatus, last_run_status as LastRunStatus, last_program_name as LastProgramName, last_part_count as LastPartCount, last_total_part_count as LastTotalPartCount, last_operate_mode as LastOperateMode, last_machining_status as LastMachiningStatus, created_at as CreatedAt, updated_at as UpdatedAt";
public Machine GetById(int id)
{
diff --git a/src/CncService/Impl/MachineService.cs b/src/CncService/Impl/MachineService.cs
index f6a1235..2700db0 100644
--- a/src/CncService/Impl/MachineService.cs
+++ b/src/CncService/Impl/MachineService.cs
@@ -130,6 +130,7 @@ namespace CncService.Impl
PartCount = machine.LastPartCount,
RunStatus = machine.LastRunStatus ?? latest?.RunStatus,
OperationMode = machine.LastOperateMode,
+ TotalPartCount = machine.LastTotalPartCount,
SpindleSpeedSet = null,
FeedSpeedSet = null,
SpindleSpeedActual = null,
diff --git a/src/CncSimulator/Device/DeviceSimulator.cs b/src/CncSimulator/Device/DeviceSimulator.cs
index 6d8a9e8..a325e8e 100644
--- a/src/CncSimulator/Device/DeviceSimulator.cs
+++ b/src/CncSimulator/Device/DeviceSimulator.cs
@@ -99,6 +99,17 @@ namespace CncSimulator.Device
case "same_part":
SetScenario("same_part", 999);
break;
+ case "time_freeze":
+ // 冻结时间:Tag的time保持不变,value继续正常更新
+ _state.FreezeTime = true;
+ if (!_state.FrozenTimeValue.HasValue)
+ _state.FrozenTimeValue = DateTime.Now;
+ break;
+ case "time_unfreeze":
+ // 解冻时间:恢复正常time更新
+ _state.FreezeTime = false;
+ _state.FrozenTimeValue = null;
+ break;
}
}
diff --git a/src/CncSimulator/Device/DeviceState.cs b/src/CncSimulator/Device/DeviceState.cs
index 57d9a2c..b50c5c7 100644
--- a/src/CncSimulator/Device/DeviceState.cs
+++ b/src/CncSimulator/Device/DeviceState.cs
@@ -58,6 +58,13 @@ namespace CncSimulator.Device
/// 数据变化间隔(秒)
public int DataChangeInterval { get; set; } = 10;
+ // ===== 时间冻结(测试time不变value变的边界条件) =====
+ /// 时间冻结开关:true时Tag的time字段保持不变,value照常更新
+ public bool FreezeTime { get; set; } = false;
+
+ /// 冻结时使用的固定时间(null时首次冻结取当前时间)
+ public DateTime? FrozenTimeValue { get; set; } = null;
+
// ===== 统计信息 =====
/// 本次启动后累计总加工零件数
public int TotalPartsSinceStart { get; set; } = 0;
diff --git a/src/CncSimulator/Generator/FanucDataGenerator.cs b/src/CncSimulator/Generator/FanucDataGenerator.cs
index 57f2b33..2918984 100644
--- a/src/CncSimulator/Generator/FanucDataGenerator.cs
+++ b/src/CncSimulator/Generator/FanucDataGenerator.cs
@@ -31,7 +31,10 @@ namespace CncSimulator.Generator
private JArray GenerateTags(DeviceState state)
{
var tags = new JArray();
- DateTime baseTime = DateTime.Now;
+ // 如果设备设置了时间冻结,使用冻结的固定时间;否则取当前时间
+ DateTime baseTime = state.FreezeTime && state.FrozenTimeValue.HasValue
+ ? state.FrozenTimeValue.Value
+ : DateTime.Now;
// 每个tag的时间基准上随机偏移 -5~0 秒
DateTime TagTime()