考试管理取消发布、进行归档新增是否正在学习中校验

master
xiaochanghai 10 months ago
parent 92ac1c6cae
commit 806c968d14
  1. 604
      Model/Tiobon.Web.pdm
  2. 7
      Tiobon.Core.Api/Controllers/Ghre/Ghre_ExamController.cs
  3. 23
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  4. 5
      Tiobon.Core.Model/Base/Ghre/Ghre_StudyRecord.Dto.Base.cs
  5. 7
      Tiobon.Core.Model/Consts.cs
  6. 5
      Tiobon.Core.Model/Models/Ghre/Ghre_StudyRecord.cs
  7. 2
      Tiobon.Core.Model/ViewModels/Extend/Ghre_StudyRecordCourse.cs
  8. 2
      Tiobon.Core.Services/Ghre/Ghre_CourseServices.cs
  9. 117
      Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs
  10. 26
      Tiobon.Core.Services/Ghre/Ghre_StudyRecordServices.cs
  11. 2
      Tiobon.Core.Services/Ghre/Ghre_StudyRuleServices.cs
  12. 10
      Tiobon.Core/Tiobon.Core.Model.xml

File diff suppressed because it is too large Load Diff

@ -186,5 +186,12 @@ public class Ghre_ExamController : BaseController<IGhre_ExamServices, Ghre_Exam,
}
#endregion
[HttpPost, Route("ExecuteExamOver")]
public async Task<ServiceResult> ExecuteExamOver()
{
return await _service.ExecuteExamOver();
}
}

@ -4330,6 +4330,11 @@
学习时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecordBase.StandardDuration">
<summary>
课程标准时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecordBase.CourseType">
<summary>
课程类型
@ -10496,6 +10501,11 @@
学习时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecord.StandardDuration">
<summary>
课程标准时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecord.CourseType">
<summary>
课程类型
@ -13547,22 +13557,22 @@
培训记录-课程状态-已结束
</summary>
</member>
<member name="T:Tiobon.Core.Model.Consts.DicStudyRecordStudyStatus">
<member name="T:Tiobon.Core.Model.Consts.DIC_STUDY_RECORD_STUDY_STATUS">
<summary>
培训记录-学习状态
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DicStudyRecordStudyStatus.NO_JOIN">
<member name="F:Tiobon.Core.Model.Consts.DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN">
<summary>
未参与
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DicStudyRecordStudyStatus.NO_FINISH">
<member name="F:Tiobon.Core.Model.Consts.DIC_STUDY_RECORD_STUDY_STATUS.NO_FINISH">
<summary>
未完成
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DicStudyRecordStudyStatus.HAS_FINISH">
<member name="F:Tiobon.Core.Model.Consts.DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH">
<summary>
已完成
</summary>
@ -13587,6 +13597,11 @@
考试结束
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_RECORD_STATUS.SYSTEM_END">
<summary>
缺考系统结束
</summary>
</member>
<member name="T:Tiobon.Core.Model.Consts.DIC_EXAM_RECORD_SCORE_STATUS">
<summary>
考试记录-评分状态

@ -92,6 +92,11 @@ namespace Tiobon.Core.Model.Models
/// </summary>
public decimal? StudyDuration { get; set; }
/// <summary>
/// 课程标准时长(分钟)
/// </summary>
public decimal? StandardDuration { get; set; }
/// <summary>
/// 课程类型
/// </summary>

@ -178,7 +178,7 @@ public class Consts
/// 培训记录-学习状态
/// </summary>
public static class DicStudyRecordStudyStatus
public static class DIC_STUDY_RECORD_STUDY_STATUS
{
/// <summary>
/// 未参与
@ -219,6 +219,11 @@ public class Consts
/// 考试结束
/// </summary>
public const string EXAM_END = "ExamEnd";
/// <summary>
/// 缺考系统结束
/// </summary>
public const string SYSTEM_END = "SystemEnd";
}

@ -93,6 +93,11 @@ namespace Tiobon.Core.Model.Models
/// </summary>
public decimal? StudyDuration { get; set; }
/// <summary>
/// 课程标准时长(分钟)
/// </summary>
public decimal? StandardDuration { get; set; }
/// <summary>
/// 课程类型
/// </summary>

@ -23,6 +23,8 @@ public class Ghre_StudyRecordCourse
public string TeacherRemarkSz { get; set; }
public DateTime? CourseBeginTime { get; set; }
public DateTime? CourseEndTime { get; set; }
public decimal? StudyDuration { get; set; }
public decimal? CourseStandardDuration { get; set; }
public List<Ghre_StudyRecordCourseWare> CourseWareList { get; set; }

