using System;
using System.Collections.Generic;
using Dapper;
using MySql.Data.MySqlClient;
using log4net;
using CncModels.Entity;
namespace CncCollector.Core
{
///
/// 采集数据批量写入:cnc_collect_record 与 log_collect_raw,以及更新 CNC 机床状态。
///
public static class CollectRecordWriter
{
private static readonly ILog Log = LogManager.GetLogger(typeof(CollectRecordWriter));
///
/// 将批量结构化记录写入 cnc_collect_record,并记录原始 JSON 到 log_collect_raw,同时更新机床实时状态。
///
/// 数据库连接字符串
/// 结构化记录集合
/// 原始 JSON 日志
/// 采集地址标识
public static void WriteBatch(string connectionString, IEnumerable records, string rawJson, int collectAddressId)
{
if (records == null) return;
using (var conn = new MySqlConnection(connectionString))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
try
{
// 插入原始日志
const string sqlLog = @"INSERT INTO log_collect_raw
(collect_address_id, request_time, response_time, response_duration, is_success, status_code, raw_json, error_message, created_at)
VALUES
(@CollectAddressId, @RequestTime, @ResponseTime, @ResponseDuration, @IsSuccess, @StatusCode, @RawJson, @ErrorMessage, NOW())";
conn.Execute(sqlLog, new
{
CollectAddressId = collectAddressId,
RequestTime = DateTime.Now,
ResponseTime = DateTime.Now,
ResponseDuration = 0,
IsSuccess = 1,
StatusCode = 200,
RawJson = rawJson,
ErrorMessage = (string)null
}, tran);
// 插入结构化记录(逐条,保持简单且具备可编译性)
const string sqlRec = @"INSERT INTO cnc_collect_record
(machine_id, collect_time, device_time, program_name, part_count, device_status, run_status, operate_mode, spindle_speed_set, feed_speed_set, spindle_speed_actual, feed_speed_actual, spindle_load, spindle_override, power_on_time, run_time, cutting_time, cycle_time, machining_status, extra_data, created_at)
VALUES
(@MachineId, @CollectTime, @DeviceTime, @ProgramName, @PartCount, @DeviceStatus, @RunStatus, @OperateMode, @SpindleSpeedSet, @FeedSpeedSet, @SpindleSpeedActual, @FeedSpeedActual, @SpindleLoad, @SpindleOverride, @PowerOnTime, @RunTime, @CuttingTime, @CycleTime, @MachiningStatus, @ExtraData, NOW())";
foreach (var r in records)
{
r.CreatedAt = DateTime.Now;
conn.Execute(sqlRec, r, tran);
}
// 简单的机床状态更新(按单条记录的最后一条)
foreach (var r in records)
{
const string sqlMach = @"UPDATE cnc_machine
SET last_collect_time = @CollectTime, last_device_status = @DeviceStatus, last_run_status = @RunStatus, last_program_name = @ProgramName, last_part_count = @PartCount, last_operate_mode = @OperateMode, last_machining_status = @MachiningStatus
WHERE machine_id = @MachineId";
conn.Execute(sqlMach, new
{
MachineId = r.MachineId,
CollectTime = r.CollectTime,
DeviceStatus = r.DeviceStatus,
RunStatus = r.RunStatus,
ProgramName = r.ProgramName,
PartCount = r.PartCount,
OperateMode = r.OperateMode,
MachiningStatus = r.MachiningStatus
}, tran);
}
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
Log.Error("批量写入采集记录失败", ex);
throw;
}
}
}
}
}
}