开班 开课同步新增考试数据至【已发布】

master
xiaochanghai 4 months ago
parent 04ebf78ba9
commit b44bb6e4c0
  1. 4
      Tiobon.Core.Api/Controllers/Ghre/Ghre_OpenClassController.cs
  2. 56
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  3. 8
      Tiobon.Core.Api/Tiobon.Core.xml
  4. 2
      Tiobon.Core.IServices/Ghre/IGhre_OpenClassServices.cs
  5. 30
      Tiobon.Core.Model/Base/Ghre/Ghre_Exam.Dto.Base.cs
  6. 5
      Tiobon.Core.Model/Base/Ghre/Ghre_OpenClass.Dto.Base.cs
  7. 30
      Tiobon.Core.Model/Models/Ghre/Ghre_Exam.cs
  8. 5
      Tiobon.Core.Model/Models/Ghre/Ghre_OpenClass.cs
  9. 4
      Tiobon.Core.Services/Ghre/Ghre_ExamServices.cs
  10. 80
      Tiobon.Core.Services/Ghre/Ghre_OpenClassServices.cs

@ -133,10 +133,10 @@ public class Ghre_OpenClassController : BaseController<IGhre_OpenClassServices,
#region 转入已开课 #region 转入已开课
[HttpPost, Route("TransferOpening/{Id}")] [HttpPost, Route("TransferOpening/{Id}")]
public async Task<ServiceResult> TransferOpening(long Id) => await _service.UpdateStatus([Id], "Opening"); public async Task<ServiceResult> TransferOpening(long Id) => await _service.UpdateStatus([Id], "Opening", "TransferOpening");
[HttpPost, Route("TransferOpening")] [HttpPost, Route("TransferOpening")]
public async Task<ServiceResult> TransferOpening([FromBody] List<long> Ids) => await _service.UpdateStatus(Ids, "Opening"); public async Task<ServiceResult> TransferOpening([FromBody] List<long> Ids) => await _service.UpdateStatus(Ids, "Opening", "TransferOpening");
#endregion #endregion
#region 取消开课 #region 取消开课

@ -3670,14 +3670,14 @@
关联类型 关联类型
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.CourseSceneId"> <member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.CourseId">
<summary> <summary>
课程场景ID 课程ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.CourseId"> <member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.CourseSceneId">
<summary> <summary>
课程ID 课程快照ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.ExamPaperId"> <member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.ExamPaperId">
@ -3725,6 +3725,11 @@
考试形式 考试形式
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.ExamPlace">
<summary>
线下考试地点
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.IsLinkOpenClass"> <member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.IsLinkOpenClass">
<summary> <summary>
是否关联开班 是否关联开班
@ -3740,11 +3745,6 @@
状态 状态
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.ExamPlace">
<summary>
线下考试地点
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.RemarkSz"> <member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.RemarkSz">
<summary> <summary>
备注 备注
@ -3825,6 +3825,11 @@
默认封面图Name 默认封面图Name
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_ExamBase.Source">
<summary>
来源,手动维护、开班
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_ExamMessageLogBase"> <member name="T:Tiobon.Core.Model.Models.Ghre_ExamMessageLogBase">
<summary> <summary>
考试通知记录 (Dto.Base) 考试通知记录 (Dto.Base)
@ -4955,6 +4960,11 @@
结案状态 结案状态
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassBase.ExamId">
<summary>
考试ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassBase.Status"> <member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassBase.Status">
<summary> <summary>
状态 状态
@ -18476,14 +18486,14 @@
关联类型 关联类型
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.CourseSceneId"> <member name="P:Tiobon.Core.Model.Models.Ghre_Exam.CourseId">
<summary> <summary>
课程场景ID 课程ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.CourseId"> <member name="P:Tiobon.Core.Model.Models.Ghre_Exam.CourseSceneId">
<summary> <summary>
课程ID 课程快照ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.ExamPaperId"> <member name="P:Tiobon.Core.Model.Models.Ghre_Exam.ExamPaperId">
@ -18531,6 +18541,11 @@
考试形式 考试形式
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.ExamPlace">
<summary>
线下考试地点
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.IsLinkOpenClass"> <member name="P:Tiobon.Core.Model.Models.Ghre_Exam.IsLinkOpenClass">
<summary> <summary>
是否关联开班 是否关联开班
@ -18546,11 +18561,6 @@
状态 状态
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.ExamPlace">
<summary>
线下考试地点
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.RemarkSz"> <member name="P:Tiobon.Core.Model.Models.Ghre_Exam.RemarkSz">
<summary> <summary>
备注 备注
@ -18631,6 +18641,11 @@
默认封面图Name 默认封面图Name
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_Exam.Source">
<summary>
来源,手动维护、开班
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_ExamMessageLog"> <member name="T:Tiobon.Core.Model.Models.Ghre_ExamMessageLog">
<summary> <summary>
考试通知记录 (Model) 考试通知记录 (Model)
@ -19761,6 +19776,11 @@
结案状态 结案状态
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClass.ExamId">
<summary>
考试ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClass.Status"> <member name="P:Tiobon.Core.Model.Models.Ghre_OpenClass.Status">
<summary> <summary>
状态 状态

