DatabaseService.cs 9.88 KB
using Hh.Mes.Common.log;
using Hh.Mes.Pojo.System;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.Response;
using Hh.Mes.POJO.WebEntity.equipment;
using Microsoft.IdentityModel.Logging;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Hh.Mes.Common.Exel.NpoiExcelImportHelper;

namespace HH.Data.Excel.SqlHelp
{
    public class DatabaseService
    {
        private static readonly Lazy<DatabaseService> _instance = new Lazy<DatabaseService>(() => new DatabaseService());

        private SqlSugarDbContext DBContext { get; }

        private DatabaseService()
        {
            string connectionString = ConfigurationManager.ConnectionStrings["BaseDBContext"].ConnectionString;
            DBContext = new SqlSugarDbContext(connectionString);
        }

        public static DatabaseService Instance => _instance.Value;


        /// <summary>
        /// 查询项目列表
        /// </summary>
        /// <returns></returns>
        public List<base_project> GetProjectList()
        {
            return DBContext.QueryableList<base_project>().OrderByDescending(x => x.createTime).ToList();
        }

        /// <summary>
        /// 查询厂房列表
        /// </summary>
        /// <returns></returns>
        public List<base_factory> GetFactoryList(Guid projectCode)
        {
            return DBContext.QueryableList<base_factory>(x => x.projectKeys == projectCode).ToList();
        }


        /// <summary>
        /// 查询设备类型
        /// </summary>
        /// <returns></returns>
        public List<daq_equipment_type> GetEqTypeList()
        {
            return DBContext.QueryableList<daq_equipment_type>(x => !SystemVariable.IotNotContainDevice.Contains(x.Code)).ToList();
        }

        /// <summary>
        /// 查询设备类型
        /// </summary>
        /// <returns></returns>
        public List<daq_equipment_type_prop_template> GetEqPropTemplateList(int equipmentTypeId)
        {
            return DBContext.QueryableList<daq_equipment_type_prop_template>(x => x.EquipmentTypeId == equipmentTypeId).ToList();
        }

        /// <summary>
        ///  设备类型属性 保存 base_equipment,daq_equipment,daq_equipment_prop
        /// </summary>
        /// <returns></returns>
        public Tuple<bool, string> DefaultSave(base_equipment eq, daq_equipment daqEq, List<daq_equipment_prop> prop)
        {
            try
            {
                var isBaseEq = DBContext.QueryableList<base_equipment>()
                                       .Any(x => x.projectKeys == eq.projectKeys && x.ip == eq.ip && x.equipmentName == eq.equipmentName && x.equipmentTypeCode == eq.equipmentTypeCode);
                if (isBaseEq)
                {
                    return new Tuple<bool, string>(false, $"{Program._mainWindow._sysIpFileName}文件导入的设备,数据库存在相同的项目key:{eq.projectKeys}-ip:{eq.ip}-设备名称:{eq.equipmentName}-设备类型:{eq.equipmentTypeCode}");
                }
                var isDaqEq = DBContext.QueryableList<daq_equipment>()
                                       .Any(x => x.iP == daqEq.iP && x.name == daqEq.name && x.equipmentTypeId == daqEq.equipmentTypeId && x.projectCode == daqEq.projectCode);
                if (isDaqEq)
                {
                    return new Tuple<bool, string>(false, $"{Program._mainWindow._sysIpFileName}文件导入的设备,数据库存在相同的Daq项目编码:{daqEq.projectCode}-设备名称:{daqEq.name}-设备类型ID:{daqEq.equipmentTypeId}-ip:{daqEq.iP}");
                }
                // 开启事务
                DBContext._db.Ado.BeginTran();
                DBContext._db.Insertable(eq).ExecuteCommand();
                var eqId = DBContext._db.Insertable(daqEq).ExecuteReturnIdentity();
                for (int i = 0; i < prop.Count; i++)
                {
                    prop[i].EquipmentId = eqId;
                }
                DBContext._db.Insertable(prop).ExecuteCommand();
                // 提交事务
                DBContext._db.Ado.CommitTran();
                return new Tuple<bool, string>(true, SystemVariable.dataActionOk);
            }
            catch (Exception ex)
            {
                // 事务回滚
                DBContext._db.Ado.RollbackTran();
                return new Tuple<bool, string>(false, $"设备默认属性保存失败:" + ex.ToString());
            }
        }


