using DeviceRepair.Models; using DeviceRepair.Models.Common; using DeviceRepair.Models.Device; using DeviceRepair.Models.Enum; using DeviceRepair.Models.Plan; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; namespace DeviceRepair.DataAccess { public class PlanAccess : DbContext { private static PlanAccess manager; public static PlanAccess Instance { get { if (manager == null) manager = new PlanAccess(); return manager; } } /// /// 保养计划批量新增数据 /// /// /// public APIResponseData InsertDatas(List lst, HeaderModel hm) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"新增失败或当前数据无更改,请重试!" }; try { db.ChangeDatabase("main"); DateTime CurrentTime = DateTime.Now; if (lst == null || lst.Count == 0) throw new Exception("插入的数据集合,不能为空!"); // 操作对象 Dictionary> OperationList = new Dictionary>(); OperationList.Add(EnumOperationType.Add, new List()); OperationList.Add(EnumOperationType.Change, new List()); db.BeginTran(); int Year = lst[0].MaintenanceYear; int[] equipmentIds = lst.Select(x => x.EquipmentID).Distinct().ToArray(); // 设备编号校验 Dictionary devs = DeviceAccess.Instance.CurrentDb.AsQueryable().With(SqlWith.NoLock).Where(x => SqlFunc.ContainsArray(equipmentIds, x.AutoID)).ToList().ToDictionary(x => x.AutoID, x => x); System.Text.StringBuilder builder = new System.Text.StringBuilder(); foreach (int id in equipmentIds) { if (!devs.ContainsKey(id)) { builder.AppendLine($"设备编号:{id} ,不存在于系统中!"); } } if (builder.Length > 0) throw new Exception(builder.ToString()); // 计划校验 List Plans = CurrentDb.AsQueryable() .With(SqlWith.NoLock).Where(x => SqlFunc.ContainsArray(equipmentIds, x.EquipmentID) && x.MaintenanceYear == Year).ToList(); int[] planIds = Plans.Select(x => x.AutoID).Distinct().ToArray(); // 已保养数据不允许修改 List Records = db.Queryable().Where(x => SqlFunc.ContainsArray(planIds, x.PlanPrimaryID)).ToList(); foreach (MaintenanceRecordInfo item in Records) { DriveMaintencePlanInfo t = Plans.FirstOrDefault(x => x.AutoID == item.PlanPrimaryID); if (t != null) { DriveMaintencePlanInfo tt = lst.FirstOrDefault(x => x.MaintenanceMonth == t.MaintenanceMonth && x.EquipmentID == t.EquipmentID); if (tt != null) { // 计划已保养,但本次操作未修改此条保养的数据,正常执行 if (tt.MaintenanceType == t.MaintenanceType) { lst.RemoveAll(x => x.MaintenanceType == t.MaintenanceType && x.MaintenanceMonth == t.MaintenanceMonth && x.EquipmentID == t.EquipmentID); } else { // 计划已保养且本次欲修改此数据,退出保养 builder.AppendLine($"设备编号:{devs[t.EquipmentID].EquipmentID} 在{t.MaintenanceMonth}月的计划,存在已保养的数据,无法更改!"); } } } } if (builder.Length > 0) throw new Exception(builder.ToString()); // 修改的计划 List DelPlanIds = new List(); foreach (DriveMaintencePlanInfo item in Plans) { // 取数据库计划信息,对应当前传入的计划 DriveMaintencePlanInfo t = lst.FirstOrDefault(x => x.MaintenanceMonth == item.MaintenanceMonth && x.EquipmentID == item.EquipmentID); if (t != null && ((t.MaintenanceType != item.MaintenanceType) || t.PMStartMonth != item.PMStartMonth || t.Remarks != item.Remarks)) { // 修改的数据 item.ChangeDate = CurrentTime; item.ChangeUser = hm.Operator; item.MaintenanceType = t.MaintenanceType; item.PMStartMonth = t.PMStartMonth; item.Remarks = t.Remarks; OperationList[EnumOperationType.Change].Add(item); } } // 新增的计划 int[] EditEquipmentIds = OperationList[EnumOperationType.Change].Select(x => x.EquipmentID).Distinct().ToArray(); List InPlans = lst.Where(x => x.MaintenanceYear == Year && !EditEquipmentIds.Contains(x.EquipmentID)).ToList(); foreach (DriveMaintencePlanInfo item in InPlans) { item.CreatDate = CurrentTime; item.CreatUser = hm.Operator; OperationList[EnumOperationType.Add].Add(item); } // 存在新增项 List FulfillmentLst = new List(); FulfillmentLst.AddRange(OperationList[EnumOperationType.Add]); FulfillmentLst.AddRange(OperationList[EnumOperationType.Change]); if (db.Saveable(FulfillmentLst).ExecuteCommand() == FulfillmentLst.Count) { db.CommitTran(); apiResponseData.Code = 1; apiResponseData.Data = lst.Count; List logs = new List(); foreach (KeyValuePair> item in OperationList) { foreach (DriveMaintencePlanInfo data in item.Value) { DeviceInformationInfo dev = null; if (devs.ContainsKey(data.EquipmentID)) dev = devs[data.EquipmentID]; else throw new Exception($"没有查询到设备表主键编号为【{data.EquipmentID}】的数据!"); logs.Add(new PlanlogInfo { EquipmentAutoID = data.EquipmentID, EquipmentID = dev.EquipmentID, PlanMonth = data.MaintenanceMonth, PlanYear = data.MaintenanceYear, PlanType = data.MaintenanceType, OperationUser = hm.Operator, OperationUserName = hm.OperatorName, OperationComputer = hm.ClientName, OperationIP = hm.IPAddress, OperationDate = CurrentTime, OperationType = EnumOperationType.Add == item.Key ? "新增" : "修改" }); } } db.ChangeDatabase("log"); db.Insertable(logs).ExecuteCommand(); } else { db.RollbackTran(); apiResponseData.Code = -1; } } catch (SqlSugarException e) { db.RollbackTran(); apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { db.RollbackTran(); apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 获取当前年月的待保修项 /// /// public APIResponseData GetCurrentMonthPlanTips() { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { db.ChangeDatabase("main"); List tips = base.db.Queryable().ToList(); apiResponseData.Code = 1; apiResponseData.Data = tips; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 获取当前年月的待保修项数量 /// /// public APIResponseData GetCurrentMonthPlanTipsCountAsync() { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { base.db.ChangeDatabase("main"); int Count = base.db.Queryable().ToList().Count; apiResponseData.Code = 1; apiResponseData.Data = Count; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 当前年度计划完成进度 /// /// public APIResponseData GetCurrentYearPlanSchedule() { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { int CurrentMonth = DateTime.Now.Month; base.db.ChangeDatabase("main"); List Plans = CurrentDb.AsQueryable().Where(x => x.MaintenanceYear == DateTime.Now.Year && SqlFunc.HasValue(x.MaintenanceType)).ToList(); int[] planIds = Plans.Select(x => x.AutoID).ToArray(); List Records = db.Queryable().Where(x => SqlFunc.ContainsArray(planIds, x.PlanPrimaryID)).ToList(); CurrentYearPlanSchedule schedule = new CurrentYearPlanSchedule(); schedule.Total = Plans.Count; foreach (DriveMaintencePlanInfo item in Plans) { MaintenanceRecordInfo Record = Records.Where(x => x.PlanPrimaryID == item.AutoID).FirstOrDefault(); if (Record != null) { schedule.Complete++; } else { if (item.MaintenanceMonth == CurrentMonth) { schedule.Current++; } else if (item.MaintenanceMonth > CurrentMonth) { schedule.Future++; } else if (item.MaintenanceMonth < CurrentMonth) { schedule.TimeOut++; } } } apiResponseData.Code = 1; apiResponseData.Data = schedule; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 获取全部计划信息 /// /// public APIResponseData GetAllPlans() { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { db.ChangeDatabase("main"); int CurrentMonth = DateTime.Now.Month; List Datas = GetList(); int[] ids = Datas.Select(x => x.EquipmentID).ToArray(); Dictionary usDict = db.Queryable().With(SqlWith.NoLock).ToList().ToDictionary(x => x.AutoID, x => x); int[] RootIds = db.Ado.SqlQuery(@" ;WITH cte AS(SELECT AutoID FROM dbo.DeviceRoute WHERE [Name] = @Name UNION ALL SELECT dr.AutoID FROM dbo.DeviceRoute dr INNER JOIN cte ON dr.ParentID = cte.AutoID) SELECT* FROM cte", new { Name = "KH" }).ToArray(); List devLst = db.Queryable().With(SqlWith.NoLock).Where(x => SqlFunc.ContainsArray(RootIds, x.Route) && SqlFunc.ContainsArray(ids, x.AutoID)).ToList(); Datas = Datas.Where(x => devLst.Any(y => y.AutoID == x.EquipmentID)).ToList(); int[] formIds = devLst.Select(x => x.MaintenanceFormVersion).ToArray(); Dictionary devDict = devLst.ToDictionary(x => x.AutoID, x => x); int[] planIds = Datas.Select(x => x.AutoID).ToArray(); Dictionary formDict = db.Queryable().With(SqlWith.NoLock).Where(x => SqlFunc.ContainsArray(formIds, x.AutoID)).ToList().ToDictionary(x => x.AutoID, x => x); Dictionary recordDict = db.Queryable().With(SqlWith.NoLock).Where(x => SqlFunc.ContainsArray(planIds, x.PlanPrimaryID)).ToList().ToDictionary(x => x.PlanPrimaryID, x => x); List lst = new List(); Type type = typeof(AnnualMaintenancePlan); foreach (var data in Datas) { AnnualMaintenancePlan item = null; if (!lst.Any(x => x.EquipmentID == data.EquipmentID && x.MaintenanceYear == data.MaintenanceYear)) { DriveMaintencePlanInfo first = Datas.Where(x => x.EquipmentID == data.EquipmentID && x.MaintenanceYear == data.MaintenanceYear).OrderBy(x => x.CreatDate).FirstOrDefault(); DriveMaintencePlanInfo last = Datas.Where(x => x.EquipmentID == data.EquipmentID && x.MaintenanceYear == data.MaintenanceYear).OrderByDescending(x => x.ChangeDate).FirstOrDefault(); if (first != null && last != null) { item = new AnnualMaintenancePlan(); item.EquipmentID = data.EquipmentID; item.DisplayEquipmentID = devDict[data.EquipmentID].EquipmentID; item.EquipmentName = devDict[data.EquipmentID].EquipmentName; item.VersionCode = formDict.ContainsKey(devDict[data.EquipmentID].MaintenanceFormVersion) ? formDict[devDict[data.EquipmentID].MaintenanceFormVersion].VersionCode : ""; item.MaintenanceYear = data.MaintenanceYear; item.PMStartMonth = data.PMStartMonth?.ToString("yyyy-MM-dd") ?? ""; item.CreatUser = data.CreatUser; item.CreatUserName = usDict[data.CreatUser].RealName; item.CreatDate = first.CreatDate; item.ChangeDate = null; item.ChangeUser = null; item.ChangeUserName = string.Empty; item.Remarks = data.Remarks; if (last != null && last.ChangeDate.HasValue && last.ChangeUser > 0) { item.ChangeDate = last.ChangeDate; item.ChangeUser = last.ChangeUser; item.ChangeUserName = usDict[last.ChangeUser].RealName; item.Remarks = last.Remarks; item.PMStartMonth = last.PMStartMonth?.ToString("yyyy-MM-dd") ?? ""; } lst.Add(item); } } item = lst.FirstOrDefault(x => x.EquipmentID == data.EquipmentID && x.MaintenanceYear == data.MaintenanceYear); if (item != null) { EnumMonth month = (EnumMonth)(data.MaintenanceMonth); PropertyInfo prop = type.GetProperty(month + ""); prop.SetValue(item, data.MaintenanceType); EnumPlanCompleteStatus status = EnumPlanCompleteStatus.None; if (string.IsNullOrWhiteSpace(data.MaintenanceType)) status = EnumPlanCompleteStatus.None; else if (recordDict.ContainsKey(data.AutoID)) status = EnumPlanCompleteStatus.Complete; else { if (data.MaintenanceMonth == CurrentMonth) { status = EnumPlanCompleteStatus.Current; } else if (data.MaintenanceMonth > CurrentMonth) { status = EnumPlanCompleteStatus.Future; } else if (data.MaintenanceMonth < CurrentMonth) { status = EnumPlanCompleteStatus.TimeOut; } } prop = type.GetProperty(month + "Status"); prop.SetValue(item, status); } } apiResponseData.Code = 1; apiResponseData.Data = lst.OrderByDescending(x => x.ChangeDate).OrderByDescending(x => x.ChangeDate).ToList(); } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 根据设备主键ID取指定年份计划数据 /// /// /// /// public APIResponseData GetDataByEquipmentAutoIdOnYear(int Year, int EquipmentAutoID) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; View_AnnualMaintenancePlan Item = null; try { db.ChangeDatabase("main"); Item = db.Queryable().First(x => x.MaintenanceYear == Year && x.EquipmentID == EquipmentAutoID); apiResponseData.Code = 1; apiResponseData.Data = Item; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 导出EXCEL的数据 /// /// public APIResponseData ExportXlsxDatas(int Year) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { db.ChangeDatabase("main"); List lst = db.Queryable().Where(x => x.MaintenanceYear == Year)?.ToList(); apiResponseData.Code = 1; apiResponseData.Data = lst; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 获取当前计划是否存的保养记录 /// /// /// /// public APIResponseData GetPlanRecordProgress(int EquipmentID, int Year) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; try { List Datas = db.Queryable((t1, t2) => new object[] { JoinType.Inner, t1.AutoID == t2.PlanPrimaryID && t1.MaintenanceType == t2.PlanType }) .Where((t1, t2) => t2.EquipmentPrimaryID == EquipmentID) .Select((t1, t2) => new PlanProgress { PlanAutoID = t1.AutoID, PlanMonth = t1.MaintenanceMonth, PlanType = t1.MaintenanceType, PlanYear = t1.MaintenanceYear, RecordAutoID = t2.AutoID }).ToList(); apiResponseData.Code = 1; apiResponseData.Data = Datas; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 删除计划 /// /// /// /// public APIResponseData DeleteByYearAndEquipmentPk(int Year, int EquipmentAutoID) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"操作失败!" }; try { db.ChangeDatabase("main"); bool isSuccess = CurrentDb.Delete(x => x.MaintenanceYear == Year && x.EquipmentID == EquipmentAutoID); if (isSuccess) return new APIResponseData { Code = 1 }; else return apiResponseData; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } /// /// 获取设备在年度的全部保养信息 /// /// /// /// public APIResponseData GetDeviceInformationPlans(int EquipmentAutoID, int Year) { APIResponseData apiResponseData = new APIResponseData { Code = -1, Message = $"获取数据失败!" }; if (EquipmentAutoID <= 0 || Year <= 0) return new APIResponseData { Code = -1, Message = "传入的设备编号或年份参数出错!" }; try { db.ChangeDatabase("main"); // 获取设备计划信息 DeviceInformationInfo Dev = db.Queryable().First(x => x.AutoID == EquipmentAutoID); if (Dev == null) throw new Exception($"编号为:{EquipmentAutoID} 的设备不存在!"); // 获取计划信息 List plans = db.Queryable().Where(x => x.EquipmentID == EquipmentAutoID && x.MaintenanceYear == Year && SqlFunc.HasValue(x.MaintenanceType)).ToList(); if ((plans?.Count ?? 0) == 0) throw new Exception($"编号为:{EquipmentAutoID} 的设备计划为空!"); int[] pIds = plans.Select(x => x.AutoID).ToArray(); // 获取保养的记录信息 List records = db.Queryable().Where(x => x.EquipmentPrimaryID == EquipmentAutoID && SqlFunc.ContainsArray(pIds, x.PlanPrimaryID)).ToList(); DeviceAnnPlanView devs = new DeviceAnnPlanView { Dev = Dev, Plans = plans, Records = records }; if (Dev.MaintenanceFormVersion != 0) devs.CurrentFormCode = db.Queryable().First(x => x.AutoID == Dev.MaintenanceFormVersion)?.VersionCode; apiResponseData.Code = 1; apiResponseData.Message = ""; apiResponseData.Data = devs; } catch (SqlSugarException e) { apiResponseData.Code = -1; apiResponseData.Message = e.Message; } catch (Exception ex) { apiResponseData.Code = -1; apiResponseData.Message = ex.Message; } return apiResponseData; } } }