@ -995,7 +995,13 @@
<param name="body">条件</param> <param name="body">条件</param>
<returns></returns> <returns></returns>
</member> </member>
<!-- Badly formed XML comment ignored for member "M:Tiobon.Core.Api.Controllers.Ghre_ExamRecordController.ExtendAsync(System.Int64)" --> <member name="M:Tiobon.Core.Api.Controllers.Ghre_ExamRecordController.ExtendAsync(System.Int64)">
<summary>
获取考试记录明细扩展接口
</summary>
<param name="examRecordId"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Api.Controllers.Ghre_ExamRecordController.CommentAsync(Tiobon.Core.Model.Ghre_ExamRecordExtend,System.Int64)"> <member name="M:Tiobon.Core.Api.Controllers.Ghre_ExamRecordController.CommentAsync(Tiobon.Core.Model.Ghre_ExamRecordExtend,System.Int64)">
<summary> <summary>
提交评语接口 提交评语接口

@ -24,5 +24,5 @@ public interface IGhre_OpenClassServices : IBaseServices<Ghre_OpenClass, Ghre_Op
Task<ServiceResult> InsertSummary(long Id, InsertGhre_OpenClassInput entity); Task<ServiceResult> InsertSummary(long Id, InsertGhre_OpenClassInput entity);
Task<ServiceResult> UpdateStatus(List<long> ids, string status); Task<ServiceResult> UpdateStatus(List<long> ids, string status, string source = null);
} }

@ -6,9 +6,9 @@
* *
* Ver * Ver
* *
*V0.01 2024/5/28 18:09:05 SimonHsiao *V0.01 2025/2/14 9:57:56 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2025 Tiobon Corporation. All Rights Reserved.
* *
*   *  
* SimonHsiao * SimonHsiao
@ -30,14 +30,14 @@ public class Ghre_ExamBase
public string LinkType { get; set; } public string LinkType { get; set; }
/// <summary> /// <summary>
/// 课程场景ID /// 课程ID
/// </summary> /// </summary>
public long? CourseSceneId { get; set; } public long? CourseId { get; set; }
/// <summary> /// <summary>
/// 课程ID /// 课程快照ID
/// </summary> /// </summary>
public long? CourseId { get; set; } public long? CourseSceneId { get; set; }
/// <summary> /// <summary>
/// 试卷ID /// 试卷ID
@ -89,6 +89,12 @@ public class Ghre_ExamBase
[Display(Name = "ExamMode"), Description("考试形式"), MaxLength(32, ErrorMessage = "考试形式 不能超过 32 个字符")] [Display(Name = "ExamMode"), Description("考试形式"), MaxLength(32, ErrorMessage = "考试形式 不能超过 32 个字符")]
public string ExamMode { get; set; } public string ExamMode { get; set; }
/// <summary>
/// 线下考试地点
/// </summary>
[Display(Name = "ExamPlace"), Description("线下考试地点"), MaxLength(64, ErrorMessage = "线下考试地点 不能超过 64 个字符")]
public string ExamPlace { get; set; }
/// <summary> /// <summary>
/// 是否关联开班 /// 是否关联开班
/// </summary> /// </summary>
@ -105,12 +111,6 @@ public class Ghre_ExamBase
[Display(Name = "Status"), Description("状态"), MaxLength(32, ErrorMessage = "状态 不能超过 32 个字符")] [Display(Name = "Status"), Description("状态"), MaxLength(32, ErrorMessage = "状态 不能超过 32 个字符")]
public string Status { get; set; } public string Status { get; set; }
/// <summary>
/// 线下考试地点
/// </summary>
[Display(Name = "ExamPlace"), Description("线下考试地点"), MaxLength(64, ErrorMessage = "线下考试地点 不能超过 64 个字符")]
public string ExamPlace { get; set; }
/// <summary> /// <summary>
/// 备注 /// 备注
/// </summary> /// </summary>
@ -202,4 +202,10 @@ public class Ghre_ExamBase
/// </summary> /// </summary>
[Display(Name = "DefaultCoverImageName"), Description("默认封面图Name"), MaxLength(32, ErrorMessage = "默认封面图Name 不能超过 32 个字符")] [Display(Name = "DefaultCoverImageName"), Description("默认封面图Name"), MaxLength(32, ErrorMessage = "默认封面图Name 不能超过 32 个字符")]
public string DefaultCoverImageName { get; set; } public string DefaultCoverImageName { get; set; }
/// <summary>
/// 来源,手动维护、开班
/// </summary>
[Display(Name = "Source"), Description("来源,手动维护、开班"), MaxLength(32, ErrorMessage = "来源,手动维护、开班 不能超过 32 个字符")]
public string Source { get; set; }
} }