@ -347,7 +347,7 @@ public class Ghre_CourseServices : BaseServices<Ghre_Course, Ghre_CourseDto, Ins
if (examPaper != null)
return ServiceResult.OprateFailed($"课程【{entity.CourseName}({entity.CourseNo})】已与试卷【{examPaper.PaperName}({examPaper.PaperName})】关联,暂不可{(status == Consts.DIC_COURSE_STATUS.DRAFT ? "" : "")}");
if (await Db.Queryable<Ghre_StudyRecord>().AnyAsync(x => x.CourseId == id && x.StudyStatus != Consts.DicStudyRecordStudyStatus.HAS_FINISH && x.CourseEndTime != null && x.CourseEndTime.Value.Date >= DateTime.Now.Date))
if (await Db.Queryable<Ghre_StudyRecord>().AnyAsync(x => x.CourseId == id && x.StudyStatus != Consts.DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH && x.CourseEndTime != null && x.CourseEndTime.Value.Date >= DateTime.Now.Date))
return ServiceResult.OprateFailed($"课程【{entity.CourseName}({entity.CourseNo})】有学员正在学习中,暂不可{(status == Consts.DIC_COURSE_STATUS.DRAFT ? "" : "")}");
}

@ -1196,8 +1196,23 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
ent.UpdateIP = ip;
ent.UpdateProg = api;
if (entity.Status == DIC_EXAM_STATUS.RELEASED && status == DIC_EXAM_STATUS.DRAFT && await _ghre_ExamRecordServices.AnyAsync(x => x.ExamId == id && x.Status == DIC_EXAM_RECORD_STATUS.EXAMING))
if (entity.Status == DIC_EXAM_STATUS.RELEASED && status == DIC_EXAM_STATUS.DRAFT)
{
if (await Db.Queryable<Ghre_StudyRecord>().AnyAsync(x => x.ExamId == id && x.StudyStatus != DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN))
return ServiceResult.OprateFailed("已有学员正在学习,不可取消发布!");
if (await _ghre_ExamRecordServices.AnyAsync(x => x.ExamId == id && x.Status == DIC_EXAM_RECORD_STATUS.EXAMING))
return ServiceResult.OprateFailed("已有学员参与考试,不可取消发布!");
}
if (entity.Status == DIC_EXAM_STATUS.RELEASED && status == DIC_EXAM_STATUS.DISABLED)
{
if (await Db.Queryable<Ghre_StudyRecord>().AnyAsync(x => x.ExamId == id && x.StudyStatus != DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN))
return ServiceResult.OprateFailed("已有学员正在学习,不可归档!");
if (await _ghre_ExamRecordServices.AnyAsync(x => x.ExamId == id && x.Status == DIC_EXAM_RECORD_STATUS.EXAMING))
return ServiceResult.OprateFailed("已有学员参与考试,不可归档!");
}
if (entity.Status == DIC_EXAM_STATUS.DISABLED && status == DIC_EXAM_STATUS.RELEASED)
{
@ -1315,9 +1330,9 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
JoinTime = courseTime,
CourseBeginTime = courseTime.Date,
CourseEndTime = courseEndTime,
CourseType = Consts.DIC_EXAM_STAFF_SOURCE.MANUAL_REQUIRED,
CourseType = DIC_EXAM_STAFF_SOURCE.MANUAL_REQUIRED,
CourseStatus = Consts.DIC_STUDY_RECORD_COURSE_STATUS_IN,
StudyStatus = Consts.DicStudyRecordStudyStatus.NO_JOIN
StudyStatus = DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN
});
}
if (inserts.Any())
@ -1325,7 +1340,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
}
#endregion
if (status == Consts.DIC_EXAM_STATUS.RELEASED || status == Consts.DIC_EXAM_STATUS.DISABLED || status == Consts.DIC_EXAM_STATUS.DRAFT)
if (status == DIC_EXAM_STATUS.RELEASED || status == DIC_EXAM_STATUS.DISABLED || status == DIC_EXAM_STATUS.DRAFT)
{
entity.Status = status;
entities.Add(entity);
@ -1333,9 +1348,9 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
}
var result = await BaseDal.Update(entities);
if (status == Consts.DIC_EXAM_STATUS.RELEASED)
if (status == DIC_EXAM_STATUS.RELEASED)
return ServiceResult.OprateSuccess("发布成功!");
else if (status == Consts.DIC_EXAM_STATUS.DRAFT)
else if (status == DIC_EXAM_STATUS.DRAFT)
return ServiceResult.OprateSuccess("取消发布成功!");
else
return ServiceResult.OprateSuccess("归档成功!");
@ -1587,13 +1602,91 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
public async Task<ServiceResult> ExecuteExamOver()
{
var now = Db.GetDate();
var exams = await Db.Queryable<Ghre_Exam>().Where(x =>
x.DateType == DicExamDateType.EXAM_DATE &&
x.Status == DIC_EXAM_STATUS.RELEASED &&
x.EndTime !=null&&
x.EndTime.Value.Date== now
var exams = await Db.Queryable<Ghre_Exam>().Where(x => x.Status == DIC_EXAM_STATUS.RELEASED &&
((x.DateType == DicExamDateType.EXAM_DATE && x.EndTime != null && x.EndTime.Value.Date == now.Date.AddDays(-1)) || x.DateType == DicExamDateType.AFTER_HOW_LONG)
).ToListAsync();
return ServiceResult.OprateSuccess("提交成功!");
for (int i = 0; i < exams.Count; i++)
{
var exam = exams[i];
//if (await Db.Queryable<Ghre_ExamPaper>().Where(x => x.ScoreMethod == DIC_EXAM_PAPER_SCORE_METHOD.MANUAL && x.Id == exam.ExamPaperId).AnyAsync())
// continue;
var studyRecords = new List<Ghre_StudyRecord>();
if (exam.DateType == DicExamDateType.EXAM_DATE)
{
#region 固定日期
studyRecords = await Db.Queryable<Ghre_StudyRecord>()
.Where(x => x.ExamId == exam.Id && x.StudyStatus != DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH)
.ToListAsync();
#endregion
}
else
{
#region 考完周期
exam.AfterHowLong = (exam.AfterHowLong ?? 7) + 1;
var examEndDt = now.AddDays(-exam.AfterHowLong.Value);
studyRecords = await Db.Queryable<Ghre_StudyRecord>()
.Where(x =>
x.ExamId == exam.Id &&
x.StudyStatus != DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH &&
x.CourseEndTime != null &&
x.CourseEndTime.Value.Date == examEndDt.Date)
.ToListAsync();
#endregion
}
var inserts = new List<Ghre_ExamRecord>();
var updates = new List<Ghre_ExamRecord>();
if (studyRecords.Any())
{
for (int j = 0; j < studyRecords.Count; j++)
{
studyRecords[j].StudyStatus = DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH;
studyRecords[j].RemarkSz = "考试结束自动关闭!";
var examRecord = await Db.Queryable<Ghre_ExamRecord>().Where(x => x.StudyRecordId == studyRecords[j].Id && x.ExamId == exam.Id).FirstAsync();
if (examRecord.IsNull())
{
inserts.Add(new Ghre_ExamRecord()
{
Id = SnowFlakeSingle.Instance.NextId(),
ExamId = exam.Id,
StudyRecordId = studyRecords[j].Id,
StaffId = studyRecords[j].StaffId,
CourseSnapId = studyRecords[j].CourseSnapId,
ExamPaperId = exam.ExamPaperId,
ExamDate = DateTime.Now.Date.AddDays(-1),
RetakeTimes = 0,
Score = 0,
AdjustScore = 0,
IsPass = false,
Comment = "考试结束自动出分!",
Status = DIC_EXAM_RECORD_STATUS.SYSTEM_END,
ScoreStatus = DIC_EXAM_RECORD_SCORE_STATUS.HAS_SCORE,
BeginTime = exam.DateType == DicExamDateType.EXAM_DATE ? exam.BeginTime : DateTime.Now.Date.AddDays(-exam.AfterHowLong.Value),
EndTime = exam.DateType == DicExamDateType.EXAM_DATE ? exam.EndTime : DateTime.Now.Date.AddDays(-1)
});
}
else
{
examRecord.Score = 0;
examRecord.AdjustScore = 0;
examRecord.Status = DIC_EXAM_RECORD_STATUS.SYSTEM_END;
examRecord.ScoreStatus = DIC_EXAM_RECORD_SCORE_STATUS.HAS_SCORE;
examRecord.IsPass = false;
examRecord.Comment = "考试结束自动出分!";
updates.Add(examRecord);
}
}
await Db.Insertable(inserts).ExecuteCommandAsync();
await Db.Updateable(updates).UpdateColumns(it => new { it.Score, it.AdjustScore, it.Status, it.ScoreStatus, it.IsPass, it.Comment }).ExecuteCommandAsync();
await Db.Updateable(studyRecords).UpdateColumns(it => new { it.StudyStatus, it.RemarkSz }).ExecuteCommandAsync();
}
}
return ServiceResult.OprateSuccess("执行成功!");
}
}

