考试管理 发布新增校验同一个课程/课程场景下 考试时间不允许重叠

master
xiaochanghai 11 months ago
parent 38385208ac
commit deb064b789
  1. 40
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  2. 45
      Tiobon.Core.Model/Consts.cs
  3. 81
      Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs

@ -12312,6 +12312,46 @@
系统用户(Dto.View)
</summary>
</member>
<member name="T:Tiobon.Core.Model.Consts">
<summary>
全局常量
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_STATUS_DRAFT">
<summary>
考试管理-状态-草稿箱
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_STATUS_RELEASED">
<summary>
考试管理-状态-已发布
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_STATUS_DISABLED">
<summary>
考试管理-状态-已归档
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_DATE_TYPE_EXAM_DATE">
<summary>
考试管理-日期类型-考试区间
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_DATE_TYPE_AFTERHOWLONG">
<summary>
考试管理-日期类型-学完多久
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_LINK_TYPE_COURSE">
<summary>
考试管理-关联类型-課程
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_EXAM_DATE_TYPE_COURSE_SCENE">
<summary>
考试管理-关联类型-場景
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.NONE">
<summary>
无任何权限

@ -0,0 +1,45 @@
namespace Tiobon.Core.Model;
/// <summary>
/// 全局常量
/// </summary>
public class Consts
{
#region 考试管理-状态
/// <summary>
/// 考试管理-状态-草稿箱
/// </summary>
public const string DIC_EXAM_STATUS_DRAFT = "Draft";
/// <summary>
/// 考试管理-状态-已发布
/// </summary>
public const string DIC_EXAM_STATUS_RELEASED = "Released";
/// <summary>
/// 考试管理-状态-已归档
/// </summary>
public const string DIC_EXAM_STATUS_DISABLED = "Disabled";
#endregion
#region 考试管理-日期类型
/// <summary>
/// 考试管理-日期类型-考试区间
/// </summary>
public const string DIC_EXAM_DATE_TYPE_EXAM_DATE = "ExamDate";
/// <summary>
/// 考试管理-日期类型-学完多久
/// </summary>
public const string DIC_EXAM_DATE_TYPE_AFTERHOWLONG = "AfterHowLong";
#endregion
#region 考试管理-关联类型
/// <summary>
/// 考试管理-关联类型-課程
/// </summary>
public const string DIC_EXAM_LINK_TYPE_COURSE = "CourseId";
/// <summary>
/// 考试管理-关联类型-場景
/// </summary>
public const string DIC_EXAM_DATE_TYPE_COURSE_SCENE = "CourseSceneId";
#endregion
}