        #region 插入设备、设备属性表数据
        public ResponseNew JudgeData(Dictionary<string, SysDtAllCls> sourceData)
        {
            ResponseNew response = new ResponseNew();
            try
            {
                // 验证 sourceData 是否为空
                if (!IsSourceDataValid(sourceData, response)) return response;

                // 判断设备表和设备属性表是否为空
                if (!GetEquipAndPropTables(sourceData, response)) return response;

                // 验证设备表数据
                var daqEquipment = ValidateEquipTable(sourceData["设备列表"].dtData, response);
                if (daqEquipment == null) return response;

                // 开启事务
                DBContext._db.BeginTran();
                // 插入设备信息
                InsertEquipment(daqEquipment);

                // 获取插入的设备 ID
                int equipId = daqEquipment.id;

                // 插入设备属性信息
                if (!InsertEquipmentProps(sourceData["设备属性"].dtData, equipId, response))
                {
                    // 事务回滚
                    DBContext._db.Ado.RollbackTran();
                    return response;
                }

                // 提交事务
                DBContext._db.Ado.CommitTran();
                response.ResponseSuccess($"数据插入成功;");
            }
            catch (Exception ex)
            {
                // 发生异常,事务回滚
                DBContext._db.Ado.RollbackTran();
                return response.ResponseError(ex.Message);
            }
            return response;
        }

        private bool IsSourceDataValid(Dictionary<string, SysDtAllCls> sourceData, ResponseNew response)
        {
            if (sourceData.Values.Count == 0)
            {
                response.ResponseError($"表数据为空");
                return false;
            }
            return true;
        }

        private bool GetEquipAndPropTables(Dictionary<string, SysDtAllCls> sourceData, ResponseNew response)
        {
            // 判断设备表和设备属性表是否有数据
            foreach (var data in sourceData)
            {
                if (data.Key == "设备列表" && data.Value.dtData.Rows.Count < 1)
                {
                    response.ResponseError("表没有设备列表数据");
                    return false;
                }
                if (data.Key == "设备属性" && data.Value.dtData.Rows.Count < 1)
                {
                    response.ResponseError("表没有设备属性数据");
                    return false;
                }
            }
            return true;
        }

        private daq_equipment ValidateEquipTable(DataTable equipTable, ResponseNew response)
        {
            if (equipTable == null || equipTable.Rows.Count == 0)
            {
                response.ResponseError("设备列表数据不能为空");
                return null;
            }
            List<daq_equipment> equipList = DBContext._db.Utilities.DataTableToList<daq_equipment>(equipTable);
            if (equipList.Count == 0)
            {
                response.ResponseError("设备列表数据解析失败");
                return null;
            }
            daq_equipment daqEquipment = equipList.First();
            if (daqEquipment.equipmentTypeId != 19)
            {
                response.ResponseError("设备类型必须为输送线(19)");
                return null;
            }
            var isHaveEquipment = DBContext._db.Queryable<daq_equipment>().Any(x => x.name == daqEquipment.name && x.iP == daqEquipment.iP && x.projectCode == daqEquipment.projectCode);
            if (isHaveEquipment)
            {
                response.ResponseError("设备编码已存在");
                return null;
            }
            if (!DBContext._db.Queryable<base_project>().Any(x => x.projectCode == daqEquipment.projectCode))
            {
                response.ResponseError("项目编码不存在");
                return null;
            }
            if (!DBContext._db.Queryable<base_factory>().Any(x => x.factoryCode == daqEquipment.factoryCode))
            {
                response.ResponseError("厂房编码不存在");
                return null;
            }
            return daqEquipment;
        }

        private void InsertEquipment(daq_equipment daqEquipment)
        {
            daqEquipment.created = DateTime.Now;
            daqEquipment.createdBy = "Excel导入";
            daqEquipment.id = DBContext._db.Insertable(daqEquipment).ExecuteReturnIdentity();
        }

        private bool InsertEquipmentProps(DataTable propTable, int equipId, ResponseNew response)
        {
            try
            {
                List<daq_equipment_prop> propList = DBContext._db.Utilities.DataTableToList<daq_equipment_prop>(propTable);
                foreach (var item in propList)
                {
                    item.EquipmentId = equipId;
                    item.Created = DateTime.Now;
                    item.CreatedBy = "Excel导入";
                }
                DBContext._db.Insertable(propList).ExecuteCommand();
                return true;
            }
            catch (Exception ex)
            {
                response.ResponseError($"设备属性数据插入失败: {ex.Message}");
                return false;
            }
        }
        #endregion
    }
}