@ -194,6 +194,11 @@ public class Ghre_OpenClassBase
/// </summary> /// </summary>
public int? CloseStatus { get; set; } public int? CloseStatus { get; set; }
/// <summary>
/// 考试ID
/// </summary>
public long? ExamId { get; set; }
/// <summary> /// <summary>
/// 状态 /// 状态
/// </summary> /// </summary>

@ -6,9 +6,9 @@
* *
* Ver * Ver
* *
*V0.01 2024/5/28 18:09:05 SimonHsiao *V0.01 2025/2/14 9:57:56 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2025 Tiobon Corporation. All Rights Reserved.
* *
*   *  
* SimonHsiao * SimonHsiao
@ -31,14 +31,14 @@ public class Ghre_Exam : BasePoco
public string LinkType { get; set; } public string LinkType { get; set; }
/// <summary> /// <summary>
/// 课程场景ID /// 课程ID
/// </summary> /// </summary>
public long? CourseSceneId { get; set; } public long? CourseId { get; set; }
/// <summary> /// <summary>
/// 课程ID /// 课程快照ID
/// </summary> /// </summary>
public long? CourseId { get; set; } public long? CourseSceneId { get; set; }
/// <summary> /// <summary>
/// 试卷ID /// 试卷ID
@ -90,6 +90,12 @@ public class Ghre_Exam : BasePoco
[Display(Name = "ExamMode"), Description("考试形式"), MaxLength(32, ErrorMessage = "考试形式 不能超过 32 个字符")] [Display(Name = "ExamMode"), Description("考试形式"), MaxLength(32, ErrorMessage = "考试形式 不能超过 32 个字符")]
public string ExamMode { get; set; } public string ExamMode { get; set; }
/// <summary>
/// 线下考试地点
/// </summary>
[Display(Name = "ExamPlace"), Description("线下考试地点"), MaxLength(64, ErrorMessage = "线下考试地点 不能超过 64 个字符")]
public string ExamPlace { get; set; }
/// <summary> /// <summary>
/// 是否关联开班 /// 是否关联开班
/// </summary> /// </summary>
@ -106,12 +112,6 @@ public class Ghre_Exam : BasePoco
[Display(Name = "Status"), Description("状态"), MaxLength(32, ErrorMessage = "状态 不能超过 32 个字符")] [Display(Name = "Status"), Description("状态"), MaxLength(32, ErrorMessage = "状态 不能超过 32 个字符")]
public string Status { get; set; } public string Status { get; set; }
/// <summary>
/// 线下考试地点
/// </summary>
[Display(Name = "ExamPlace"), Description("线下考试地点"), MaxLength(64, ErrorMessage = "线下考试地点 不能超过 64 个字符")]
public string ExamPlace { get; set; }
/// <summary> /// <summary>
/// 备注 /// 备注
/// </summary> /// </summary>
@ -203,4 +203,10 @@ public class Ghre_Exam : BasePoco
/// </summary> /// </summary>
[Display(Name = "DefaultCoverImageName"), Description("默认封面图Name"), MaxLength(32, ErrorMessage = "默认封面图Name 不能超过 32 个字符")] [Display(Name = "DefaultCoverImageName"), Description("默认封面图Name"), MaxLength(32, ErrorMessage = "默认封面图Name 不能超过 32 个字符")]
public string DefaultCoverImageName { get; set; } public string DefaultCoverImageName { get; set; }
/// <summary>
/// 来源,手动维护、开班
/// </summary>
[Display(Name = "Source"), Description("来源,手动维护、开班"), MaxLength(32, ErrorMessage = "来源,手动维护、开班 不能超过 32 个字符")]
public string Source { get; set; }
} }

@ -195,6 +195,11 @@ public class Ghre_OpenClass : BasePoco
/// </summary> /// </summary>
public int? CloseStatus { get; set; } public int? CloseStatus { get; set; }
/// <summary>
/// 考试ID
/// </summary>
public long? ExamId { get; set; }
/// <summary> /// <summary>
/// 状态 /// 状态
/// </summary> /// </summary>

