FanucDataService.cs 3.76 KB
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CNCFanucDataReading
{
    public class FanucDataService : IDisposable
    {
        private readonly IFreeSql _fsql;
        private bool _disposed = false;

        public FanucDataService(string connectionString)
        {
            if (string.IsNullOrEmpty(connectionString))
                throw new ArgumentException("数据库连接字符串不能为空", nameof(connectionString));

            _fsql = new FreeSql.FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.SqlServer, connectionString)
                .UseAutoSyncStructure(false) // 自动同步实体结构到数据库
                .Build();

        }

        /// <summary>
        /// 更新或创建设备Fanuc数据
        /// 如果表内没有该设备的数据则创建,有则修改
        /// </summary>
        public async Task<bool> UpsertFanucDataAsync(string equipmentCode, string equipmentName, FanucDataInfo dataInfo)
        {
            try
            {
                var now = DateTime.Now;
                var jsonData = JsonConvert.SerializeObject(dataInfo, Formatting.Indented);

                // 查找现有记录
                var existingRecord = await _fsql.Select<DaqEquipmentFanucData>()
                    .Where(r => r.EquipmentCode == equipmentCode)
                    .FirstAsync();

                if (existingRecord == null)
                {
                    // 创建新记录
                    await CreateFanucDataAsync(equipmentCode, equipmentName, jsonData, now);
                }
                else
                {
                    // 更新现有记录
                    await UpdateFanucDataAsync(existingRecord.Id, equipmentName, jsonData, now);

                }

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// 创建新的Fanuc数据记录
        /// </summary>
        private async Task CreateFanucDataAsync(string equipmentCode, string equipmentName, string jsonData, DateTime now)
        {
            var record = new DaqEquipmentFanucData
            {
                Id = Guid.NewGuid(),
                EquipmentCode = equipmentCode,
                EquipmentName = equipmentName,
                DataInfo = jsonData,
                CreateTime = now,
                UpdateTime = now
            };

            await _fsql.Insert(record).ExecuteAffrowsAsync();
        }

        /// <summary>
        /// 更新Fanuc数据记录
        /// </summary>
        private async Task UpdateFanucDataAsync(Guid id, string equipmentName, string jsonData, DateTime now)
        {
            await _fsql.Update<DaqEquipmentFanucData>()
                .Set(r => r.DataInfo, jsonData)
                .Set(r => r.UpdateTime, now)
                .Where(r => r.Id == id)
                .ExecuteAffrowsAsync();
        }

        // 插入历史数据
        public async Task<int> ArchiveToHistoryAsync()
        {
            try
            {
                var sql = "INSERT INTO daq_equipment_fanucio_data_history SELECT NEWID(),EquipmentCode,EquipmentName,DataInfo,GETDATE(),GETDATE() FROM daq_equipment_fanucio_data";
                return await _fsql.Ado.ExecuteNonQueryAsync(sql);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 历史数据归档失败: {ex.Message}");
                return 0;
            }
        }

        public void Dispose()
        {
            if (!_disposed)
            {
                _fsql?.Dispose();
                _disposed = true;
            }
        }

    }
}