using AutoMapper; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Ropin.Core.Common; using Ropin.Inspection.Common; using Ropin.Inspection.Common.Accessor.Interface; using Ropin.Inspection.Common.Helper; using Ropin.Inspection.Model; using Ropin.Inspection.Model.Entities; using Ropin.Inspection.Repository; using Ropin.Inspection.Repository.DEV.Interface; using Ropin.Inspection.Repository.Interface; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; namespace Ropin.Inspection.Service { public class TdevDevStoreService : ITdevDevStoreService { private readonly ITdevDevStoreRepository _repository; private readonly ITdevDevStoreLogRepository _tdevDevStoreLogRepository; private readonly IMapper _mapper; private readonly IClaimsAccessor _claims; private readonly InspectionDbContext _sqlDBContext; private readonly ITmtnDevOpsRecordRepository _tmtnDevOpsRecordRepository; private readonly ITdevMaintenanceTemplateRepository _maintenanceTemplateRepository; private readonly IUnitOfWork _unitOfWork; private readonly ITdevDevStoreDocRepository _devStoreDocRepository; private readonly ITdevWebScadaDevSpotRepository _devWebScadaDevSpotRepository; private readonly Idev_DevOpeAccountConfigRepository _devOpeAccountConfigRepository; public TdevDevStoreService(ITmtnDevOpsRecordRepository tmtnDevOpsRecordRepository,IClaimsAccessor claims, InspectionDbContext sqlDBContext, ITdevDevStoreLogRepository tdevDevStoreLogRepository, ITdevDevStoreRepository repository, IMapper mapper, ITdevMaintenanceTemplateRepository maintenanceTemplateRepository, IUnitOfWork unitOfWork, ITdevDevStoreDocRepository devStoreDocRepository, ITdevWebScadaDevSpotRepository devWebScadaDevSpotRepository, Idev_DevOpeAccountConfigRepository devOpeAccountConfigRepository) { _repository = repository; _tdevDevStoreLogRepository = tdevDevStoreLogRepository; _mapper = mapper; _claims = claims; _sqlDBContext = sqlDBContext; _tmtnDevOpsRecordRepository = tmtnDevOpsRecordRepository; _maintenanceTemplateRepository = maintenanceTemplateRepository; _unitOfWork = unitOfWork; _devStoreDocRepository = devStoreDocRepository; _devWebScadaDevSpotRepository = devWebScadaDevSpotRepository; _devOpeAccountConfigRepository = devOpeAccountConfigRepository; } public async Task GetDevStoreByQRCodeAsync(string qRCode, string storeCode) { var content = await _repository.GetDevStoreByQRCodeAsync(qRCode, storeCode); return content; } public async Task GetUserByDevStoreIdAndRoleNameAsync(string devStoreId, string roleName) { var content = await _repository.GetUserByDevStoreIdAndRoleNameAsync(devStoreId, roleName); return content; } public async Task DevOperateByQRCodeAsync(DevOperateCreateModel mode) { var content = await _repository.GetByIdAsync(mode.C_DevStoreCode); if (content == null) { throw new Exception("数据库中没有此数据"); } content.C_LastUpdatedBy = _claims.Linsence==null? _claims.ApiUserId:Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"); content.D_LastUpdatedOn = DateTime.Now; content.C_Status = mode.C_Type; _repository.Update(content); var result = await _repository.SaveAsync(); if (!result) { throw new Exception("操作失败"); } //运行台账 if (mode.C_Type == ((int)DevStatusEnum.Stop).ToString()) { var devStoreLogSet = _sqlDBContext.GetDbSet().AsNoTracking(); var devStoreStartLog = devStoreLogSet.Where(x => x.C_Type == ((int)DevStatusEnum.Start).ToString()).OrderByDescending(x => x.D_CreateOn).Take(1).FirstOrDefault(); if (devStoreStartLog == null) goto next; var devstore_log_datas = devStoreLogSet.Where(t => t.C_DeviceCode == mode.C_DevStoreCode && t.D_CreateOn > devStoreStartLog.D_CreateOn).OrderByDescending(x => x.D_CreateOn);//.Take(5) bool isAlarm = devstore_log_datas.Where(t=>t.C_Type == ((int)DevStatusEnum.Alarm).ToString()).Any()? true:false; var devOpeAccountS = _sqlDBContext.GetDbSet(); //读取特性,属性名 //PropertyInfo[] peroperties = typeof(TdevDevOpeContentViewModel).GetProperties(BindingFlags.Public | BindingFlags.Instance); //foreach (PropertyInfo property in peroperties) //{ // object[] objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true); // if (objs.Length > 0) // { // Console.WriteLine("{0}: {1}", property.Name, ((DescriptionAttribute)objs[0]).Description); // } //} //var result = await FanyiHelper.GetWebScadaDevSpotValue(boxno, storeCode, names, unitNames, groupnames, calFormula, _nodeServices, calFormulaList); var devStore = await GetConditionAsync(new TdevDevStoreSearchModel { C_ID = mode.C_DevStoreCode }); TdevDevStoreRunSpotConfigViewModel runSpotConfig = JsonConvert.DeserializeObject(devStore.FirstOrDefault().C_RunSpotConfig); var devSpotGroupNames = runSpotConfig?.RunSpotConfigList?.Where(x=>x.BReadDevSpot == true).Select(y=>y.DevSpotGroupName).ToList(); var devSpotNames = runSpotConfig?.RunSpotConfigList?.Where(x => x.BReadDevSpot == true).Select(y => y.DevSpotName).ToList(); var devSpotBoxNos = runSpotConfig?.RunSpotConfigList?.Where(x => x.BReadDevSpot ==true).Select(y => y.DevSpotBoxNo).ToList(); //if(devSpotBoxNos.Any()) var devSpotValues = await FanyiHelper.GetDevSpotValue(devSpotBoxNos.FirstOrDefault(), devSpotNames, devSpotGroupNames); var solidWasteRecordItems = await _tmtnDevOpsRecordRepository.GetRecordsConditionAsync(new TmtnDevOpsRecordDetailSearchModel { bSolidWaste = true, C_DevStoreCode = mode.C_DevStoreCode, IsPagination = false, Start = devStoreStartLog.D_CreateOn ,End = DateTime.Now}); List DevOpsRecordSolidWaste = new List(); if(solidWasteRecordItems.Any()&& solidWasteRecordItems.FirstOrDefault()!=null) foreach (var item in solidWasteRecordItems.ToList()) { if (item.C_Status == "7") { if (!string.IsNullOrWhiteSpace(item.C_SolidWaste)) DevOpsRecordSolidWaste.Add(JsonConvert.DeserializeObject(item.C_SolidWaste)); } } //DevOpsRecordSolidWaste.ForEach(x => { // if (x.RoleName.Contains("设备管理员")) // vm.DevManager += x.C_Name + " " + x.C_Mobile + " "; // if (x.RoleName.Contains("设备运维员")) // vm.DevOpser += x.C_Name + " " + x.C_Mobile + " "; //}); TdevDevOpeContentViewModel devOpeContent = new TdevDevOpeContentViewModel { Date = DateTime.Now,//.ToString("yyyy-MM-dd HH:mm:ss.fff") DrainOutletNumber = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DrainOutletNumber").FirstOrDefault().Value, DevStoreName = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DevStoreName").FirstOrDefault().Value, DevStoreType = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DevStoreType").FirstOrDefault().Value, SpecificationsParameterName = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "SpecificationsParameterName").FirstOrDefault().Value, SpecificationsDesignValue = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "SpecificationsDesignValue").FirstOrDefault().Value, SpecificationsUnit = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "SpecificationsUnit").FirstOrDefault().Value, RunStartTime = devStoreStartLog.D_CreateOn, RunEndTime = DateTime.Now, RunWhetherNormal = isAlarm, FlueGasVolume = devSpotValues?.Where(x => x.name == devSpotNames.FirstOrDefault()).FirstOrDefault()?.value.ToString(), //FlueGasVolumeid PollutionFactor = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "PollutionFactor").FirstOrDefault().Value, GovernanceEfficiency = devSpotValues?.Where(x => x.name == devSpotNames.ElementAtOrDefault(1)).FirstOrDefault()?.value.ToString(), DataSources = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DataSources").FirstOrDefault().Value, HeightOfFlue = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "HeightOfFlue").FirstOrDefault().Value, DischargeTemperature = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DischargeTemperature").FirstOrDefault().Value, Pressure = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "Pressure").FirstOrDefault().Value, DischargeTime = (DateTime.Now - devStoreStartLog.D_CreateOn).TotalHours.ToString("F2"), ConsumablePowerConsumption = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "ConsumablePowerConsumption").FirstOrDefault().Value, ConsumableName = DevOpsRecordSolidWaste.Any()? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.NameSpecification).ToList().ToArray()):"/" , // runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "ConsumableName").FirstOrDefault().Value, ConsumableReplacementQuantity = DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.SpecificationNumber).ToList().ToArray()) : "/",//runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "ConsumableReplacementQuantity").FirstOrDefault().Value, WasteName = DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.SolidWasteUnit).ToList().ToArray()) : "/", //runSpotConfig?.RunSpotConfigList?.Where(x=>x.Name == "WasteName").FirstOrDefault().Value, WasteProduction = DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.SolidWasteNumber).ToList().ToArray()) : "/", //runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "WasteProduction").FirstOrDefault().Value, //C_Content = "", //C_Remark = "", //C_CreateBy = _claims.ApiUserId, //D_CreateOn = DateTime.Now }; await devOpeAccountS.AddRangeAsync(new TDEV_DevOpeAccount { C_ID = Guid.NewGuid().ToString(), C_DevStoreCode = mode.C_DevStoreCode, C_Content = JsonConvert.SerializeObject(devOpeContent), C_Remark ="", C_CreateBy = _claims.Linsence == null ? _claims.ApiUserId : Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"), D_CreateOn = DateTime.Now }); var qty = await _sqlDBContext.SaveChangesAsync(); } next: await _tdevDevStoreLogRepository.CreateOneAsync(new TDEV_DevStoreLog { C_ID = Guid.NewGuid().ToString(), C_DeviceCode = mode.C_DevStoreCode, C_LogMsg = mode.C_LogMsg, C_Type = mode.C_Type, C_CreateBy = _claims.Linsence == null ? _claims.ApiUserId : Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"), D_CreateOn = DateTime.Now }); result = await _tdevDevStoreLogRepository.SaveAsync(); if (!result) { throw new Exception("操作失败"); } } public async Task CreateOneAsync(TdevDevStoreViewModel viewModel) { var id = Guid.NewGuid().ToString(); var path = QRCoderHelper.RenderQrCode(id, "M", _claims.Linsence); var content = _mapper.Map(viewModel); content.C_ID = id; content.C_CreateBy = _claims.ApiUserId; content.D_CreateOn = DateTime.Now; content.C_Status = "1"; content.C_DevQRUrl = path; _repository.Create(content); var result = await _repository.SaveAsync(); if (!result) { throw new Exception("创建失败"); } } public async Task CopyCreateOneAsync(string oldId) { TDEV_DevStore content = await _repository.GetByIdAsync(oldId); if (content==null) { throw new Exception("没有此数据"); } bool result = false; _unitOfWork.BeginTransaction(); try { string newId = Guid.NewGuid().ToString(); var path = QRCoderHelper.RenderQrCode(newId, "M", _claims.Linsence); //var content = _mapper.Map(viewModel); content.C_ID = newId; content.C_Name = content.C_Name + "-拷贝"; content.C_CreateBy = _claims.ApiUserId; content.D_CreateOn = DateTime.Now; content.C_Status = "1"; content.C_DevQRUrl = path; content.C_LastUpdatedBy = null; content.D_LastUpdatedOn = null; result = await _unitOfWork.RegisterNew(content); if (result) { TDEV_DevOpeAccountConfig cofMode = new TDEV_DevOpeAccountConfig(); var DevOpeAccountConfigMode = await _devOpeAccountConfigRepository.GetByConditionAsync(t => t.C_DevStoreCode == oldId); if (DevOpeAccountConfigMode!=null&&DevOpeAccountConfigMode.Count()>0) { var cofEntity = DevOpeAccountConfigMode?.OrderByDescending(t => t.D_CreateOn).FirstOrDefault(); if (cofEntity!=null) { cofMode.C_ID = Guid.NewGuid().ToString(); cofMode.C_DevStoreCode = content.C_ID; cofMode.C_Config = cofEntity.C_Config; cofMode.C_Remark= content.C_Remark; cofMode.C_CreateBy = _claims.ApiUserId; cofMode.D_CreateOn= DateTime.Now; result = await _unitOfWork.RegisterNew(cofMode); } } var WebScadaDevSpot= await _devWebScadaDevSpotRepository.GetByConditionAsync(t => t.C_DevCode == oldId); List webList = new List(); foreach (var item in WebScadaDevSpot) { if (item!=null) { TDEV_WebScadaDevSpot tDEV_Web = new TDEV_WebScadaDevSpot(); tDEV_Web = item; tDEV_Web.C_ID = Guid.NewGuid().ToString(); tDEV_Web.C_Name = item.C_Name; tDEV_Web.C_ControlID=item.C_ControlID; tDEV_Web.C_DevCode = content.C_ID; tDEV_Web.C_LastUpdatedBy = null; tDEV_Web.D_LastUpdatedOn = null; tDEV_Web.C_CreateBy = _claims.ApiUserId; tDEV_Web.D_CreateOn = DateTime.Now; webList.Add(tDEV_Web); } } if (webList!=null&& webList.Count>0) { result = await _unitOfWork.RegisterRangeNew(webList.ToList()); } var doc = await _devStoreDocRepository.GetByConditionAsync(t => t.C_DevStoreCode == oldId); List docList = new List(); foreach (var item in doc) { if (item != null) { item.C_ID = Guid.NewGuid().ToString(); item.C_DevStoreCode = content.C_ID; item.C_LastUpdatedBy = null; item.D_LastUpdatedOn = null; item.C_CreateBy = _claims.ApiUserId; item.D_CreateOn = DateTime.Now; docList.Add(item); } } if (docList!=null&& docList.Count>0) { result = await _unitOfWork.RegisterRangeNew(docList.ToList()); } } } catch { result = false; throw; } finally { if (result) await _unitOfWork.CommitAsync(); else _unitOfWork.Rollback(); } } public async Task GetDevStoreQRCodeAsync(string devStore) { var path = QRCoderHelper.RenderQrCode(devStore, "M", _claims.Linsence); var content = await _repository.GetByIdAsync(devStore); if (content == null) { throw new Exception("没有此数据"); } content.C_LastUpdatedBy = _claims.ApiUserId; content.D_LastUpdatedOn = DateTime.Now; content.C_DevQRUrl = path; _repository.Update(content); var result = await _repository.SaveAsync(); if (!result) { throw new Exception("更新失败"); } return await Task.FromResult(path); } public async Task DeleteAsync(string id) { var content = await _repository.GetByIdAsync(id); if (content == null) { throw new Exception("数据库中没有此数据"); } //_repository.Delete(content); //var result = await _repository.SaveAsync(); content.C_LastUpdatedBy = _claims.ApiUserId; content.D_LastUpdatedOn = DateTime.Now; content.C_Status = "0"; _repository.Update(content); var result = await _repository.SaveAsync(); if (!result) { throw new Exception("删除失败"); } } public async Task DeleteByConditionAsync(string code) { var items = await _repository.GetByConditionAsync(C => C.C_ID == code); var content = items.FirstOrDefault(); if (content == null) { throw new Exception("没有此数据"); } content.C_LastUpdatedBy = _claims.ApiUserId; content.D_LastUpdatedOn = DateTime.Now; content.C_Status = "0"; _repository.Update(content); var result = await _repository.SaveAsync(); if (!result) { throw new Exception("删除失败"); } } public async Task> GetAllAsync() { var pagedList = await _repository.GetAllAsync(); var contentDtoList = _mapper.Map>(pagedList.Where(i => i.C_Status == "1").ToList()); return contentDtoList.ToList(); } public async Task> GetConditionAsync(TdevDevStoreSearchModel searchModel) { IEnumerable list = await _repository.GetConditionAsync(searchModel, _claims?.LicenseTypeCode, _claims?.ApiUserId.ToString()); searchModel.TotalCount = list.ToList().Count; return list; } public async Task> GetDevStoreStatusCount(TdevDevStoreSearchModel searchModel) { return await _repository.GetDevStoreStatusCount(searchModel, _claims?.LicenseTypeCode, _claims?.ApiUserId.ToString()); } public async Task GetByIdAsync(string id) { var content = await _repository.GetByIdAsync(id); var contentDto = _mapper.Map(content); return contentDto; } public async Task UpdateAsync(string code, TdevDevStoreUpdateModel updateModel) { var items = await _repository.GetByConditionAsync(C => C.C_ID == code); var content = items.FirstOrDefault(); if (content == null) { throw new Exception("没有此数据"); } List MTCodes = new List { updateModel.C_OpsTempCode, updateModel.C_RepairTempCode, updateModel.C_RunTempCode }; //验证模板是否禁用 var templates = await _maintenanceTemplateRepository.GetByConditionAsync(x => MTCodes.Contains(x.C_ID)); foreach (var template in templates) { if (template.C_Status == "0") { throw new Exception("存在已禁用的模板"); } } content.C_LastUpdatedBy = _claims.Linsence == null ? _claims.ApiUserId : Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"); content.D_LastUpdatedOn = DateTime.Now; _mapper.Map(updateModel, content, typeof(TdevDevStoreUpdateModel), typeof(TDEV_DevStore)); _repository.Update(content); var result = await _repository.SaveAsync(); if (!result) { throw new Exception("更新失败"); } } //保存运行台账配置 public async Task UpdateDevStoreRunSpotConfigAsync(string code, TdevDevStoreRunSpotConfigViewModel updateModel) { var items = await _repository.GetByConditionAsync(C => C.C_ID == code); var content = items.FirstOrDefault(); if (content == null) { throw new Exception("没有此数据"); } bool result = false; _unitOfWork.BeginTransaction(); try { TDEV_DevOpeAccountConfig config = new TDEV_DevOpeAccountConfig(); config.C_ID = Guid.NewGuid().ToString(); config.C_DevStoreCode = code; config.C_Config = JsonConvert.SerializeObject(updateModel); config.C_CreateBy = _claims.ApiUserId; config.D_CreateOn = DateTime.Now; result = await _unitOfWork.RegisterNew(config); if (!result) { throw new Exception("更新失败"); } else { content.C_LastUpdatedBy = _claims.ApiUserId; content.D_LastUpdatedOn = DateTime.Now; content.C_RunSpotConfig = JsonConvert.SerializeObject(updateModel); _repository.Update(content); result = await _repository.SaveAsync(); } } catch { _unitOfWork.Rollback(); throw; } finally { if (result) await _unitOfWork.CommitAsync(); else _unitOfWork.Rollback(); } } public async Task UpdateDevStoreUserConfigAsync(string code, TdevDevStoreUserConfigViewModel updateModel) { var items = await _repository.GetByConditionAsync(C => C.C_ID == code); var content = items.FirstOrDefault(); if (content == null) { throw new Exception("没有此数据"); } content.C_LastUpdatedBy = _claims.ApiUserId; content.D_LastUpdatedOn = DateTime.Now; content.C_UserConfig = JsonConvert.SerializeObject(updateModel.UserConfigList); _repository.Update(content); var result = await _repository.SaveAsync(); if (!result) { throw new Exception("更新失败"); } } public Task UpdateOneAsync(TdevDevStoreViewModel viewModel, params string[] fields) { throw new NotImplementedException(); } public Task IsExistAsync(string id) { throw new NotImplementedException(); } public Task> GetByConditionAsync(Expression> expression) { throw new NotImplementedException(); } public Task UpdateAsync(string code, TpntAreaUpdateModel updateModel) { throw new NotImplementedException(); } public Task> GetConditionAsync(TpntAreaSearchModel searchModel) { throw new NotImplementedException(); } } }