新增查询开班课表数据接口

新增开班签退接口
master
xiaochanghai 2 months ago
parent 6b500e207f
commit a02fb0f2e9
  1. 20
      Tiobon.Core.Api/Controllers/Ghre/Ghre_OpenClassController.cs
  2. 38
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  3. 14
      Tiobon.Core.Api/Tiobon.Core.xml
  4. 2
      Tiobon.Core.IServices/Ghre/IGhre_OpenClassServices.cs
  5. 6
      Tiobon.Core.Model/Base/Ghre/Ghre_OpenClassAttend.Dto.Base.cs
  6. 7
      Tiobon.Core.Model/Base/Ghre/Ghre_OpenClassSchedule.Dto.Base.cs
  7. 6
      Tiobon.Core.Model/Models/Ghre/Ghre_OpenClassAttend.cs
  8. 7
      Tiobon.Core.Model/Models/Ghre/Ghre_OpenClassSchedule.cs
  9. 26
      Tiobon.Core.Model/ViewModels/Extend/Ghre_OpenClassScore.cs
  10. 4
      Tiobon.Core.Services/CommonServices.cs
  11. 5
      Tiobon.Core.Services/Ghre/Ghre_CourseWareServices.cs
  12. 116
      Tiobon.Core.Services/Ghre/Ghre_OpenClassServices.cs
  13. 38
      Tiobon.Core/Tiobon.Core.Model.xml
  14. 14
      Tiobon.Core/Tiobon.Core.xml

@ -200,4 +200,24 @@ public class Ghre_OpenClassController : BaseController<IGhre_OpenClassServices,
[HttpPost, Route("QuerySchedule/{Id}")]
public async Task<ServiceResult<Ghre_OpenClassSchedule1>> QuerySchedule(long Id) => await _service.QuerySchedule(Id);
#endregion
#region 签到
/// <summary>
/// 签到
/// </summary>
/// <param name="Id">开班ID</param>
/// <returns></returns>
[HttpPost, Route("AttendCheckIn/{Id}")]
public async Task<ServiceResult> AttendCheckIn(long Id) => await _service.Attend(Id, "CheckIn");
#endregion
#region 签退
/// <summary>
/// 签退
/// </summary>
/// <param name="Id">开班ID</param>
/// <returns></returns>
[HttpPost, Route("AttendCheckOut/{Id}")]
public async Task<ServiceResult> AttendCheckOut(long Id) => await _service.Attend(Id, "CheckOut");
#endregion
}

@ -5825,9 +5825,9 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttendBase.TeacherSuperiorId">
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttendBase.StaffId">
<summary>
讲师上级ID
员工ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassFeeBase">
@ -6030,6 +6030,11 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassScheduleBase.StartEndTime">
<summary>
讲师上级ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassScoresBase">
<summary>
开班成绩 (Dto.Base)
@ -23012,9 +23017,9 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttend.TeacherSuperiorId">
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttend.StaffId">
<summary>
讲师上级ID
员工ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassFee">
@ -23217,6 +23222,11 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassSchedule.TeacherSuperiorId">
<summary>
讲师上级ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassScores">
<summary>
开班成绩 (Model)
@ -38453,6 +38463,16 @@
批改评语
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassSchedule1.IsCheckIn">
<summary>
是否可以签到
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassSchedule1.IsCheckOut">
<summary>
是否可以签退
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.CourseId">
<summary>
课程ID
@ -38478,6 +38498,16 @@
结束时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.StartTime1">
<summary>
开始时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.EndTime1">
<summary>
结束时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.RemarkSz">
<summary>
备注

@ -1191,6 +1191,20 @@
<param name="Id">开班ID</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Api.Controllers.Ghre_OpenClassController.AttendCheckIn(System.Int64)">
<summary>
签到
</summary>
<param name="Id">开班ID</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Api.Controllers.Ghre_OpenClassController.AttendCheckOut(System.Int64)">
<summary>
签退
</summary>
<param name="Id">开班ID</param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Api.Controllers.Ghre_OpenClassFeeController">
<summary>
开班费用(Controller)

@ -33,4 +33,6 @@ public interface IGhre_OpenClassServices : IBaseServices<Ghre_OpenClass, Ghre_Op
Task<ServiceResult<ExcelData>> ExportStaff(long Id);
Task<ServiceResult<Ghre_OpenClassSchedule1>> QuerySchedule(long Id);
Task<ServiceResult> Attend(long Id, string type);
}

