using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using EmitMapper; using EmitMapper.MappingConfiguration; using Newtonsoft.Json.Linq; namespace BLL { /// /// 考试计划 /// public static class APITestPlanService { #region 根据projectId、states获取考试计划列表 /// /// 根据projectId、states获取考试计划列表 /// /// 项目ID /// 状态(0-待提交;1-已发布;2-考试中;3考试结束) /// public static List getTestPlanListByProjectIdStates(string projectId, string states) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { if (string.IsNullOrEmpty(projectId)) { var getDataLists = (from x in db.Training_TestPlan where x.ProjectId ==null && (x.States == states || states == null) orderby x.TestStartTime descending select new Model.TestPlanItem { TestPlanId = x.TestPlanId, TestPlanCode = x.PlanCode, TestPlanName = x.PlanName, ProjectId = x.ProjectId, DepartIds = x.DepartIds, DepartNames = WorkPostService.getDepartNamesByIdsForApi(x.DepartIds), TestPlanManId = x.PlanManId, TestPlanManName = db.Sys_User.First(y => y.UserId == x.PlanManId).UserName, TestPalce = x.TestPalce, TestStartTime = string.Format("{0:yyyy-MM-dd HH:mm}", x.TestStartTime), TestEndTime = string.Format("{0:yyyy-MM-dd HH:mm}", x.TestEndTime), States = x.States, QRCodeUrl = x.QRCodeUrl.Replace('\\', '/'), }).ToList(); return getDataLists; } else { var getDataLists = (from x in db.Training_TestPlan where x.ProjectId == projectId && (x.States == states || states == null) orderby x.TestStartTime descending select new Model.TestPlanItem { TestPlanId = x.TestPlanId, TestPlanCode = x.PlanCode, TestPlanName = x.PlanName, ProjectId = x.ProjectId, TestPlanManId = x.PlanManId, DepartIds = x.DepartIds, DepartNames = WorkPostService.getDepartNamesByIdsForApi(x.DepartIds), TestPlanManName = db.Sys_User.First(y => y.UserId == x.PlanManId).UserName, TestPalce = x.TestPalce, TestStartTime = string.Format("{0:yyyy-MM-dd HH:mm}", x.TestStartTime), TestEndTime = string.Format("{0:yyyy-MM-dd HH:mm}", x.TestEndTime), States = x.States, QRCodeUrl = x.QRCodeUrl.Replace('\\', '/'), }).ToList(); return getDataLists; } } } #endregion #region 根据考试ID获取考试计划详细 /// /// 根据考试ID获取考试计划详细 /// /// /// public static Model.TestPlanItem getTestPlanByTestPlanId(string testPlanId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var getDataLists = (from x in db.Training_TestPlan where x.TestPlanId == testPlanId select new Model.TestPlanItem { TestPlanId = x.TestPlanId, ProjectId = x.ProjectId, TestPlanCode = x.PlanCode, TestPlanName = x.PlanName, TestPlanManId = x.PlanManId, TestPlanDate = string.Format("{0:yyyy-MM-dd HH:mm}", x.PlanDate), TestStartTime = string.Format("{0:yyyy-MM-dd HH:mm}", x.TestStartTime), TestEndTime = string.Format("{0:yyyy-MM-dd HH:mm}", x.TestEndTime), Duration = x.Duration, SValue = x.SValue, MValue = x.MValue, JValue = x.JValue, TotalScore = x.TotalScore ?? 0, QuestionCount = x.QuestionCount ?? 0, TestPalce = x.TestPalce, UnitIds = x.UnitIds, UnitNames = UnitService.getUnitNamesUnitIdsForApi(x.UnitIds), WorkPostIds = x.WorkPostIds, WorkPostNames = WorkPostService.getWorkPostNamesWorkPostIdsForApi(x.WorkPostIds), DepartIds = x.DepartIds, DepartNames = WorkPostService.getDepartNamesByIdsForApi(x.DepartIds), States = x.States, QRCodeUrl = x.QRCodeUrl.Replace('\\', '/'), TrainingPlanId = x.PlanId, TrainTypeId= x.TrainTypeId, TrainTypeName = db.Base_TrainType.Where(xx=>xx.TrainTypeId==x.TrainTypeId).Select(xx=>xx.TrainTypeName).FirstOrDefault() }).FirstOrDefault(); if (getDataLists != null) { var user = db.Sys_User.FirstOrDefault(y => y.UserId == getDataLists.TestPlanManId); if (user != null) getDataLists.TestPlanManName = user.UserName; if (!string.IsNullOrEmpty(getDataLists.UnitIds)) { string[] uids = getDataLists.UnitIds.Split(','); var units = db.Base_Unit.Where(x => uids.Contains(x.UnitId)).ToList(); string unitName = ""; foreach(var u in units) { unitName += u.UnitName + ","; } if (!string.IsNullOrEmpty(unitName)) { getDataLists.UnitNames = unitName; } } } return getDataLists; } } #endregion #region 保存考试计划 /// /// 保存TestPlan /// /// 考试计划记录 public static string SaveTestPlan(Model.TestPlanItem getTestPlan) { string alterStr =string.Empty ; using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { Model.Training_TestPlan newTestPlan = new Model.Training_TestPlan { TestPlanId = getTestPlan.TestPlanId, PlanCode = getTestPlan.TestPlanCode, PlanName = getTestPlan.TestPlanName, PlanManId = getTestPlan.TestPlanManId, //PlanDate= getTestPlan.TestPlanDate, TestStartTime = Funs.GetNewDateTimeOrNow(getTestPlan.TestStartTime), TestEndTime = Funs.GetNewDateTimeOrNow(getTestPlan.TestEndTime), Duration = getTestPlan.Duration, SValue = getTestPlan.SValue, MValue = getTestPlan.MValue, JValue = getTestPlan.JValue, TotalScore = getTestPlan.TotalScore, QuestionCount = getTestPlan.QuestionCount, TestPalce = getTestPlan.TestPalce, UnitIds = getTestPlan.UnitIds, WorkPostIds = getTestPlan.WorkPostIds, DepartIds = getTestPlan.DepartIds, States = getTestPlan.States, PlanDate = DateTime.Now, TrainTypeId=getTestPlan.TrainTypeId }; if (!string.IsNullOrEmpty(getTestPlan.ProjectId)) { newTestPlan.ProjectId = getTestPlan.ProjectId; } if (!string.IsNullOrEmpty(getTestPlan.TrainingPlanId)) { newTestPlan.PlanId = getTestPlan.TrainingPlanId; } var isUpdate = db.Training_TestPlan.FirstOrDefault(x => x.TestPlanId == newTestPlan.TestPlanId); if (isUpdate == null) { string unitId = string.Empty; var user = db.Sys_User.FirstOrDefault(e => e.UserId == newTestPlan.PlanManId); if (user != null) { unitId = user.UnitId; } newTestPlan.PlanCode = CodeRecordsService.ReturnCodeByMenuIdProjectId(Const.ProjectTestPlanMenuId, newTestPlan.ProjectId, unitId); if (string.IsNullOrEmpty(newTestPlan.TestPlanId)) { newTestPlan.TestPlanId = SQLHelper.GetNewID(); } db.Training_TestPlan.InsertOnSubmit(newTestPlan); db.SubmitChanges(); CodeRecordsService.InsertCodeRecordsByMenuIdProjectIdUnitIdForApi(Const.ProjectTestPlanMenuId, newTestPlan.ProjectId, null, newTestPlan.TestPlanId, newTestPlan.PlanDate); } else { isUpdate.States = newTestPlan.States; if (isUpdate.States == "0" || isUpdate.States == "1") { isUpdate.PlanName = newTestPlan.PlanName; isUpdate.PlanManId = newTestPlan.PlanManId; isUpdate.PlanDate = newTestPlan.PlanDate; isUpdate.TestStartTime = newTestPlan.TestStartTime; isUpdate.TestEndTime = newTestPlan.TestEndTime; isUpdate.Duration = newTestPlan.Duration; isUpdate.TotalScore = newTestPlan.TotalScore; isUpdate.QuestionCount = newTestPlan.QuestionCount; isUpdate.TestPalce = newTestPlan.TestPalce; isUpdate.UnitIds = newTestPlan.UnitIds; isUpdate.WorkPostIds = newTestPlan.WorkPostIds; isUpdate.DepartIds = newTestPlan.DepartIds; isUpdate.TrainTypeId = newTestPlan.TrainTypeId; isUpdate.SValue = newTestPlan.SValue; isUpdate.MValue = newTestPlan.MValue; isUpdate.JValue = newTestPlan.JValue; ////删除 考生记录 var deleteRecords = from x in db.Training_TestRecord where x.TestPlanId == isUpdate.TestPlanId select x; if (deleteRecords.Count() > 0) { foreach (var item in deleteRecords) { var testRecordItem = from x in db.Training_TestRecordItem where x.TestRecordId == item.TestRecordId select x; if (testRecordItem.Count() > 0) { db.Training_TestRecordItem.DeleteAllOnSubmit(testRecordItem); db.SubmitChanges(); } } db.Training_TestRecord.DeleteAllOnSubmit(deleteRecords); db.SubmitChanges(); } ////删除 考试题目类型 var deleteTestPlanTrainings = from x in db.Training_TestPlanTraining where x.TestPlanId == isUpdate.TestPlanId select x; if (deleteTestPlanTrainings.Count() > 0) { db.Training_TestPlanTraining.DeleteAllOnSubmit(deleteTestPlanTrainings); db.SubmitChanges(); } } else if (isUpdate.States == "3") ////考试状态3时 更新培训计划状态 把培训计划写入培训记录中 { DateTime? endTime = Funs.GetNewDateTime(getTestPlan.TestEndTime); ////判断是否有未考完的考生 var getTrainingTestRecords = db.Training_TestRecord.FirstOrDefault(x => x.TestPlanId == isUpdate.TestPlanId && (!x.TestStartTime.HasValue || ((!x.TestEndTime.HasValue || !x.TestScores.HasValue) && x.TestStartTime.Value.AddMinutes(isUpdate.Duration) >= DateTime.Now))); if (getTrainingTestRecords != null && endTime.HasValue && endTime.Value.AddMinutes(isUpdate.Duration) < DateTime.Now) { alterStr = "当前存在未交卷考生,不能提前结束考试!"; isUpdate.States = "2"; } else { SubmitTest(isUpdate); } } else if (newTestPlan.States == "2") ////开始考试 只更新考试计划状态为考试中。 { if (isUpdate.TestStartTime > DateTime.Now) { isUpdate.States = "1"; alterStr = "未到考试扫码开始时间,不能开始考试!"; } } if (string.IsNullOrEmpty(alterStr)) { db.SubmitChanges(); } } if (newTestPlan.States == "0" || newTestPlan.States == "1") { if (getTestPlan.TestRecordItems.Count() > 0) { ////新增考试人员明细 foreach (var item in getTestPlan.TestRecordItems) { var user = db.Sys_User.FirstOrDefault(e => e.UserId == item.TestManId); var person = db.SitePerson_Person.FirstOrDefault(e => e.PersonId == item.TestManId); if (user != null || person != null) { Model.Training_TestRecord newTrainDetail = new Model.Training_TestRecord { TestRecordId = SQLHelper.GetNewID(), ProjectId = newTestPlan.ProjectId, TestPlanId = newTestPlan.TestPlanId, TestManId = item.TestManId, TestType = item.TestType, Duration = newTestPlan.Duration, }; db.Training_TestRecord.InsertOnSubmit(newTrainDetail); db.SubmitChanges(); } } } if (getTestPlan.TestPlanTrainingItems.Count() > 0) { foreach (var item in getTestPlan.TestPlanTrainingItems) { var trainingType = db.Training_TestTraining.FirstOrDefault(e => e.TrainingId == item.TrainingTypeId); if (trainingType != null) { Model.Training_TestPlanTraining newPlanItem = new Model.Training_TestPlanTraining { TestPlanTrainingId = SQLHelper.GetNewID(), TestPlanId = newTestPlan.TestPlanId, TrainingId = item.TrainingTypeId, TestType1Count = item.TestType1Count, TestType2Count = item.TestType2Count, TestType3Count = item.TestType3Count, }; db.Training_TestPlanTraining.InsertOnSubmit(newPlanItem); db.SubmitChanges(); } } } } } return alterStr; } /// /// 新增 考试人员明细 /// public static void AddTrainingTestRecord(List testRecords, Model.Training_TestPlan newTestPlan) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { foreach (var item in testRecords) { var person = db.SitePerson_Person.FirstOrDefault(e => e.PersonId == item.TestManId); if (person != null) { Model.Training_TestRecord newTrainDetail = new Model.Training_TestRecord { TestRecordId = SQLHelper.GetNewID(), ProjectId = newTestPlan.ProjectId, TestPlanId = newTestPlan.TestPlanId, TestManId = item.TestManId, TestType = item.TestType, Duration = newTestPlan.Duration, }; TestRecordService.AddTestRecordForApi(newTrainDetail); } } } } /// /// 新增 考试教材类型 明细 /// public static void AddTrainingTestPlanTraining(List TestPlanItems, string testPlanId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { foreach (var item in TestPlanItems) { var trainingType = db.Training_TestTraining.FirstOrDefault(e => e.TrainingId == item.TrainingTypeId); if (trainingType != null) { Model.Training_TestPlanTraining newPlanItem = new Model.Training_TestPlanTraining { TestPlanTrainingId = SQLHelper.GetNewID(), TestPlanId = testPlanId, TrainingId = item.TrainingTypeId, TestType1Count = item.TestType1Count, TestType2Count = item.TestType2Count, TestType3Count = item.TestType3Count, }; db.Training_TestPlanTraining.InsertOnSubmit(newPlanItem); db.SubmitChanges(); } } } } #endregion #region 根据培训计划ID生成 考试计划信息 /// /// 根据培训计划ID生成 考试计划信息 /// /// public static string SaveTestPlanByTrainingPlanId(string trainingPlanId,string userId) { string testPlanId = string.Empty; using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { ////培训计划 var getTrainingPlan = db.Training_Plan.FirstOrDefault(x => x.PlanId == trainingPlanId); ; if (getTrainingPlan != null && getTrainingPlan.States == "1") { testPlanId = SQLHelper.GetNewID(); Model.Training_TestPlan newTestPlan = new Model.Training_TestPlan { TestPlanId = testPlanId, ProjectId = getTrainingPlan.ProjectId, //PlanCode = getTrainingPlan.PlanCode, PlanName = getTrainingPlan.PlanName, PlanManId = userId, PlanDate = DateTime.Now, TestStartTime = DateTime.Now, TestPalce = getTrainingPlan.TeachAddress, UnitIds = getTrainingPlan.UnitIds, UnitNames = UnitService.getUnitNamesUnitIdsForApi(getTrainingPlan.UnitIds), WorkPostIds = getTrainingPlan.WorkPostId, WorkPostNames = WorkPostService.getWorkPostNamesWorkPostIdsForApi(getTrainingPlan.WorkPostId), DepartIds=getTrainingPlan.DepartIds, DepartNames = WorkPostService.getDepartNamesByIdsForApi(getTrainingPlan.DepartIds), PlanId = getTrainingPlan.PlanId, States = "0", }; string unitId = string.Empty; var user = db.Sys_User.FirstOrDefault(e => e.UserId == userId); if (user != null) { unitId = user.UnitId; } newTestPlan.PlanCode = CodeRecordsService.ReturnCodeByMenuIdProjectId(Const.ProjectTestPlanMenuId, newTestPlan.ProjectId, unitId); int Duration = 90; int SValue = 1; int MValue = 2; int JValue = 1; int testType1Count = 40; int testType2Count = 10; int testType3Count = 40; ////获取考试规则设置数据 var getTestRule = db.Sys_TestRule.FirstOrDefault(); ////考试数据设置 if (getTestRule != null) { Duration = getTestRule.Duration; SValue = getTestRule.SValue; MValue = getTestRule.MValue; JValue = getTestRule.JValue; testType1Count = getTestRule.SCount; testType2Count = getTestRule.MCount; testType3Count = getTestRule.JCount; } ////按照培训类型获取试题类型及题型数量 var getTrainTypeItems = from x in db.Base_TrainTypeItem where x.TrainTypeId == getTrainingPlan.TrainTypeId select x; if (getTrainTypeItems.Count() > 0) { testType1Count = getTrainTypeItems.Sum(x => x.SCount); testType2Count = getTrainTypeItems.Sum(x => x.MCount); testType3Count = getTrainTypeItems.Sum(x => x.JCount); } newTestPlan.Duration = getTestRule.Duration; newTestPlan.SValue = getTestRule.SValue; newTestPlan.MValue = getTestRule.MValue; newTestPlan.JValue = getTestRule.JValue; newTestPlan.TotalScore = testType1Count * SValue + testType2Count * MValue + testType3Count * JValue; newTestPlan.QuestionCount = testType1Count + testType2Count + testType3Count; newTestPlan.TestEndTime = newTestPlan.TestStartTime.AddMinutes(newTestPlan.Duration); ////新增考试计划记录 var getIsTestPlan = db.Training_TestPlan.FirstOrDefault(x => x.PlanId == newTestPlan.PlanId); if (getIsTestPlan == null) { db.Training_TestPlan.InsertOnSubmit(newTestPlan); db.SubmitChanges(); CodeRecordsService.InsertCodeRecordsByMenuIdProjectIdUnitIdForApi(Const.ProjectTestPlanMenuId, newTestPlan.ProjectId, null, testPlanId, newTestPlan.PlanDate); ///培训人员 var getTrainingTask = (from x in db.Training_Task where x.PlanId == trainingPlanId select x).ToList(); foreach (var itemTask in getTrainingTask) { Model.Training_TestRecord newTestRecord = new Model.Training_TestRecord { TestRecordId = SQLHelper.GetNewID(), ProjectId = getTrainingPlan.ProjectId, TestPlanId = testPlanId, TestManId = itemTask.UserId, TestType= db.Base_TrainType.First(z=>z.TrainTypeId == getTrainingPlan.TrainTypeId).TrainTypeName, }; db.Training_TestRecord.InsertOnSubmit(newTestRecord); db.SubmitChanges(); } if (getTrainTypeItems.Count() == 0) { /////考试题型类别及数量 Model.Training_TestPlanTraining newTestPlanTraining = new Model.Training_TestPlanTraining { TestPlanTrainingId = SQLHelper.GetNewID(), TestPlanId = testPlanId, TestType1Count = testType1Count, TestType2Count = testType2Count, TestType3Count = testType3Count, }; db.Training_TestPlanTraining.InsertOnSubmit(newTestPlanTraining); db.SubmitChanges(); } else { foreach (var item in getTrainTypeItems) { /////考试题型类别及数量 Model.Training_TestPlanTraining newTestPlanTraining = new Model.Training_TestPlanTraining { TestPlanTrainingId = SQLHelper.GetNewID(), TestPlanId = testPlanId, TrainingId = item.TrainingId, TestType1Count = item.SCount, TestType2Count = item.MCount, TestType3Count = item.JCount, }; db.Training_TestPlanTraining.InsertOnSubmit(newTestPlanTraining); db.SubmitChanges(); } } } ////回写培训计划状态 getTrainingPlan.States = "2"; db.SubmitChanges(); } } return testPlanId; } #endregion #region 根据TestPlanId获取考试试题类型列表 /// /// 根据TestPlanId获取考试试题类型列表 /// /// 考试计划ID /// public static List getTestPlanTrainingListByTestPlanId(string testPlanId) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var getDataLists = (from x in db.Training_TestPlanTraining join y in db.Training_TestTraining on x.TrainingId equals y.TrainingId where x.TestPlanId == testPlanId orderby y.TrainingCode select new Model.TestPlanTrainingItem { TestPlanTrainingId = x.TestPlanTrainingId, TestPlanId = x.TestPlanId, TrainingTypeId = x.TrainingId, TrainingTypeName = y.TrainingName, TestType1Count = x.TestType1Count ?? 0, TestType2Count = x.TestType2Count ?? 0, TestType3Count = x.TestType3Count ?? 0, }).ToList(); return getDataLists; } } #endregion /// /// 结束考试 /// public static void SubmitTest(Model.Training_TestPlan getTestPlan) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { ////所有交卷的人员 交卷 并计算分数 var getTrainingTestRecords = from x in db.Training_TestRecord where x.TestPlanId == getTestPlan.TestPlanId && (!x.TestEndTime.HasValue || !x.TestScores.HasValue) select x; foreach (var itemRecord in getTrainingTestRecords) { itemRecord.TestEndTime = DateTime.Now; itemRecord.TestScores = db.Training_TestRecordItem.Where(x => x.TestRecordId == itemRecord.TestRecordId).Sum(x => x.SubjectScore) ?? 0; db.SubmitChanges(); } var getTrainingTasks = from x in db.Training_Task where x.PlanId == getTestPlan.PlanId && (x.States != "2" || x.States == null) select x; foreach (var item in getTrainingTasks) { item.States = "2"; db.SubmitChanges(); } ////TODO 讲培训计划 考试记录 写入到培训记录 APITrainRecordService.InsertTrainRecord(getTestPlan); } } } }