/// <summary> /// Возвращать на предыдущий этап /// </summary> /// <param name="declarationId"></param> /// <param name="fromStageId"></param> /// <param name="nextStageIds"></param> /// <param name="resultDescription"></param> /// <returns></returns> public bool ToBackStage(Guid declarationId, Guid?fromStageId, int[] nextStageIds, out string resultDescription) { resultDescription = null; var stageStatusInRework = GetStageStatusByCode(EXP_DIC_StageStatus.InReWork); string[] activeStageCodes = { EXP_DIC_StageStatus.InWork, EXP_DIC_StageStatus.InReWork }; var currentStage = fromStageId != null?AppContext.EXP_ExpertiseStage.FirstOrDefault(e => e.Id == fromStageId) : AppContext.EXP_ExpertiseStage.FirstOrDefault(e => e.DeclarationId == declarationId && activeStageCodes.Contains(e.EXP_DIC_StageStatus.Code)); if (currentStage != null) { currentStage.StatusId = GetStageStatusByCode(EXP_DIC_StageStatus.Completed).Id; currentStage.FactEndDate = DateTime.Now; } foreach (var nextStageId in nextStageIds) { if (!CanSendToStep(declarationId, fromStageId, nextStageId, out resultDescription)) { return(false); } var oldStage = AppContext.EXP_ExpertiseStage.FirstOrDefault(es => es.IsHistory == false && es.DeclarationId == declarationId && es.StageId == nextStageId); var dosageIds = AppContext.EXP_DrugDosage.Where(e => e.DrugDeclarationId == declarationId) .Select(e => e.Id) .ToList(); if (oldStage != null) { var newStage = new EXP_ExpertiseStage() { Id = Guid.NewGuid(), DeclarationId = declarationId, StageId = nextStageId, ParentStageId = oldStage?.Id, StatusId = stageStatusInRework.Id, OtdIds = oldStage.OtdIds }; newStage.Executors = oldStage.Executors; AppContext.EXP_ExpertiseStage.Add(newStage); oldStage.IsHistory = true; foreach (var dosageId in dosageIds) { var newDosageStage = new EXP_ExpertiseStageDosage() { Id = Guid.NewGuid(), DosageId = dosageId, EXP_ExpertiseStage = newStage }; newStage.EXP_ExpertiseStageDosage.Add(newDosageStage); switch (oldStage.EXP_DIC_Stage.Code) { case EXP_DIC_Stage.PharmacologicalExp: var oldpcolFinalDoc = AppContext.EXP_ExpertisePharmacologicalFinalDoc.FirstOrDefault( pc => pc.EXP_ExpertiseStageDosage.DosageId == dosageId && pc.EXP_ExpertiseStageDosage.StageId == oldStage.Id); if (oldpcolFinalDoc != null) { var newpcolFinalDoc = new EXP_ExpertisePharmacologicalFinalDoc(oldpcolFinalDoc); newpcolFinalDoc.DosageStageId = newDosageStage.Id; newpcolFinalDoc.EXP_ExpertiseStageDosage = newDosageStage; newDosageStage.EXP_ExpertisePharmacologicalFinalDoc.Add(newpcolFinalDoc); } break; case EXP_DIC_Stage.PharmaceuticalExp: var oldpceuFinalDoc = AppContext.EXP_ExpertisePharmaceuticalFinalDoc.FirstOrDefault( pc => pc.EXP_ExpertiseStageDosage.DosageId == dosageId && pc.EXP_ExpertiseStageDosage.StageId == oldStage.Id); if (oldpceuFinalDoc != null) { var newpceulFinalDoc = new EXP_ExpertisePharmaceuticalFinalDoc(oldpceuFinalDoc); newpceulFinalDoc.DosageStageId = newDosageStage.Id; newpceulFinalDoc.EXP_ExpertiseStageDosage = newDosageStage; newDosageStage.EXP_ExpertisePharmaceuticalFinalDoc.Add(newpceulFinalDoc); } break; } } AppContext.EXP_ExpertiseStage.Add(newStage); } } AppContext.SaveChanges(); return(true); }
private bool ToNextStage(EXP_DrugDeclaration declaration, Guid?fromStageId, int[] nextStageIds, out string resultDescription) { resultDescription = null; string[] activeStageCodes = { EXP_DIC_StageStatus.New, EXP_DIC_StageStatus.InWork, EXP_DIC_StageStatus.InReWork }; var currentStage = fromStageId != null?AppContext.EXP_ExpertiseStage.FirstOrDefault(e => e.Id == fromStageId) : AppContext.EXP_ExpertiseStage.FirstOrDefault(e => e.DeclarationId == declaration.Id && activeStageCodes.Contains(e.EXP_DIC_StageStatus.Code)); var dosageIds = AppContext.EXP_DrugDosage.Where(e => e.DrugDeclarationId == declaration.Id) .Select(e => e.Id) .ToList(); var stageStatusNew = GetStageStatusByCode(EXP_DIC_StageStatus.New); var stageStatusRework = GetStageStatusByCode(EXP_DIC_StageStatus.InReWork); //закрываем предыдущий этап if (currentStage != null) { currentStage.StatusId = GetStageStatusByCode(EXP_DIC_StageStatus.Completed).Id; currentStage.FactEndDate = DateTime.Now; } foreach (var nextStageId in nextStageIds) { if (!CanSendToStep(declaration.Id, fromStageId, nextStageId, out resultDescription)) { return(false); } //если имеется уже выполняющийся этап то продолжаем его дальше if (AppContext.EXP_ExpertiseStage.Any(e => e.DeclarationId == declaration.Id && e.StageId == nextStageId && e.EXP_DIC_StageStatus.Code != EXP_DIC_StageStatus.Completed && !e.IsHistory)) { continue; } var oldStage = AppContext.EXP_ExpertiseStage.FirstOrDefault(es => es.IsHistory == false && es.DeclarationId == declaration.Id && es.StageId == nextStageId); if (oldStage == null) { var daysOnStage = GetExpStageDaysOnExecution(declaration.TypeId, nextStageId); var startDate = DateTime.Now; var newStage = new EXP_ExpertiseStage() { Id = Guid.NewGuid(), DeclarationId = declaration.Id, StageId = nextStageId, ParentStageId = currentStage != null ? (Guid?)currentStage.Id : null, StatusId = stageStatusNew.Id, StartDate = startDate, EndDate = daysOnStage != null ? (DateTime?)startDate.AddDays(daysOnStage.Value) : null }; //todo брать руководителя цоз из настроек newStage.Executors.Add(GetExecutorByDicStageId(nextStageId)); foreach (var dosageId in dosageIds) { newStage.EXP_ExpertiseStageDosage.Add(new EXP_ExpertiseStageDosage() { Id = Guid.NewGuid(), DosageId = dosageId, EXP_ExpertiseStage = newStage }); } AppContext.EXP_ExpertiseStage.Add(newStage); } else { var reworkStage = new EXP_ExpertiseStage() { Id = Guid.NewGuid(), DeclarationId = declaration.Id, StageId = nextStageId, ParentStageId = currentStage != null ? (Guid?)currentStage.Id : null, StatusId = stageStatusRework.Id, StartDate = oldStage.StartDate, EndDate = oldStage.EndDate, OtdIds = oldStage.OtdIds, OtdRemarks = oldStage.OtdRemarks }; reworkStage.Executors.AddRange(oldStage.Executors); foreach (var dossageStage in oldStage.EXP_ExpertiseStageDosage) { var reworkDosage = new EXP_ExpertiseStageDosage() { Id = Guid.NewGuid(), DosageId = dossageStage.DosageId, EXP_ExpertiseStage = reworkStage }; foreach (var primaryFinalDoc in dossageStage.PrimaryFinalDocs) { var docClone = new EXP_ExpertisePrimaryFinalDoc(primaryFinalDoc); docClone.Id = Guid.NewGuid(); docClone.EXP_ExpertiseStageDosage = reworkDosage; docClone.DosageStageId = reworkStage.Id; reworkDosage.PrimaryFinalDocs.Add(docClone); } foreach (var pharmaceuticalFinalDoc in dossageStage.EXP_ExpertisePharmaceuticalFinalDoc) { var docClone = new EXP_ExpertisePharmaceuticalFinalDoc(pharmaceuticalFinalDoc); docClone.Id = Guid.NewGuid(); docClone.EXP_ExpertiseStageDosage = reworkDosage; docClone.DosageStageId = reworkStage.Id; reworkDosage.EXP_ExpertisePharmaceuticalFinalDoc.Add(docClone); } foreach (var pharmacologicalFinalDoc in dossageStage.EXP_ExpertisePharmacologicalFinalDoc) { var docClone = new EXP_ExpertisePharmacologicalFinalDoc(pharmacologicalFinalDoc); docClone.Id = Guid.NewGuid(); docClone.EXP_ExpertiseStageDosage = reworkDosage; docClone.DosageStageId = reworkStage.Id; reworkDosage.EXP_ExpertisePharmacologicalFinalDoc.Add(docClone); } foreach (var safetyreportFinalDoc in dossageStage.EXP_ExpertiseSafetyreportFinalDoc) { var docClone = new EXP_ExpertiseSafetyreportFinalDoc(safetyreportFinalDoc); docClone.Id = Guid.NewGuid(); docClone.EXP_ExpertiseStageDosage = reworkDosage; docClone.DosageStageId = reworkStage.Id; reworkDosage.EXP_ExpertiseSafetyreportFinalDoc.Add(docClone); } foreach (var analiseIndicator in dossageStage.EXP_DrugAnaliseIndicator) { var docClone = new EXP_DrugAnaliseIndicator(analiseIndicator); docClone.Id = Guid.NewGuid(); docClone.EXP_ExpertiseStageDosage = reworkDosage; docClone.DosageStageId = reworkStage.Id; reworkDosage.EXP_DrugAnaliseIndicator.Add(docClone); } reworkStage.EXP_ExpertiseStageDosage.Add(reworkDosage); } AppContext.EXP_ExpertiseStage.Add(reworkStage); oldStage.IsHistory = true; } } AppContext.SaveChanges(); return(true); }