|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using Dapper;
|
|
|
using MySql.Data.MySqlClient;
|
|
|
using log4net;
|
|
|
using CncModels.Entity;
|
|
|
|
|
|
namespace CncCollector.Core
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 采集数据批量写入:cnc_collect_record 与 log_collect_raw,以及更新 CNC 机床状态。
|
|
|
/// </summary>
|
|
|
public static class CollectRecordWriter
|
|
|
{
|
|
|
private static readonly ILog Log = LogManager.GetLogger(typeof(CollectRecordWriter));
|
|
|
|
|
|
/// <summary>
|
|
|
/// 将批量结构化记录写入 cnc_collect_record,并记录原始 JSON 到 log_collect_raw,同时更新机床实时状态。
|
|
|
/// </summary>
|
|
|
/// <param name="connectionString">数据库连接字符串</param>
|
|
|
/// <param name="records">结构化记录集合</param>
|
|
|
/// <param name="rawJson">原始 JSON 日志</param>
|
|
|
/// <param name="collectAddressId">采集地址标识</param>
|
|
|
public static void WriteBatch(string connectionString, IEnumerable<CollectRecord> 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;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|