@ -1244,7 +1244,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
if (entity.LinkType == DIC_EXAM_LINK_TYPE_COURSE) if (entity.LinkType == DIC_EXAM_LINK_TYPE_COURSE)
{ {
#region 校验同一个课程下 考试时间不允许重叠 #region 校验同一个课程下 考试时间不允许重叠
var exams = await base.Query(x => (x.Status == DIC_EXAM_STATUS.RELEASED && x.CourseId == entity.CourseId && x.Id != id) || ids1.Contains(x.Id)); var exams = await base.Query(x => (x.Source == null && x.Status == DIC_EXAM_STATUS.RELEASED && x.CourseId == entity.CourseId && x.Id != id) || ids1.Contains(x.Id));
if (exams.Any()) if (exams.Any())
for (int i = 0; i < exams.Count; i++) for (int i = 0; i < exams.Count; i++)
{ {
@ -1268,7 +1268,7 @@ public class Ghre_ExamServices : BaseServices<Ghre_Exam, Ghre_ExamDto, InsertGhr
else else
{ {
#region 校验同一个课程场景下 考试时间不允许重叠 #region 校验同一个课程场景下 考试时间不允许重叠
var exams = await base.Query(x => (x.Status == DIC_EXAM_STATUS.RELEASED && x.CourseSceneId == entity.CourseSceneId && x.Id != id) || ids1.Contains(x.Id)); var exams = await base.Query(x => (x.Source == null && x.Status == DIC_EXAM_STATUS.RELEASED && x.CourseSceneId == entity.CourseSceneId && x.Id != id) || ids1.Contains(x.Id));
if (exams.Any()) if (exams.Any())
for (int i = 0; i < exams.Count; i++) for (int i = 0; i < exams.Count; i++)
{ {

@ -1,7 +1,4 @@
using MathNet.Numerics.Distributions; namespace Tiobon.Core.Services;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
namespace Tiobon.Core.Services;
/// <summary> /// <summary>
/// 开班管理 (服务) /// 开班管理 (服务)
@ -311,12 +308,81 @@ public class Ghre_OpenClassServices : BaseServices<Ghre_OpenClass, Ghre_OpenClas
#endregion #endregion
#region 修改状态 #region 修改状态
public async Task<ServiceResult> UpdateStatus(List<long> ids, string status) [UseTran]
public async Task<ServiceResult> UpdateStatus(List<long> ids, string status, string source = null)
{ {
await Db.Updateable<Ghre_OpenClass>()
.SetColumns(it => new Ghre_OpenClass() { Status = status }) switch (source)
{
case "TransferOpening":
#region 转入开课,开班自动产生考试数据
var list = await Query(x => ids.Contains(x.Id));
for (int i = 0; i < list.Count; i++)
{
var entity = list[i];
if (entity.ExamId.IsNullOrEmpty())
{
var exam = new Ghre_Exam()
{
ExamNo = entity.OpenClassNo,
ExamName = entity.OpenClassName,
UseDefaultCoverImage = true,
DateType = "ExamDate",
BeginTime = entity.ExamStartTime,
EndTime = entity.ExamEndTime,
ExamMode = "Online",
IsLinkOpenClass = true,
Status = "Released",
LinkType = entity.LinkType == "Course" ? "CourseId" : "CourseSceneId",
CourseId = entity.LinkType == "Course" ? entity.LinkId : null,
CourseSceneId = entity.LinkType == "CourseScene" ? entity.LinkId : null,
ExamPaperId = entity.ExamPaperId,
Source = "OpenClass"
};
var examId = await Db.Insertable(exam).ExecuteReturnSnowflakeIdAsync();
await Db.Updateable<Ghre_OpenClass>()
.SetColumns(it => new Ghre_OpenClass() { Status = status, ExamId = examId })
.Where(it => it.Id == entity.Id)
.ExecuteCommandAsync();
}
else
{
await Db.Updateable<Ghre_Exam>()
.SetColumns(it => new Ghre_Exam()
{
ExamNo = entity.OpenClassNo,
ExamName = entity.OpenClassName,
BeginTime = entity.ExamStartTime,
EndTime = entity.ExamEndTime,
LinkType = entity.LinkType == "Course" ? "CourseId" : "CourseSceneId",
CourseId = entity.LinkType == "Course" ? entity.LinkId : null,
CourseSceneId = entity.LinkType == "CourseScene" ? entity.LinkId : null,
ExamPaperId = entity.ExamPaperId
})
.Where(it => it.Id == entity.ExamId)
.ExecuteCommandAsync();
await Db.Updateable<Ghre_OpenClass>()
.SetColumns(it => new Ghre_OpenClass() { Status = status })
.Where(it => it.Id == entity.Id)
.ExecuteCommandAsync();
}
}
#endregion
break;
default:
await Db.Updateable<Ghre_OpenClass>()
.SetColumns(it => new Ghre_OpenClass() { Status = status })
.Where(it => ids.Contains(it.Id)) .Where(it => ids.Contains(it.Id))
.ExecuteCommandAsync(); .ExecuteCommandAsync();
break;
}
return ServiceResult.OprateSuccess(); return ServiceResult.OprateSuccess();
} }
#endregion #endregion

Loading…
Cancel
Save