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

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

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

Loading…
Cancel
Save