using DeviceRepair.Models; using DeviceRepair.Models.DeviceRepair.ExportView; using NLog; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; namespace DeviceRepair.DataAccess { /// /// 设备维修 /// public class MaintenanceAccess : DbContext { private static readonly Logger log = LogManager.GetCurrentClassLogger(); private static MaintenanceAccess manager; public static MaintenanceAccess Instance { get { if (manager == null) manager = new MaintenanceAccess(); return manager; } } /// /// 查询数据 /// /// public APIResponseData GetDatas(DeviceWarrantyRequestFormFilter FilterInfo, string LoginCode) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { List Devs = DeviceAccess.Instance.GetDevsByLoginAuths(LoginCode); if (Devs.Count == 0) return apiResponseData; int[] DevIds = Devs.Select(x => x.AutoID).ToArray(); db.ChangeDatabase("main"); var exp = Expressionable.Create(); if (FilterInfo != null) { exp.AndIF(!string.IsNullOrWhiteSpace(FilterInfo.EquipmentID), x => x.EquipmentID.Contains(FilterInfo.EquipmentID)); exp.AndIF(FilterInfo.StartTime.HasValue, x => x.CreatOn >= FilterInfo.StartTime.Value); exp.AndIF(FilterInfo.EndTime.HasValue, x => x.CreatOn <= FilterInfo.EndTime.Value); exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingRepair, x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID).NotAny()); exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingApproval, x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0).Any() && !SqlFunc.HasNumber(x.RestorationConfirmationBy)); exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.BeComplate, x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0 && s.ValidateBy > 0).Any() && SqlFunc.HasNumber(x.RestorationConfirmationBy)); bool isDown = FilterInfo.DownStatus == DeviceRunningStatus.Stop; exp.AndIF(FilterInfo.DownStatus != DeviceRunningStatus.All, x => x.IsDown == isDown); } List Datas = CurrentDb.AsQueryable().With(SqlWith.NoLock) .Where(x => SqlFunc.ContainsArray(DevIds, x.EquipmentPK)) .Where(exp.ToExpression()).ToList(); //List Datas = CurrentDb.AsQueryable().Where(exp.ToExpression()).ToList(); //int[] pks = Datas.Select(x => x.AutoID).ToArray(); //Dictionary Maintaions = db.Queryable() // .With(SqlWith.NoLock) // .Where(x => SqlFunc.ContainsArray(pks, x.FormID)).ToList().ToDictionary(x => x.FormID, x => x); //int[] mpks = Maintaions.Select(x => x.Value.AutoID).ToArray(); //List Accessories = db.Queryable() // .With(SqlWith.NoLock) // .Where(x => SqlFunc.ContainsArray(mpks, x.MaintaionID)).ToList(); //foreach (DeviceWarrantyRequestForm item in Datas) //{ // if (Maintaions.ContainsKey(item.AutoID)) // { // item.MaintaionInfo = Maintaions[item.AutoID]; // if (Accessories.Any(x => x.MaintaionID == item.MaintaionInfo.AutoID)) // { // item.MaintaionInfo.Accessories = Accessories.Where(x => x.MaintaionID == item.MaintaionInfo.AutoID)?.ToList(); // } // } //} apiResponseData.Code = 1; apiResponseData.Data = Datas; apiResponseData.Message = ""; } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 设备维修 /// /// /// public APIResponseData DeviceMaintion(DeviceWarrantyRequestMaintaionInfo Entity, List AccessoriesItems, HeaderModel Operation) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据插入失败!" }; try { if (Entity == null) { throw new Exception("待插入的数据库对象不能为空!"); } DateTime CurrentTime = DateTime.Now; if (Entity.AutoID > 0) { /// 修改 Entity.ModifyBy = Operation.Operator; Entity.ModifyOn = CurrentTime; } else { /// 新增 Entity.CreatOn = CurrentTime; Entity.CreateBy = Operation.Operator; Entity.Guid = Guid.NewGuid(); } if (Entity.IsSubmit) { Entity.SubmitBy = Operation.Operator; Entity.SubmitOn = CurrentTime; } try { db.ChangeDatabase("main"); db.BeginTran(); if (db.Queryable().Any(x => x.FormID == Entity.AutoID && x.SubmitBy > 0)) throw new Exception($"当前数据已被处理,请刷新后再试!"); DeviceWarrantyRequestMaintaionInfo MaintaionInfo = db.Saveable(Entity).ExecuteReturnEntity(); if (MaintaionInfo != null) { bool IsSuccess = true; if (AccessoriesItems != null) { foreach (var item in AccessoriesItems) { item.Guid = Guid.NewGuid(); item.MaintaionID = MaintaionInfo.AutoID; item.CreatBy = Operation.Operator; item.CreatOn = CurrentTime; } IsSuccess = db.Saveable(AccessoriesItems).ExecuteCommand() == AccessoriesItems.Count; } if (IsSuccess) { db.CommitTran(); apiResponseData.Code = 1; apiResponseData.Message = string.Empty; } } else { db.RollbackTran(); } } catch (Exception) { db.RollbackTran(); throw; } } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; if (((System.Data.SqlClient.SqlException)ex).Number == 2627) { apiResponseData.Message = $"当前数据已被处理,请刷新后再试!"; } else { apiResponseData.Message = ex.Message; } } return apiResponseData; } /// /// 停机单新增 /// /// /// public APIResponseData DeviceDownFormAdd(DeviceWarrantyRequestForm Form, HeaderModel Operation) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据插入失败!" }; try { if (Form == null) { throw new Exception("待插入的数据库对象不能为空!"); } DateTime CurrentTime = DateTime.Now; db.ChangeDatabase("main"); db.BeginTran(); #region 2024年5月21日 会议,确定一个设备,同时能存在多个维修单 //// 当前设备存在未完成的设备停机单 //if (db.Queryable().Any(x => // x.EquipmentID == Form.EquipmentID && // ( // !SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID).Any() || // SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && (s.SubmitBy == 0 || s.ValidateBy == 0)).Any()) //)) //{ // throw new Exception("当前设备存在未完成的设备停机单!"); //} #endregion Form.GUID = Guid.NewGuid(); Form.CreatBy = Operation.Operator; Form.CreatorName = Operation.OperatorName; Form.CreatOn = CurrentTime; try { int AutoID = db.Saveable(Form).ExecuteReturnEntity()?.AutoID ?? 0; if (AutoID > 0) { db.CommitTran(); apiResponseData.Code = 1; apiResponseData.Message = string.Empty; apiResponseData.Data = AutoID; } else { db.RollbackTran(); } } catch (Exception) { db.RollbackTran(); throw; } } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 停机单 - 评估 /// /// /// /// public APIResponseData DownFormAssessment(DeviceWarrantyEvaluatorInfo Evaluator, HeaderModel Operation) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" }; try { if (Evaluator.FormID <= 0) { throw new Exception("待处理的停机单主键编号无效!"); } if (!Operation.OperatorGUID.HasValue || Operation.OperatorGUID == Guid.Empty) { throw new Exception("传入的操作人参数无效!"); } DateTime CurrentTime = DateTime.Now; db.ChangeDatabase("main"); DeviceWarrantyRequestForm Entity = db.Queryable().First(x => x.AutoID == Evaluator.FormID); if (Entity == null) { throw new Exception("待处理的停机单主键编号无效!"); } if (Evaluator.EvaluatorCode.ToUpper() != "QE" && Evaluator.EvaluatorCode.ToUpper() != "PE") { throw new Exception($"程序出错,未知的评估编码:{Evaluator.EvaluatorCode.ToUpper()}!"); } Evaluator.CreatorName = Operation.OperatorName; Evaluator.CreateBy = Operation.Operator; Evaluator.CreatOn = CurrentTime; Evaluator.Guid = Guid.NewGuid(); //switch (AssessmentCode.ToUpper()) //{ // case "QA": // Entity.EvaluatornameQa = Operation.OperatorName; // Entity.EvaluatoronQa = CurrentTime; // Entity.EvaluatorcodeQa = Operation.OperatorGUID; // break; // case "EA": // Entity.EvaluatornameEa = Operation.OperatorName; // Entity.EvaluatoronEa = CurrentTime; // Entity.EvaluatorcodeEa = Operation.OperatorGUID; // break; // case "MT": // Entity.EvaluatornameMt = Operation.OperatorName; // Entity.EvaluatoronMt = CurrentTime; // Entity.EvaluatorcodeMt = Operation.OperatorGUID; // break; // case "TL": // Entity.EvaluatornameTl = Operation.OperatorName; // Entity.EvaluatoronTl = CurrentTime; // Entity.EvaluatorcodeTl = Operation.OperatorGUID; // break; // default: // break; //} if (db.Insertable(Evaluator).ExecuteCommand() > 0) { apiResponseData.Code = 1; apiResponseData.Message = string.Empty; } } catch (System.Data.SqlClient.SqlException ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Number == 2627 ? "当前数据已被处理,请刷新后在试!" : ex.Message; } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 修改停机单 停机状态 /// /// /// /// public APIResponseData ChangeDownStatus(int AutoID, bool Status, HeaderModel Operation) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" }; db.ChangeDatabase("main"); db.BeginTran(); try { if (AutoID <= 0) { throw new Exception("待处理的停机单主键编号无效!"); } DateTime CurrentTime = DateTime.Now; if (db.Queryable().Any(x => x.FormID == AutoID && x.SubmitBy > 0)) { throw new Exception("数据已被修改!"); } DeviceWarrantyRequestForm Entity = db.Queryable().First(x => x.AutoID == AutoID); if (Entity == null) { throw new Exception("待处理的停机单主键编号无效!"); } Entity.IsDown = Status; if (db.Updateable(Entity).UpdateColumns(it => new { it.IsDown }).ExecuteCommand() > 0) { db.CommitTran(); apiResponseData.Code = 1; apiResponseData.Message = string.Empty; return apiResponseData; } } catch (SqlSugarException e) { db.RollbackTran(); log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { db.RollbackTran(); log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } db.RollbackTran(); return apiResponseData; } /// /// 双重验证 /// /// 1:技术人员确认 2:工程师或维修主管确认 /// /// public APIResponseData ValidateMaintenance(int AutoID, int t, HeaderModel Operation) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" }; try { if (AutoID <= 0) { throw new Exception("待处理的停机单主键编号无效!"); } DateTime CurrentTime = DateTime.Now; db.ChangeDatabase("main"); DeviceWarrantyRequestMaintaionInfo Entity = db.Queryable().First(x => x.FormID == AutoID); if (Entity == null) { throw new Exception("待处理的停机单主键编号无效!"); } if (t == 1) { if (Entity.ValidateBy > 0) throw new Exception("当前维修单数据已被处理,请刷新后再试!"); Entity.ValidateBy = Operation.Operator; Entity.ValidateOn = CurrentTime; } else if (t == 2) { if (Entity.Validate2By > 0) throw new Exception("当前维修单数据已被处理,请刷新后再试!"); Entity.Validate2By = Operation.Operator; Entity.Validate2On = CurrentTime; } else { throw new Exception("传入的确认人岗位错误!"); } if (db.Updateable(Entity).ExecuteCommand() > 0) { apiResponseData.Code = 1; apiResponseData.Message = string.Empty; } } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 生产部门 - 设备恢复确认 /// /// /// /// public APIResponseData DeviceResumptionComfirm(int AutoID, HeaderModel Operation) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据处理失败!" }; try { if (AutoID <= 0) { throw new Exception("待处理的停机单主键编号无效!"); } DateTime CurrentTime = DateTime.Now; db.ChangeDatabase("main"); DeviceWarrantyRequestForm Entity = db.Queryable().First(x => x.AutoID == AutoID); if (Entity == null) { throw new Exception("待处理的停机单主键编号无效!"); } if (Entity.MaintaionItems != null && Entity.MaintaionItems.SubmitBy > 0 && ((Entity.InProduction && Entity.EvaluatorItems?.Count == 2) || !Entity.InProduction) && ((Entity.MaintaionItems.BeValidate && Entity.MaintaionItems.Validate2By > 0 && Entity.MaintaionItems.ValidateBy > 0) || !Entity.MaintaionItems.BeValidate) && Entity.RestorationConfirmationBy == 0 ) { Entity.RestorationConfirmationOn = CurrentTime; Entity.RestorationConfirmationBy = Operation.Operator; Entity.RestorationConfirmationOnName = Operation.OperatorName; if (db.Updateable(Entity).ExecuteCommand() > 0) { apiResponseData.Code = 1; apiResponseData.Message = string.Empty; } } else { throw new Exception("待处理的停机单状态不正确,或已被其他用户处理,请重试!"); } } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 判断维修单是否提交 /// /// /// public APIResponseData MaintionDataIsSubmit(int FormAutoId) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"数据插入失败!" }; try { if (FormAutoId == 0) throw new Exception("待查询的维修单编号不能为空!"); db.ChangeDatabase("main"); int Count = db.Queryable().With(SqlWith.NoLock).Count(x => x.FormID == FormAutoId && x.SubmitBy > 0); apiResponseData.Code = 1; apiResponseData.Data = Count; } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } public APIResponseData GetXlsxData(DeviceWarrantyRequestFormFilter FilterInfo, string LoginCode) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { List Devs = DeviceAccess.Instance.GetDevsByLoginAuths(LoginCode); if (Devs.Count == 0) { return new APIResponseData { Code = -1, Message = $"获取到的数据为空!" }; ; } db.ChangeDatabase("main"); Dictionary RootIds = db.Ado.SqlQuery(@"select AutoID,RootName as Name from dbo.View_DeviceRoot").ToDictionary(x => x.AutoID, x => x.Name); var exp = Expressionable.Create(); if (FilterInfo != null) { exp.AndIF(!string.IsNullOrWhiteSpace(FilterInfo.EquipmentID), x => x.EquipmentID.Contains(FilterInfo.EquipmentID)); exp.AndIF(FilterInfo.StartTime.HasValue, x => x.CreatOn >= FilterInfo.StartTime.Value); exp.AndIF(FilterInfo.EndTime.HasValue, x => x.CreatOn <= FilterInfo.EndTime.Value); exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingRepair, x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID).NotAny()); exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.AwaitingApproval, x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0).Any() && !SqlFunc.HasNumber(x.RestorationConfirmationBy)); exp.AndIF(FilterInfo.Status == DeviceWarrantyRequestFormStatus.BeComplate, x => SqlFunc.Subqueryable().Where(s => s.FormID == x.AutoID && s.SubmitBy > 0 && s.ValidateBy > 0).Any() && SqlFunc.HasNumber(x.RestorationConfirmationBy)); bool isDown = FilterInfo.DownStatus == DeviceRunningStatus.Stop; exp.AndIF(FilterInfo.DownStatus != DeviceRunningStatus.All, x => x.IsDown == isDown); } List Datas = CurrentDb.AsQueryable().With(SqlWith.NoLock).Where(exp.ToExpression()).ToList(); Dictionary Users = db.Queryable().ToList().ToDictionary(x => x.AutoID, x => x); Dictionary Fields = db.Queryable().ToList().ToDictionary(x => x.AutoID, x => x); Dictionary devs = Devs.ToDictionary(x => x.AutoID, x => x); int i = 1; List views = new List(); foreach (DeviceWarrantyRequestForm item in Datas) { if (!devs.ContainsKey(item.EquipmentPK)) continue; int Plant = RootIds[item.EquipmentPK] == "KH" ? 1303 : 9997; MaintainOrderView view = new MaintainOrderView { AutoNumber = i, Plant = Plant, AutoID = item.AutoID, EquipmentID = item.EquipmentID, EquipmentName = item.EquipmentName, FormCreatOnDate = item.CreatOn.Value.ToString("yyyy-M-dd"), FormCreatOnTime = item.CreatOn.Value.ToString("HH:mm:ss"), ReferenceOnDate = "", ReferenceOnTime = "", FaultSymptoms = item.FaultSymptoms, }; if (item.RestorationConfirmationBy > 0) { view.ComplateDate = item.RestorationConfirmationOn.Value.ToString("yyyy-M-dd"); view.ComplateTime = item.RestorationConfirmationOn.Value.ToString("HH:mm:ss"); view.ComplateBy = item.RestorationConfirmationOnName; } if (item.MaintaionItems != null && item.MaintaionItems.SubmitBy > 0) { DeviceWarrantyRequestMaintaionInfo repair = item.MaintaionItems; view.RepairPersonnel = Users[repair.SubmitBy].RealName; view.RepairStartDate = repair.MaintainStartTime.ToString("yyyy-M-dd"); view.RepairFinishDate = repair.MaintainEndTime.ToString("yyyy-M-dd"); view.MaintainCause = repair.MaintainCause; view.MaintainContent = repair.MaintainContent; if (repair.AccessoriesItems == null || repair.AccessoriesItems.Count == 0) { view.Accessories = "N/A"; } else { view.Accessories = string.Join(",", repair.AccessoriesItems.Select(x => x.FieldName).ToArray()); } TimeSpan Downtime = repair.MaintainEndTime - item.CreatOn.Value; view.Downtime = Convert.ToDecimal(Math.Round(Downtime.TotalHours, 2)); TimeSpan RepairDuration = repair.MaintainEndTime - repair.MaintainStartTime; view.RepairDuration = Convert.ToDecimal(Math.Round(RepairDuration.TotalHours)); view.Maintenance = Fields[repair.Maintenance].FieldText; view.SymptomlDistinction = Fields[repair.SymptomlDistinction].FieldText; view.ValidateNo = repair.BeValidate ? repair.ValidateNo : "N/A"; } views.Add(view); i++; } apiResponseData.Code = 1; apiResponseData.Data = views; apiResponseData.Message = ""; } catch (SqlSugarException e) { log.Error(e); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { log.Error(ex); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } } }