You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/Core/CollectRecordWriter.cs

93 lines
4.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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