xinjiang/SGGL/BLL/API/HSSE/APITestPlanService.cs

573 lines
30 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EmitMapper;
using EmitMapper.MappingConfiguration;
namespace BLL
{
/// <summary>
/// 考试计划
/// </summary>
public static class APITestPlanService
{
#region projectIdstates获取考试计划列表
/// <summary>
/// 根据projectId、states获取考试计划列表
/// </summary>
/// <param name="projectId">项目ID</param>
/// <param name="states">状态0-待提交1-已发布2-考试中3考试结束</param>
/// <returns></returns>
public static List<Model.TestPlanItem> 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.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,
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获取考试计划详细
/// <summary>
/// 根据考试ID获取考试计划详细
/// </summary>
/// <param name="testPlanId"></param>
/// <returns></returns>
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,
TestPlanManName = db.Sys_User.First(y => y.UserId == x.TestPlanId).UserName,
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.getUnitNamesUnitIds(x.UnitIds),
WorkPostIds = x.WorkPostIds,
WorkPostNames = WorkPostService.getWorkPostNamesWorkPostIds(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()
};
return getDataLists.FirstOrDefault();
}
}
#endregion
#region
/// <summary>
/// 保存TestPlan
/// </summary>
/// <param name="getTestPlan">考试计划记录</param>
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,
ProjectId = getTestPlan.ProjectId,
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,
States = getTestPlan.States,
PlanDate = DateTime.Now,
};
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.InsertCodeRecordsByMenuIdProjectIdUnitId(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;
////删除 考生记录
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 = TestTrainingService.GetTestTrainingById(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;
}
/// <summary>
/// 新增 考试人员明细
/// </summary>
public static void AddTrainingTestRecord(List<Model.TestRecordItem> testRecords, Model.Training_TestPlan newTestPlan)
{
foreach (var item in testRecords)
{
var person = PersonService.GetPersonById(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.AddTestRecord(newTrainDetail);
}
}
}
/// <summary>
/// 新增 考试教材类型 明细
/// </summary>
public static void AddTrainingTestPlanTraining(List<Model.TestPlanTrainingItem> 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生成
/// <summary>
/// 根据培训计划ID生成 考试计划信息
/// </summary>
/// <param name="getTestPlan"></param>
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获取考试试题类型列表
/// <summary>
/// 根据TestPlanId获取考试试题类型列表
/// </summary>
/// <param name="testPlanId">考试计划ID</param>
/// <returns></returns>
public static List<Model.TestPlanTrainingItem> 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
/// <summary>
/// 结束考试
/// </summary>
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);
}
}
}
}