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; } } } } } }