@ -411,7 +411,9 @@ namespace Tiobon.Core.Services
B.Outline CourseRemarkSz,
A.StudyProgress,
A.CourseBeginTime,
A.CourseEndTime
A.CourseEndTime,
A.StandardDuration CourseStandardDuration,
A.StudyDuration
FROM Ghre_StudyRecord A
LEFT JOIN Ghre_Course B ON A.CourseId = B.Id
LEFT JOIN Ghra_Staff c ON B.TeacherId = c.StaffID
@ -513,6 +515,20 @@ namespace Tiobon.Core.Services
if (course.CourseBeginTime != null && course.CourseEndTime != null)
course.CourseDateString = DateTimeHelper.ConvertToDayString(course.CourseBeginTime) + "~" + DateTimeHelper.ConvertToDayString(course.CourseEndTime);
if (course.CourseStandardDuration.IsNull())
{
sql = $@"SELECT ISNULL (A.Hours, 0) * 60 + A.Minutes Minutes
FROM Ghre_CourseWare A
WHERE A.Id IN
(SELECT CourseWareId
FROM Ghre_Course
WHERE Id = '{course.CourseId}'
OR CourseSceneId = '{course.CourseSceneId}' AND IsEnable = 1)";
var mins = await Db.Ado.GetDecimalAsync(sql);
course.CourseStandardDuration = mins;
}
if (course.StudyDuration.IsNull()) course.StudyDuration = 0;
return ServiceResult<Ghre_StudyRecordCourse>.OprateSuccess("查询成功!", course);
}
@ -547,7 +563,7 @@ namespace Tiobon.Core.Services
CourseEndTime = courseTime.Date.AddMonths(snap?.ValidityPeriod ?? 1),
CourseType = "ManualElective",
CourseStatus = DIC_STUDY_RECORD_COURSE_STATUS_IN,
StudyStatus = DicStudyRecordStudyStatus.NO_JOIN,
StudyStatus = DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN,
ExamId = exam?.Id
});
}
@ -591,11 +607,11 @@ namespace Tiobon.Core.Services
studyProgress = 100;
}
var studyStatus = DicStudyRecordStudyStatus.NO_FINISH;
var studyStatus = DIC_STUDY_RECORD_STUDY_STATUS.NO_FINISH;
if (studyProgress == 100)
studyStatus = DicStudyRecordStudyStatus.HAS_FINISH;
studyStatus = DIC_STUDY_RECORD_STUDY_STATUS.HAS_FINISH;
sql = $"UPDATE Ghre_StudyRecord SET StudyProgress = {studyProgress},StudyStatus='{studyStatus}' WHERE Id='{studyRecordId}'";
sql = $"UPDATE Ghre_StudyRecord SET StudyProgress = {studyProgress},StudyStatus='{studyStatus}',StandardDuration='{mins}' WHERE Id='{studyRecordId}'";
if (studyProgress > 0) await Db.Ado.ExecuteCommandAsync(sql);
sql = $"UPDATE Ghre_StudyRecord SET BeginTime=GETDATE(),StudyStatus='{studyStatus}' WHERE BeginTime IS NULL AND Id='{studyRecordId}'";
await Db.Ado.ExecuteCommandAsync(sql);

@ -403,7 +403,7 @@ public class Ghre_StudyRuleServices : BaseServices<Ghre_StudyRule, Ghre_StudyRul
CourseEndTime = courseTime.Date.AddMonths((rule.DeadlineMonth ?? snap?.ValidityPeriod) ?? 1),
CourseType = rule.RuleType,
CourseStatus = Consts.DIC_STUDY_RECORD_COURSE_STATUS_IN,
StudyStatus = Consts.DicStudyRecordStudyStatus.NO_JOIN,
StudyStatus = Consts.DIC_STUDY_RECORD_STUDY_STATUS.NO_JOIN,
Year = rule.Year
});
insertResults.Add(new Ghre_StudyRuleResult()

@ -4330,6 +4330,11 @@
学习时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecordBase.StandardDuration">
<summary>
课程标准时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecordBase.CourseType">
<summary>
课程类型
@ -10496,6 +10501,11 @@
学习时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecord.StandardDuration">
<summary>
课程标准时长(分钟)
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_StudyRecord.CourseType">
<summary>
课程类型

Loading…
Cancel
Save