@ -6,7 +6,7 @@
*
* Ver
*
*V0.01 2025/4/15 9:41:36 SimonHsiao
*V0.01 2025/4/15 15:27:48 SimonHsiao
*
* Copyright(c) 2025 Tiobon Corporation. All Rights Reserved.
*
@ -120,7 +120,7 @@ public class Ghre_OpenClassAttendBase
public int? ReverseI2 { get; set; }
/// <summary>
/// 讲师上级ID
/// 员工ID
/// </summary>
public long? TeacherSuperiorId { get; set; }
public int? StaffId { get; set; }
}

@ -6,7 +6,7 @@
*
* Ver
*
*V0.01 2025/2/8 14:57:01 SimonHsiao
*V0.01 2025/4/15 15:27:32 SimonHsiao
*
* Copyright(c) 2025 Tiobon Corporation. All Rights Reserved.
*
@ -135,5 +135,10 @@ public class Ghre_OpenClassScheduleBase
/// </summary>
public int? ReverseI2 { get; set; }
/// <summary>
/// 讲师上级ID
/// </summary>
public List<DateTime> StartEndTime { get; set; } = new List<DateTime>();
public long? TeacherSuperiorId { get; set; }
}

@ -6,7 +6,7 @@
*
* Ver
*
*V0.01 2025/4/15 9:41:36 SimonHsiao
*V0.01 2025/4/15 15:27:48 SimonHsiao
*
* Copyright(c) 2025 Tiobon Corporation. All Rights Reserved.
*
@ -121,7 +121,7 @@ public class Ghre_OpenClassAttend : BasePoco
public int? ReverseI2 { get; set; }
/// <summary>
/// 讲师上级ID
/// 员工ID
/// </summary>
public long? TeacherSuperiorId { get; set; }
public int? StaffId { get; set; }
}

@ -6,7 +6,7 @@
*
* Ver
*
*V0.01 2025/2/8 14:57:01 SimonHsiao
*V0.01 2025/4/15 15:27:32 SimonHsiao
*
* Copyright(c) 2025 Tiobon Corporation. All Rights Reserved.
*
@ -135,4 +135,9 @@ public class Ghre_OpenClassSchedule : BasePoco
/// 预留字段12
/// </summary>
public int? ReverseI2 { get; set; }
/// <summary>
/// 讲师上级ID
/// </summary>
public long? TeacherSuperiorId { get; set; }
}