@ -716,19 +716,19 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
{
x.ExamName = x.ExamName + "(" + x.ExamNo + ")";
if (x.Status == "Released" || x.Status == "Disabled")
if (x.Status == Consts.DIC_EXAM_STATUS_RELEASED || x.Status == Consts.DIC_EXAM_STATUS_DISABLED)
{
x.canEdit = 0;
x.canDelete = 0;
}
if (x.Status == "Draft")
if (x.Status == Consts.DIC_EXAM_STATUS_DRAFT)
{
x.showLink = 0;
x.showResult = 0;
x.canClose = 0;
}
if (x.Status == "Disabled")
if (x.Status == Consts.DIC_EXAM_STATUS_DISABLED)
{
x.canClose = 0;
x.canPreview = 0;
@ -763,7 +763,6 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
return new ServicePageResult<Ghre_ExamDto>(filter.pageNum, totalCount, filter.pageSize, data);
}
public async Task<ServiceResult<string>> ExportExcel(QueryExport body, string status)
{
QueryBody filter = new QueryBody();
@ -811,7 +810,6 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
return ServiceResult<string>.OprateSuccess("导出成功", path);
}
public async Task<ServiceResult<DefaultGhre_ExamInput>> QueryDefault(long Id)
{
var input = new DefaultGhre_ExamInput();
@ -1023,7 +1021,6 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
return ServiceResult<DefaultGhre_ExamInput>.OprateSuccess("查询成功!", input);
}
public async Task<ServiceResult<List<StaffTableData>>> QueryStaff(List<int> Ids, string type)
{
string sql = @"SELECT A.StaffID,
@ -1073,7 +1070,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
if (id == 0)
{
if (string.IsNullOrEmpty(pageData.Status))
pageData.Status = "Draft";
pageData.Status = Consts.DIC_EXAM_STATUS_DRAFT;
var insert = Mapper.Map(pageData).ToANew<InsertGhre_ExamInput>();
id = await base.Add(insert);
@ -1117,7 +1114,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
public async Task<ServiceResult> UpdateStatus(long[] ids, string status)
{
if (status == "Draft")
if (status == Consts.DIC_EXAM_STATUS_DRAFT)
{
string sql = $@"SELECT A.RoleId, B.RoleNo, B.RoleName
FROM Ghrs_UserRole A LEFT JOIN Ghrs_Role B ON A.RoleId = B.RoleId
@ -1130,7 +1127,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
return ServiceResult.OprateFailed("暂无取消发布权限!");
}
if (status != "Released" && status != "Disabled" && status != "Draft")
if (status != Consts.DIC_EXAM_STATUS_RELEASED && status != Consts.DIC_EXAM_STATUS_DISABLED && status != Consts.DIC_EXAM_STATUS_DRAFT)
throw new Exception("无效的状态");
HttpRequest request = UserContext.Context.Request;
@ -1149,10 +1146,10 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
ent.UpdateIP = ip;
ent.UpdateProg = api;
if (entity.Status == "Released" && status == "Draft" && await _ghre_ExamRecordServices.AnyAsync(x => x.ExamId == id && x.Status == "UnderWay"))
if (entity.Status == Consts.DIC_EXAM_STATUS_RELEASED && status == Consts.DIC_EXAM_STATUS_DRAFT && await _ghre_ExamRecordServices.AnyAsync(x => x.ExamId == id && x.Status == "UnderWay"))
return ServiceResult.OprateFailed("已有学员参与考试,不可取消发布!");
if (entity.Status == "Disabled" && status == "Released")
if (entity.Status == Consts.DIC_EXAM_STATUS_DISABLED && status == Consts.DIC_EXAM_STATUS_RELEASED)
{
if (entity.LinkType == "CourseId")
{
@ -1160,19 +1157,65 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
if (course is null)
return ServiceResult.OprateFailed("该考试关联的课程已被删除,暂不可取消归档!");
if (course.Status != "Released")
return ServiceResult.OprateFailed($"该考试关联的课程【{course.CourseName}({course.CourseNo})】状态为【{(course.Status == "Disabled" ? "" : "稿")}】,暂不可取消归档!");
if (course.Status != Consts.DIC_EXAM_STATUS_RELEASED)
return ServiceResult.OprateFailed($"该考试关联的课程【{course.CourseName}({course.CourseNo})】状态为【{(course.Status == Consts.DIC_EXAM_STATUS_DISABLED ? "" : "稿")}】,暂不可取消归档!");
}
var examPaper = await _ghre_ExamPaperServices.QueryById(entity.ExamPaperId);
if (examPaper is null)
return ServiceResult.OprateFailed("该考试关联的试卷已被删除,暂不可取消归档!");
if (examPaper.Status != "Released")
return ServiceResult.OprateFailed($"该考试关联的试卷【{examPaper.PaperName}({examPaper.PaperNo})】状态为【{(examPaper.Status == "Disabled" ? "" : "稿")}】,暂不可取消归档!");
if (examPaper.Status != Consts.DIC_EXAM_STATUS_RELEASED)
return ServiceResult.OprateFailed($"该考试关联的试卷【{examPaper.PaperName}({examPaper.PaperNo})】状态为【{(examPaper.Status == Consts.DIC_EXAM_STATUS_DISABLED ? "" : "稿")}】,暂不可取消归档!");
}
if (entity.LinkType == Consts.DIC_EXAM_LINK_TYPE_COURSE)
{
#region 校验同一个课程下 考试时间不允许重叠
var exams = await base.Query(x => x.Status == Consts.DIC_EXAM_STATUS_RELEASED && x.CourseId == entity.CourseId && x.Id != id);
if (exams.Any())
for (int i = 0; i < exams.Count; i++)
{
var exam = exams[i];
var course = await _ghre_CourseServices.QuerySingle(entity.CourseId);
if (exam.DateType != entity.DateType || exam.DateType == Consts.DIC_EXAM_DATE_TYPE_AFTERHOWLONG)
{
return ServiceResult.OprateFailed($"课程【{course.CourseName}】已存在有效的考试管理数据【{exam.ExamName}({exam.ExamNo})】!");
}
else if (exam.DateType == Consts.DIC_EXAM_DATE_TYPE_EXAM_DATE)
{
if ((entity.BeginTime >= exam.BeginTime && entity.BeginTime <= exam.EndTime)
|| (entity.EndTime >= exam.BeginTime && entity.EndTime <= exam.EndTime)
|| (exam.EndTime >= entity.BeginTime && exam.EndTime <= entity.EndTime)
|| (exam.EndTime >= entity.BeginTime && exam.EndTime <= entity.EndTime))
return ServiceResult.OprateFailed($"课程【{course.CourseName}】已存在有效的考试管理数据【{exam.ExamName}({exam.ExamNo})】时间重叠!");
}
}
#endregion
}
else
{
#region 校验同一个课程场景下 考试时间不允许重叠
var exams = await base.Query(x => x.Status == Consts.DIC_EXAM_STATUS_RELEASED && x.CourseSceneId == entity.CourseSceneId && x.Id != id);
if (exams.Any())
for (int i = 0; i < exams.Count; i++)
{
var exam = exams[i];
var course = await _ghre_CourseSceneServices.QuerySingle(entity.CourseSceneId);
if (exam.DateType != entity.DateType || exam.DateType == Consts.DIC_EXAM_DATE_TYPE_AFTERHOWLONG)
{
return ServiceResult.OprateFailed($"课程场景【{course.CourseName}】已存在有效的考试管理数据【{exam.ExamName}({exam.ExamNo})】!");
}
else if (exam.DateType == Consts.DIC_EXAM_DATE_TYPE_EXAM_DATE)
{
if ((entity.BeginTime >= exam.BeginTime && entity.BeginTime <= exam.EndTime) || (entity.EndTime >= exam.BeginTime && entity.EndTime <= exam.EndTime))
return ServiceResult.OprateFailed($"课程场景【{course.CourseName}】已存在有效的考试管理数据【{exam.ExamName}({exam.ExamNo})】时间重叠!");
}
}
#endregion
}
if (status == "Released" || status == "Disabled" || status == "Draft")
if (status == Consts.DIC_EXAM_STATUS_RELEASED || status == Consts.DIC_EXAM_STATUS_DISABLED || status == Consts.DIC_EXAM_STATUS_DRAFT)
{
entity.Status = status;
entities.Add(entity);
@ -1180,9 +1223,9 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
}
var result = await BaseDal.Update(entities);
if (status == "Released")
if (status == Consts.DIC_EXAM_STATUS_RELEASED)
return ServiceResult.OprateSuccess("发布成功!");
else if (status == "Draft")
else if (status == Consts.DIC_EXAM_STATUS_DRAFT)
return ServiceResult.OprateSuccess("取消发布成功!");
else
return ServiceResult.OprateSuccess("停用成功!");
@ -1308,7 +1351,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
{
var exam = await base.QueryById(id);
var staffs = await _ghre_ExamStaffServices.Query(x => x.ExamId == id);
exam.Status = "Draft";
exam.Status = Consts.DIC_EXAM_STATUS_DRAFT;
var insert = Mapper.Map(exam).ToANew<InsertGhre_ExamInput>();

Loading…
Cancel
Save