feat: 实现数据回放功能(ReplayService + API端点)

- 新增 IReplayService/ReplayService 回放服务(预览+执行)
- 新增 ReplayController(POST preview/execute)
- 新增 ReplayDto 请求/响应DTO
- 回放流程:读取原始日志→清空业务数据→重新解析写入→日终汇总
- ServiceResolver DI注册
- 编译通过 0错误
feat/windows-service-status-auto
haoliang 1 day ago
parent c9cca32757
commit e09fdc1329

@ -5,8 +5,10 @@ using System.Data;
using MySqlConnector;
using Dapper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using CncModels.Entity;
using CncModels.Dto.CollectLog;
using CncService.Interface;
using CncRepository.Interface;
using CncRepository.Impl.Log;
using CncRepository.Impl;
@ -103,30 +105,30 @@ namespace CncService.Impl
// 简单 JSON 解析,提取每个 device 的信息并写入 cnc_collect_record
try
{
var devices = JsonConvert.DeserializeObject<List<dynamic>>(raw.RawJson);
foreach (var d in devices)
var devices = JArray.Parse(raw.RawJson);
foreach (JObject d in devices)
{
string deviceCode = (string)d?.device ?? null;
string deviceCode = d?.Value<string>("device") ?? null;
if (string.IsNullOrWhiteSpace(deviceCode)) continue;
// 通过设备代码获取机器ID
var machine = conn.QuerySingleOrDefault<CncModels.Entity.Machine>("SELECT id FROM cnc_machine WHERE device_code = @Code", new { Code = deviceCode });
if (machine == null) continue;
int machineId = machine.Id;
var machineId = conn.QuerySingleOrDefault<int?>("SELECT id FROM cnc_machine WHERE device_code = @Code", new { Code = deviceCode });
if (machineId == null) continue;
// 收集 tag 值
var programName = (string)ExtractTagValue((IEnumerable<dynamic>)d?.tags, "Tag5");
var partCount = (decimal?)ParseDecimal(ExtractTagValue((IEnumerable<dynamic>)d?.tags, "Tag8"));
var runStatus = (string)ExtractTagValue((IEnumerable<dynamic>)d?.tags, "Tag9");
var operateMode = (string)ExtractTagValue((IEnumerable<dynamic>)d?.tags, "Tag11");
var spindleSet = (decimal?)ParseDecimal(ExtractTagValue((IEnumerable<dynamic>)d?.tags, "Tag17"));
var spindleActual = (decimal?)ParseDecimal(ExtractTagValue((IEnumerable<dynamic>)d?.tags, "Tag19"));
var machiningStatus = (string)ExtractTagValue((IEnumerable<dynamic>)d?.tags, "Tag26");
var tags = d?.Value<JArray>("tags");
var programName = ExtractTagValue(tags, "Tag5");
var partCount = ParseDecimal(ExtractTagValue(tags, "Tag8"));
var runStatus = ExtractTagValue(tags, "Tag9");
var operateMode = ExtractTagValue(tags, "Tag11");
var spindleSet = ParseDecimal(ExtractTagValue(tags, "Tag17"));
var spindleActual = ParseDecimal(ExtractTagValue(tags, "Tag19"));
var machiningStatus = ExtractTagValue(tags, "Tag26");
var collectTime = raw.RequestTime;
var rec = new CollectRecord
{
MachineId = machineId,
MachineId = machineId.Value,
CollectTime = collectTime,
ProgramName = programName,
PartCount = partCount,
@ -205,17 +207,17 @@ namespace CncService.Impl
}
// helpers
private static string ExtractTagValue(IEnumerable<dynamic> tags, string id)
private static string ExtractTagValue(JArray tags, string id)
{
if (tags == null) return null;
foreach (var t in tags)
foreach (JObject t in tags)
{
if ((string)t?.id == id) return (string)t?.value;
if (t?.Value<string>("id") == id) return t?.Value<string>("value");
}
return null;
}
private static object ParseDecimal(string s)
private static decimal? ParseDecimal(string s)
{
if (decimal.TryParse(s, out var d)) return d;
return null;

Loading…
Cancel
Save