@ -90,6 +90,18 @@ public class Ghre_OpenClassScore
public class Ghre_OpenClassSchedule1
{
public string SceneName { get; set; }
/// <summary>
/// 是否可以签到
/// </summary>
public bool IsCheckIn { get; set; } = false;
/// <summary>
/// 是否可以签退
/// </summary>
public bool IsCheckOut { get; set; } = false;
public string Status { get; set; }
public string AttendType { get; set; }
public List<Ghre_OpenClassScheduleDeatil> Details { get; set; }
}
@ -98,7 +110,7 @@ public class Ghre_OpenClassSchedule1
public class Ghre_OpenClassScheduleDeatil
{
public string Id { get; set; }
public long? Id { get; set; }
/// <summary>
/// 课程ID
@ -125,6 +137,16 @@ public class Ghre_OpenClassScheduleDeatil
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime1 { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime1 { get; set; }
/// <summary>
/// 备注
/// </summary>
@ -139,6 +161,8 @@ public class Ghre_OpenClassScheduleDeatil
/// 课程名称
/// </summary>
public string CourseName { get; set; }
public DateTime? CheckInTime { get; set; }
public DateTime? CheckOutTime { get; set; }
/// <summary>
/// 状态,缺席:Absence,出席:Attend,当前课程:Current,待开课:WaitStart

@ -3945,7 +3945,7 @@ public partial class CommonServices : BaseServices<RootEntityTkey<int>>, ICommon
SET @OperateLogID = NULL;
EXEC @return_value = GHR30.dbo.[PS_OperateLog]
EXEC @return_value = dbo.[PS_OperateLog]
@OpUserID = {param.userId},
@OpType = {param.doType},
@OpMenuNo = {param.menuName},
@ -4054,7 +4054,7 @@ public partial class CommonServices : BaseServices<RootEntityTkey<int>>, ICommon
SET @ErrorMsg = NULL;
EXEC @return_value = GHR30.dbo.[PT_GHR30_FlowApply]
EXEC @return_value = dbo.[PT_GHR30_FlowApply]
@ID = {id},
@FlowID = {@FlowID},
@UserID = {param.userId},

@ -39,8 +39,9 @@ public class Ghre_CourseWareServices : BaseServices<Ghre_CourseWare, Ghre_Course
x.CourseWareId = result;
x.RelativePath = x.RelativePath.Replace("/Advanced", null);
});
await _ghre_CourseWareAttachmentServices.Add(entity.Attachments);
if (entity.Links != null && entity.Links.Any())
if (entity.Source == "Attachments")
await _ghre_CourseWareAttachmentServices.Add(entity.Attachments);
else if (entity.Links != null && entity.Links.Any())
{
var attachments = entity.Links.Select(x => new InsertGhre_CourseWareAttachmentInput()
{

@ -1,4 +1,6 @@
namespace Tiobon.Core.Services;
using MongoDB.Driver.Linq;
namespace Tiobon.Core.Services;
/// <summary>
/// 开班管理 (服务)
@ -488,8 +490,13 @@ WHERE B.OpenClassId = '{Id}'";
public async Task<ServiceResult<Ghre_OpenClassSchedule1>> QuerySchedule(long Id)
{
var data = new Ghre_OpenClassSchedule1();
data.AttendType = await Db.Queryable<Ghre_Config>().Where(x => x.ConfigCode == "Open_Class_Schedule_Attend_Type").Select(x => x.ConfigValue).FirstAsync() ?? "CheckIn";
var min = await Db.Queryable<Ghre_Config>().Where(x => x.ConfigCode == "Open_Class_Schedule_Valid_Attend_Min").Select(x => x.ConfigValue).FirstAsync() ?? "15";
var entity = await base.QueryById(Id);
var attends = await Db.Queryable<Ghre_OpenClassAttend>().Where(x => x.OpenClassId == Id && x.StaffId == App.User.StaffId).ToListAsync();
if (entity.LinkType == "CourseScene")
{
@ -505,7 +512,13 @@ WHERE B.OpenClassId = '{Id}'";
FROM Ghre_OpenClassSchedule A LEFT JOIN Ghre_Course B ON A.CourseId = B.Id
WHERE A.OpenClassId = '{Id}' AND A.IsEnable = 1";
data.Details = await Db.Ado.SqlQueryAsync<Ghre_OpenClassScheduleDeatil>(sql);
data.Details.ForEach(x =>
{
x.StartTime = x.StartTime;
x.EndTime = x.EndTime;
x.StartTime1 = x.StartTime.Value.AddMinutes(-min.ObjToInt());
x.EndTime1 = x.EndTime.Value.AddMinutes(min.ObjToInt());
});
}
else
{
@ -514,26 +527,123 @@ WHERE A.OpenClassId = '{Id}' AND A.IsEnable = 1";
Address = entity.Address,
StartTime = entity.StartTime,
EndTime = entity.EndTime,
StartTime1 = entity.StartTime.Value.AddMinutes(-min.ObjToInt()),
EndTime1 = entity.EndTime.Value.AddMinutes(min.ObjToInt()),
CourseId = entity.LinkId,
};
detail.CourseName = await Db.Queryable<Ghre_Course>().Where(x => x.Id == entity.LinkId).Select(x => x.CourseName).FirstAsync();
data.Details.Add(detail);
}
var dt = DateTime.Now;
data.Details.ForEach(d =>
{
d.Time = DateTimeHelper.ConvertToMiniuteString(d.StartTime) + " ~ " + DateTimeHelper.ConvertToMiniuteString(d.EndTime);
if (d.StartTime1 <= dt && dt <= d.EndTime1)
d.Status = "Current";
if (d.StartTime1 > dt)
d.Status = "WaitStart";
#region 处理签到签退时间
if (data.SceneName.IsNotEmptyOrNull())
{
d.CheckInTime = attends.Where(x => x.ScheduleId == d.Id && x.Reverse1 == "CheckIn").Select(x => x.AttendTime).FirstOrDefault();
d.CheckOutTime = attends.Where(x => x.ScheduleId == d.Id && x.Reverse1 == "CheckOut").Select(x => x.AttendTime).FirstOrDefault();
}
else
{
d.CheckInTime = attends.Where(x => x.Reverse1 == "CheckIn").Select(x => x.AttendTime).FirstOrDefault();
d.CheckOutTime = attends.Where(x => x.Reverse1 == "CheckOut").Select(x => x.AttendTime).FirstOrDefault();
}
#endregion
if (d.Status != "Current")
{
if (d.CheckInTime != null)
d.Status = "Attend";
}
});
//entitys.ForEach(it =>
//{
// it.IsPassLabel = it.IsPass == true ? "合格" : "不合格";
// it.FinallyIsPassLabel = it.FinallyIsPass == true ? "合格" : "不合格";
//});
var current = data.Details.Where(x => x.Status == "Current").FirstOrDefault();
if (current != null)
{
data.IsCheckIn = true;
data.IsCheckOut = false;
if (current.CheckInTime != null)
{
data.IsCheckIn = false;
data.Status = "HasCheckIn";
var start = current.EndTime.Value.AddMinutes(-min.ObjToInt() * 2);
if (dt >= start && dt <= current.EndTime)
data.IsCheckOut = true;
}
if (current.CheckOutTime != null)
{
data.IsCheckOut = false;
data.Status = "HasCheckOut";
}
}
return ServiceResult<Ghre_OpenClassSchedule1>.OprateSuccess("查询成功!", data);
}
#endregion
#region 签到
/// <summary>
/// 签到
/// </summary>
/// <param name="Id">开班ID</param>
/// <returns></returns>
public async Task<ServiceResult> Attend(long Id, string type)
{
var entity = await base.QueryById(Id);
if (entity is null)
return ServiceResult.OprateSuccess("无效的开班ID!");
long? scheduleId = null;
var dt = DateTime.Now;
var min = await Db.Queryable<Ghre_Config>().Where(x => x.ConfigCode == "Open_Class_Schedule_Valid_Attend_Min").Select(x => x.ConfigValue).FirstAsync() ?? "15";
if (entity.LinkType == "CourseScene")
{
var schedules = await Db.Queryable<Ghre_OpenClassSchedule>().Where(x => x.OpenClassId == entity.Id).ToListAsync();
schedules.ForEach(x =>
{
x.StartTime = x.StartTime.Value.AddMinutes(-min.ObjToInt());
x.EndTime = x.EndTime.Value.AddMinutes(min.ObjToInt());
});
scheduleId = schedules.Where(x => x.StartTime <= dt && x.EndTime >= dt).FirstOrDefault()?.Id;
}
if (!await Db.Queryable<Ghre_OpenClassAttend>()
.Where(x => x.OpenClassId == Id && x.StaffId == App.User.StaffId && x.ScheduleId == scheduleId && x.Reverse1 == type)
.AnyAsync())
{
var staff = new Ghre_OpenClassAttend()
{
StaffId = App.User.StaffId,
OpenClassId = Id,
AttendTime = DateTime.Now,
ScheduleId = scheduleId,
Reverse1 = type
};
await Db.Insertable(staff).ExecuteReturnSnowflakeIdAsync();
}
return ServiceResult.OprateSuccess("签到成功!");
}
#endregion
}

@ -5825,9 +5825,9 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttendBase.TeacherSuperiorId">
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttendBase.StaffId">
<summary>
讲师上级ID
员工ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassFeeBase">
@ -6030,6 +6030,11 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassScheduleBase.StartEndTime">
<summary>
讲师上级ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassScoresBase">
<summary>
开班成绩 (Dto.Base)
@ -23012,9 +23017,9 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttend.TeacherSuperiorId">
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassAttend.StaffId">
<summary>
讲师上级ID
员工ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassFee">
@ -23217,6 +23222,11 @@
预留字段12
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_OpenClassSchedule.TeacherSuperiorId">
<summary>
讲师上级ID
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.Ghre_OpenClassScores">
<summary>
开班成绩 (Model)
@ -38453,6 +38463,16 @@
批改评语
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassSchedule1.IsCheckIn">
<summary>
是否可以签到
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassSchedule1.IsCheckOut">
<summary>
是否可以签退
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.CourseId">
<summary>
课程ID
@ -38478,6 +38498,16 @@
结束时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.StartTime1">
<summary>
开始时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.EndTime1">
<summary>
结束时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.Ghre_OpenClassScheduleDeatil.RemarkSz">
<summary>
备注

@ -1191,6 +1191,20 @@
<param name="Id">开班ID</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Api.Controllers.Ghre_OpenClassController.AttendCheckIn(System.Int64)">
<summary>
签到
</summary>
<param name="Id">开班ID</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Api.Controllers.Ghre_OpenClassController.AttendCheckOut(System.Int64)">
<summary>
签退
</summary>
<param name="Id">开班ID</param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Api.Controllers.Ghre_OpenClassFeeController">
<summary>
开班费用(Controller)

Loading…
Cancel
Save