Commit 20d8c6d1 authored by 吴春's avatar 吴春

提交代码

parent edf0d7d6
......@@ -11,55 +11,71 @@ namespace Edu.Model.Entity.Course
[DB(ConnectionName = "DefaultConnection")]
public class RB_Class_Room
{
/// <summary>
/// 主键编号
/// </summary>
public int RoomId { get; set; }
/// <summary>
/// 主键编号
/// </summary>
public int RoomId { get; set; }
/// <summary>
/// 教师名称
/// </summary>
public string RoomName { get; set; }
/// <summary>
/// 教师名称
/// </summary>
public string RoomName { get; set; }
public int SeatNum { get; set; }
public int SeatNum { get; set; }
public string RoomPic { get; set; }
public string RoomPic { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public string StartTime { get; set; }
/// <summary>
/// 所属校区
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 状态
/// </summary>
public DateStateEnum Status { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public string EndTime { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 总小时数
/// </summary>
public decimal TotalHour { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 更新人
/// </summary>
public int? UpdateBy { get; set; }
/// <summary>
/// 所属校区
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime UpdateTime { get; set; }
/// <summary>
/// 状态
/// </summary>
public DateStateEnum Status { get; set; }
}
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 更新人
/// </summary>
public int? UpdateBy { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime UpdateTime { get; set; }
}
}
using Edu.Common.Enum;
using System;
using VT.FW.DB;
namespace Edu.Model.Entity.Course
{
/// <summary>
/// 教室异常管理实体类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Class_RoomUseLog
{
/// <summary>
/// 错误编号
/// </summary>
public int RoomErrorId { get; set; }
/// <summary>
/// 教室编号
/// </summary>
public int RoomId { get; set; }
/// <summary>
/// 标题
/// </summary>
public string ErrorTitle { get; set; }
/// <summary>
/// 异常内容
/// </summary>
public string ErrorContent { get; set; }
/// <summary>
/// 图片
/// </summary>
public string LogPic { get; set; }
/// <summary>
/// 0-正常,1-异常
/// </summary>
public int ErrorType { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 所属校区
/// </summary>
public int School_Id { get; set; }
/// <summary>
/// 状态
/// </summary>
public DateStateEnum Status { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? UpdateTime { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string ManageName { get; set; }
/// <summary>
/// 参与人员
/// </summary>
public string Participants { get; set; }
}
}
......@@ -50,6 +50,16 @@ namespace Edu.Model.Entity.Course
/// </summary>
public int ClassStatus { get; set; }
/// <summary>
/// 实际上课开始时间
/// </summary>
public DateTime? InClassTime { get; set; }
/// <summary>
/// 实际下课时间
/// </summary>
public DateTime? ClassOverTime { get; set; }
/// <summary>
/// 课堂随拍图片
/// </summary>
......
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Model.Entity.Course;
namespace Edu.Model.ViewModel.Course
{
/// <summary>
/// 教室异常管理扩展类
/// </summary>
public class RB_Class_RoomUseLog_ViewModel : RB_Class_RoomUseLog
{
/// <summary>
/// 教室ids
/// </summary>
public string QRoomIds { get; set; }
/// <summary>
/// 教室名称
/// </summary>
public string RommName { get; set; }
/// <summary>
/// 参与人员照片
/// </summary>
public List<string> ParticipantsList { get; set; }
/// <summary>
/// 照片
/// </summary>
public List<string> LogPicList { get; set; }
#region 查询
/// <summary>
/// 开始时间
/// </summary>
public string StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public string EndTime { get; set; }
#endregion
}
}
......@@ -32,6 +32,17 @@ namespace Edu.Model.ViewModel.Course
/// <summary>
/// 随拍list
/// </summary>
public List<string> SuiPaiList { get; set; }
public List<string> SuiPaiList { get; set; }
/// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 教室id
/// </summary>
public int ClassRoomId { get; set; }
}
}
\ No newline at end of file
......@@ -24,6 +24,16 @@ namespace Edu.Model.ViewModel.Course
/// </summary>
public int StudentId { get; set; }
/// <summary>
/// 课程名称
/// </summary>
public string CourseName { get; set; }
/// <summary>
/// 出勤
/// </summary>
public int IsCheck { get; set; }
/// <summary>
/// 生日
/// </summary>
......@@ -34,10 +44,12 @@ namespace Edu.Model.ViewModel.Course
/// </summary>
public string GuestStateStr
{
get { string str = "";
get
{
string str = "";
switch (this.GuestState)
{
case 1: str = "正常";break;
case 1: str = "正常"; break;
case 2: str = "退学"; break;
case 3: str = "申请退学中"; break;
case 4: str = "驳回申请"; break;
......@@ -67,7 +79,7 @@ namespace Edu.Model.ViewModel.Course
/// </summary>
public string ContractStatusStr
{
get;set;
get; set;
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Model.ViewModel.Question
{
public class RB_Question_RoomUseLog_ViewModel
{
public int Id { get; set; }
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public string StartTime { get; set; }
public DateTime InfoTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public string EndTime { get; set; }
/// <summary>
/// 0-班级,1-使用记录,2-异常记录
/// </summary>
public int Type { get; set; }
/// <summary>
/// 班级状态
/// </summary>
public int ClassStatus { get; set; }
}
}
......@@ -150,6 +150,29 @@ namespace Edu.Module.Course
return class_TimeRepository.GetClassTimeListRepository(query);
}
/// <summary>
/// 获取班级上课时间列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Time_ViewModel> GetClassTimeList_V2(RB_Class_Time_ViewModel query)
{
return class_TimeRepository.GetClassTimeList_V2(query);
}
/// <summary>
/// 获取班级上课时间列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Time_ViewModel> GetClassTimeList(RB_Class_Time_ViewModel query)
{
return class_TimeRepository.GetClassTimeList(query);
}
/// <summary>
/// 获取班级分页列表
/// </summary>
......@@ -479,8 +502,8 @@ namespace Edu.Module.Course
var flag2 = class_PlanRepository.DeleteClassPlanRepository(ids);
}
}
List<RB_Class_Plan_ViewModel> classPlanList = new List<RB_Class_Plan_ViewModel>();
List<RB_Class_Plan_ViewModel> classPlanList = new List<RB_Class_Plan_ViewModel>();
if (model.ClassHours > 0)
{
var srartDate = model.OpenTime;
......@@ -631,7 +654,7 @@ namespace Edu.Module.Course
var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
if (timeList != null && timeList.Count > 0)
{
CalcDayClassHoursModule(timeList,planModel.PlanTimeList);
CalcDayClassHoursModule(timeList, planModel.PlanTimeList);
classPlanList.Add(planModel);
}
}
......@@ -651,7 +674,7 @@ namespace Edu.Module.Course
/// </summary>
/// <param name="timeList"></param>
/// <returns></returns>
private double CalcDayClassHoursModule(List<TimeItem> timeList,List<RB_Class_Time_ViewModel> classTimeList)
private double CalcDayClassHoursModule(List<TimeItem> timeList, List<RB_Class_Time_ViewModel> classTimeList)
{
double dayMinutes = 0;
foreach (var sItem in timeList)
......@@ -957,7 +980,7 @@ namespace Edu.Module.Course
/// </summary>
/// <param name="classId">班级编号</param>
/// <returns></returns>
public object GetClassStudentListModule(int classId, int school_Id, int group_Id)
public object GetClassStudentListModule(int classId, int school_Id, int group_Id, string ClassDate)
{
List<object> list = new List<object>();
var orderStudentList = order_GuestRepository.GetList(new RB_Order_Guest_ViewModel()
......@@ -968,10 +991,20 @@ namespace Edu.Module.Course
}).Where(x => x.GuestState == 1).ToList();
var classModel = GetClassModule(classId);
var courseModel = courseRepository.GetEntity((classModel?.CouseId ?? 0));
List<RB_Class_Check_ViewModel> checkList = new List<RB_Class_Check_ViewModel>();
if (!string.IsNullOrWhiteSpace(ClassDate))
{
checkList = GetClassCheckList(new RB_Class_Check_ViewModel { Group_Id = group_Id, ClassId = classId, StartDate = ClassDate, EndDate = ClassDate });
}
if (orderStudentList != null && orderStudentList.Count > 0)
{
foreach (var item in orderStudentList)
{
int checkStatus = -1;
if (!string.IsNullOrWhiteSpace(ClassDate) && checkList != null && checkList.Any())
{
checkStatus = checkList?.Where(qitem => qitem.ClassDate.ToString("yyyy-MM-dd") == Convert.ToDateTime(ClassDate).ToString("yyyy-MM-dd") && qitem.ClassId == item.ClassId && qitem.OrderGuestId == item.Id)?.FirstOrDefault()?.CheckStatus ?? -1;
}
list.Add(new
{
UserIcon = item.StuIcon,
......@@ -983,7 +1016,8 @@ namespace Edu.Module.Course
item.Mobile,
item.OrderId,
ClassHours = classModel?.ClassHours ?? 0,
IsRenew = courseModel?.IsRenew ?? 0
IsRenew = courseModel?.IsRenew ?? 0,
CheckStatus = checkStatus,
});
}
}
......@@ -1001,6 +1035,18 @@ namespace Edu.Module.Course
return order_GuestRepository.GetList(model);
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="demodel"></param>
/// <param name="orderIds"></param>
/// <returns></returns>
public List<RB_Order_Guest_ViewModel> GetList_V2(RB_Order_Guest_ViewModel demodel)
{
return order_GuestRepository.GetList_V2(demodel);
}
/// <summary>
/// 更新学生的退课信息
/// </summary>
......@@ -1300,6 +1346,17 @@ namespace Edu.Module.Course
return class_PlanRepository.GetClassPlanListRepository(query);
}
/// <summary>
/// 获取上课计划
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Plan_ViewModel> GetClassPlanList_V2(RB_Class_Plan_ViewModel query)
{
return class_PlanRepository.GetClassPlanList_V2(query);
}
/// <summary>
/// 获取学生列表
/// </summary>
......@@ -1765,9 +1822,26 @@ namespace Edu.Module.Course
public bool UpdateTimeClassStatus(int classStatus, int Id)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
};
if (classStatus == 1)
{
{ nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
};
fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
{ nameof(RB_Class_Time_ViewModel.InClassTime),System.DateTime.Now},
};
}
else if (classStatus == 2)
{
fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Time_ViewModel.ClassOverTime),System.DateTime.Now},
{ nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
};
}
return class_TimeRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_ViewModel.ClassTimeId), Id));
}
......
......@@ -17,6 +17,12 @@ namespace Edu.Module.Course
/// 教室管理仓储层对象
/// </summary>
private readonly RB_Class_RoomRepository class_RoomRepository = new RB_Class_RoomRepository();
/// <summary>
/// 教室异常仓储对象
/// </summary>
private readonly RB_Class_RoomUseLogRepository class_RoomUseLogRepository = new RB_Class_RoomUseLogRepository();
#region 教室管理
/// <summary>
/// 获取教室分页列表
......@@ -41,6 +47,19 @@ namespace Edu.Module.Course
return class_RoomRepository.GetClassRoomListRepository(query);
}
/// <summary>
/// 获取教室列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Room_ViewModel> GetClassRoomList(RB_Class_Room_ViewModel query)
{
return class_RoomRepository.GetClassRoomList(query);
}
/// <summary>
/// 新增修改教室
/// </summary>
......@@ -59,6 +78,9 @@ namespace Edu.Module.Course
{nameof(RB_Class_Room_ViewModel.School_Id),extModel.School_Id },
{nameof(RB_Class_Room_ViewModel.SeatNum),extModel.SeatNum },
{nameof(RB_Class_Room_ViewModel.RoomPic),extModel.RoomPic },
{nameof(RB_Class_Room_ViewModel.StartTime),extModel.StartTime },
{nameof(RB_Class_Room_ViewModel.EndTime),extModel.EndTime },
{nameof(RB_Class_Room_ViewModel.TotalHour),extModel.TotalHour },
};
flag = class_RoomRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Room_ViewModel.RoomId), extModel.RoomId));
}
......@@ -88,7 +110,7 @@ namespace Edu.Module.Course
/// <param name="RoomId"></param>
/// <param name="Status">状态</param>
/// <returns></returns>
public bool RemoveClassRoomModule(object RoomId,int Status)
public bool RemoveClassRoomModule(object RoomId, int Status)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
......@@ -96,5 +118,89 @@ namespace Edu.Module.Course
};
return class_RoomRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Room_ViewModel.RoomId), RoomId));
}
#endregion
#region 教室异常
/// <summary>
/// 获取教异常分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="rowsCount"></param>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_RoomUseLog_ViewModel> GetClassRoomUseLogPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Class_RoomUseLog_ViewModel query)
{
return class_RoomUseLogRepository.GetClassRoomUseLogPageListRepository(pageIndex, pageSize, out rowsCount, query);
}
/// <summary>
/// 获取教室异常列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_RoomUseLog_ViewModel> GetClassRoomUseLogListRepository(RB_Class_RoomUseLog_ViewModel query)
{
return class_RoomUseLogRepository.GetClassRoomUseLogListRepository(query);
}
/// <summary>
/// 获取实体信息
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public Model.Entity.Course.RB_Class_RoomUseLog GetRoomUseLogEntity(object Id)
{
return class_RoomUseLogRepository.GetEntity(Id);
}
/// <summary>
/// 新增/修改教室异常
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int SetRoomUseLog(RB_Class_RoomUseLog_ViewModel model)
{
if (model.RoomErrorId == 0)
{
return class_RoomUseLogRepository.Insert(model);
}
else
{
Dictionary<string, object> fileds = new Dictionary<string, object>() ;
if (model.UpdateTime.HasValue)
{
fileds = new Dictionary<string, object>()
{
{nameof(RB_Class_RoomUseLog_ViewModel.UpdateTime),model.UpdateTime },
{nameof(RB_Class_RoomUseLog_ViewModel.Participants),model.Participants }
};
}
else {
fileds = new Dictionary<string, object>()
{
{nameof(RB_Class_RoomUseLog_ViewModel.Participants),model.Participants }
};
}
bool flag = class_RoomUseLogRepository.Update(fileds, new WhereHelper(nameof(RB_Class_RoomUseLog_ViewModel.RoomErrorId), model.RoomErrorId));
if (flag)
{
return model.RoomErrorId;
}
else
{
return 0;
}
}
}
#endregion
}
}
......@@ -72,7 +72,7 @@ WHERE 1=1 AND A.Status=0 ");
/// <param name="rowsCount"></param>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Check_ViewModel> GetClassCheckPageRepository(int pageIndex,int pageSize,out long rowsCount, RB_Class_Check_ViewModel query)
public List<RB_Class_Check_ViewModel> GetClassCheckPageRepository(int pageIndex, int pageSize, out long rowsCount, RB_Class_Check_ViewModel query)
{
var parameters = new DynamicParameters();
StringBuilder builder = new StringBuilder();
......@@ -85,7 +85,7 @@ FROM RB_Class_Check AS A LEFT JOIN rb_order_guest AS B ON A.OrderGuestId=B.Id
LEFT JOIN rb_class_room AS E ON A.ClassRoomId=E.RoomId
LEFT JOIN rb_teacher AS F ON A.TeacherId=F.TId
WHERE 1=1 AND A.Status=0 ");
builder.AppendFormat(" AND A.{0} IN(2,3) ", nameof(RB_Class_Check_ViewModel.MakeUpStatus));
builder.AppendFormat(" AND A.{0} IN(2,3) ", nameof(RB_Class_Check_ViewModel.MakeUpStatus));
if (query != null)
{
if (query.Group_Id > 0)
......@@ -155,7 +155,7 @@ WHERE 1=1 AND A.Status=0 ");
}
}
builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Class_Check_ViewModel.ClassDate));
return GetPage<RB_Class_Check_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(),parameters).ToList();
return GetPage<RB_Class_Check_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
}
/// <summary>
......@@ -263,13 +263,13 @@ GROUP BY B.OrderGuestId
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public int CalcPlanMinutesRepository(RB_Class_Plan_ViewModel query )
public int CalcPlanMinutesRepository(RB_Class_Plan_ViewModel query)
{
int result = 0;
string where = "";
if (query.ClassId > 0)
{
where+=string.Format(" AND B.ClassId={0} ", query.ClassId);
where += string.Format(" AND B.ClassId={0} ", query.ClassId);
}
if (query.ClassDate != null)
{
......@@ -347,6 +347,10 @@ GROUP BY A.ClassId
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId);
}
if (query.OrderGuestId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId);
}
if (!string.IsNullOrEmpty(query.Q_ClassIds))
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds);
......@@ -370,7 +374,7 @@ GROUP BY A.ClassId
/// <param name="groupId"></param>
/// <param name="guestIds"></param>
/// <returns></returns>
public List<RB_Class_Check_ViewModel> GetClassGuestStudentTimeList(int groupId,string guestIds)
public List<RB_Class_Check_ViewModel> GetClassGuestStudentTimeList(int groupId, string guestIds)
{
string sql = $@"SELECT OrderGuestId, SUM(StudyNum) as MinutesNum FROM rb_class_check where `Status`=0 and Group_Id ={groupId} and CheckStatus =0 and OrderGuestId in ({guestIds}) group by OrderGuestId";
return Get<RB_Class_Check_ViewModel>(sql).ToList();
......
......@@ -133,6 +133,14 @@ LEFT JOIN rb_teacher AS T ON a.TeacherId=T.TId
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.ClassId), query.ClassId);
}
if (query.ClassRoomId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.ClassRoomId), query.ClassRoomId);
}
if (query.ClassPlanId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.ClassPlanId), query.ClassPlanId);
}
if (query.TeacherId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.TeacherId), query.TeacherId);
......
using Edu.Model.Entity.Course;
using Edu.Common.Enum;
using Edu.Model.Entity.Course;
using Edu.Model.ViewModel.Course;
using System;
using System.Collections.Generic;
......@@ -30,6 +31,7 @@ SELECT A.*,B.SName AS SchoolName
FROM RB_Class_Room AS A LEFT JOIN rb_school AS B ON A.School_Id=B.SId
WHERE 1=1
");
builder.AppendFormat(" AND A.{0}<>{1} ", nameof(RB_Class_Room_ViewModel.Status), (int)(DateStateEnum.Delete));
if (query != null)
{
if (query.Group_Id > 0)
......@@ -40,10 +42,10 @@ WHERE 1=1
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Room_ViewModel.School_Id), query.School_Id);
}
if (query.Status >=0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Room_ViewModel.Status), (int)query.Status);
}
//if (query.Status >=0)
//{
// builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Room_ViewModel.Status), (int)query.Status);
//}
if (!string.IsNullOrEmpty(query.RoomName))
{
builder.AppendFormat(" AND A.{0} LIKE @RoomName ", nameof(RB_Class_Room_ViewModel.RoomName));
......@@ -89,5 +91,45 @@ WHERE 1=1
}
return Get<RB_Class_Room_ViewModel>(builder.ToString(), parameters).ToList();
}
/// <summary>
/// 获取教室列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Room_ViewModel> GetClassRoomList(RB_Class_Room_ViewModel query)
{
var parameters = new DynamicParameters();
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT A.*,B.SName AS SchoolName
FROM RB_Class_Room AS A LEFT JOIN rb_school AS B ON A.School_Id=B.SId
WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}<>{1} ", nameof(RB_Class_Room_ViewModel.Status), (int)(DateStateEnum.Delete));
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Room_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Room_ViewModel.School_Id), query.School_Id);
}
if (!string.IsNullOrEmpty(query.RoomName))
{
builder.AppendFormat(" AND A.{0} LIKE @RoomName ", nameof(RB_Class_Room_ViewModel.RoomName));
parameters.Add("RoomName", "%" + query.RoomName.Trim() + "%");
}
if (!string.IsNullOrEmpty(query.QRoomIds))
{
builder.AppendFormat(" AND A.{0} IN({1}) ", nameof(RB_Class_Room_ViewModel.RoomId), query.QRoomIds);
}
}
return Get<RB_Class_Room_ViewModel>(builder.ToString(), parameters).ToList();
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Common.Enum;
using Edu.Model.Entity.Course;
using Edu.Model.ViewModel.Course;
using VT.FW.DB.Dapper;
namespace Edu.Repository.Course
{
public class RB_Class_RoomUseLogRepository : BaseRepository<RB_Class_RoomUseLog>
{
/// <summary>
/// 获取教异常分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="rowsCount"></param>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_RoomUseLog_ViewModel> GetClassRoomUseLogPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Class_RoomUseLog_ViewModel query)
{
var parameters = new DynamicParameters();
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT A.*,B.RoomName
FROM RB_Class_RoomUseLog AS A LEFT JOIN rb_class_room AS B ON A.RoomId=B.RoomId
WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.Status), (int)(DateStateEnum.Normal));
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.School_Id), query.School_Id);
}
if (query.RoomId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.RoomId), query.RoomId);
}
}
return GetPage<RB_Class_RoomUseLog_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
}
/// <summary>
/// 获取教室异常列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_RoomUseLog_ViewModel> GetClassRoomUseLogListRepository(RB_Class_RoomUseLog_ViewModel query)
{
var parameters = new DynamicParameters();
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT A.*,B.RoomName
FROM RB_Class_RoomUseLog AS A LEFT JOIN rb_class_room AS B ON A.RoomId=B.RoomId
WHERE 1=1 ");
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.Status), (int)(DateStateEnum.Normal));
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.School_Id), query.School_Id);
}
if (query.RoomId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_RoomUseLog_ViewModel.RoomId), query.RoomId);
}
if (!string.IsNullOrWhiteSpace(query.StartTime))
{
builder.AppendFormat($" and DATE_FORMAT(a.CreateTime,'%Y-%m-%d')>=DATE_FORMAT('{query.StartTime}','%Y-%m-%d')");
}
if (!string.IsNullOrWhiteSpace(query.EndTime))
{
builder.AppendFormat($" and DATE_FORMAT(a.CreateTime,'%Y-%m-%d')<=DATE_FORMAT('{query.EndTime}','%Y-%m-%d')");
}
if (!string.IsNullOrEmpty(query.QRoomIds))
{
builder.AppendFormat(" AND A.{0} IN({1}) ", nameof(RB_Class_RoomUseLog_ViewModel.RoomId), query.QRoomIds);
}
}
return Get<RB_Class_RoomUseLog_ViewModel>(builder.ToString(), parameters).ToList();
}
}
}
......@@ -59,6 +59,58 @@ WHERE 1=1
return Get<RB_Class_Time_ViewModel>(builder.ToString()).ToList();
}
/// <summary>
/// 获取班级上课时间列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Time_ViewModel> GetClassTimeList_V2(RB_Class_Time_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@"
SELECT B.*,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.StartTime,':00') AS NewPlanDateTime,
CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.EndTime,':00') AS NewEndPlanDateTime
FROM rb_class_time AS B INNER JOIN rb_class_plan AS A ON A.ClassPlanId=B.ClassPlanId WHERE 1=1
");
if (query != null)
{
if (query.ClassPlanId > 0)
{
builder.AppendFormat(" AND B.{0}={1} ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.ClassPlanId);
}
if (query.ClassTimeId > 0)
{
builder.AppendFormat(" AND B.{0}={1} ", nameof(RB_Class_Time_ViewModel.ClassTimeId), query.ClassTimeId);
}
if (!string.IsNullOrEmpty(query.QClassPlanIds))
{
builder.AppendFormat(" AND B.{0} IN({1}) ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.QClassPlanIds);
}
if (query.ClassId > 0)
{
builder.AppendFormat(" AND B.{0}={1} ", nameof(RB_Class_Time_ViewModel.ClassId), query.ClassId);
}
if (!string.IsNullOrEmpty(query.QClassIds))
{
builder.AppendFormat(" AND B.{0} IN({1}) ", nameof(RB_Class_Time_ViewModel.ClassId), query.QClassIds);
}
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND B.{0}={1} ", nameof(RB_Class_Plan_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND B.{0}={1} ", nameof(RB_Class_Plan_ViewModel.School_Id), query.School_Id);
}
}
return Get<RB_Class_Time_ViewModel>(builder.ToString()).ToList();
}
/// <summary>
/// 根据班级编号删除班级上课时间
/// </summary>
......@@ -106,6 +158,55 @@ WHERE 1=1
return Get<RB_Class_Time_ViewModel>(builder.ToString()).ToList();
}
/// <summary>
/// 获取班级上课时间列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Time_ViewModel> GetClassTimeList(RB_Class_Time_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@" SELECT a.*,c.ClassName,b.ClassRoomId from rb_class_time as a LEFT JOIN rb_class_plan as b on a.ClassPlanId=b.ClassPlanId
LEFT JOIN rb_class as c on a.ClassId=c.ClassId
where b.`Status`=0 and DATE_FORMAT(b.ClassDate,'%y/%m/%d')=DATE_FORMAT(NOW(),'%y/%m/%d') and b.`Status`=0 and c.`Status`=0 and c.ClassStatus=2 ");
if (query != null)
{
if (query.ClassPlanId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.ClassPlanId);
}
if (query.ClassTimeId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Time_ViewModel.ClassTimeId), query.ClassTimeId);
}
if (!string.IsNullOrEmpty(query.QClassPlanIds))
{
builder.AppendFormat(" AND A.{0} IN({1}) ", nameof(RB_Class_Time_ViewModel.ClassPlanId), query.QClassPlanIds);
}
if (query.ClassId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Time_ViewModel.ClassId), query.ClassId);
}
if (!string.IsNullOrEmpty(query.QClassIds))
{
builder.AppendFormat(" AND A.{0} IN({1}) ", nameof(RB_Class_Time_ViewModel.ClassId), query.QClassIds);
}
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.School_Id), query.School_Id);
}
}
return Get<RB_Class_Time_ViewModel>(builder.ToString()).ToList();
}
#region 教师上课挂件查询
/// <summary>
......@@ -113,7 +214,7 @@ WHERE 1=1
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByRoomId(int RoomId,int Group_Id)
public List<RB_Class_Time_Extend> GetClassTimeByRoomId(int RoomId, int Group_Id)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat($@"SELECT t.TeacherName,t.TeacherHead,c.ClassHours,c.ClassName,cou.CourseName,lp.LessonPlanId,A.ClassPlanId,A.ClassId,A.`Status`,A.ClassRoomId,A.Group_Id,A.School_Id,A.TeacherId,B.ClassTimeId,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.StartTime,':00') AS NewPlanDateTime,
......
......@@ -63,6 +63,58 @@ namespace Edu.Repository.Course
return Get<RB_Order_Guest_ViewModel>(sql).ToList();
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="demodel"></param>
/// <param name="orderIds"></param>
/// <returns></returns>
public List<RB_Order_Guest_ViewModel> GetList_V2(RB_Order_Guest_ViewModel demodel)
{
string where = $@" 1=1 and Status=0";
if (demodel.Group_Id > 0)
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.Group_Id)} ={demodel.Group_Id}";
}
if (demodel.School_Id > 0)
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.School_Id)} ={demodel.School_Id}";
}
if (demodel.Id > 0)
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.Id)} ={demodel.Id}";
}
if (demodel.OrderId > 0)
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.OrderId)} ={demodel.OrderId}";
}
if (demodel.ClassId > 0)
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.ClassId)} ={demodel.ClassId}";
}
if (!string.IsNullOrEmpty(demodel.OrderIds))
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.OrderId)} in({demodel.OrderIds})";
}
if (!string.IsNullOrEmpty(demodel.ClassIds))
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.ClassId)} in({demodel.ClassIds})";
}
if (!string.IsNullOrEmpty(demodel.GuestName))
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.GuestName)} like '%{demodel.GuestName}%'";
}
if (demodel.GuestState > 0)
{
where += $@" and {nameof(RB_Order_Guest_ViewModel.GuestState)} ={demodel.GuestState}";
}
string sql = $@" select * from RB_Order_Guest where {where}";
return Get<RB_Order_Guest_ViewModel>(sql).ToList();
}
/// <summary>
/// 获取分页列表
/// </summary>
......
......@@ -299,7 +299,7 @@ namespace Edu.WebApi.Controllers.Course
}
}
}
var tempList =dayList.GroupBy(qitem => new { qitem }).Where(g => g.Count() > 1).Select(qitem => new { qitem.Key.qitem });
var tempList = dayList.GroupBy(qitem => new { qitem }).Where(g => g.Count() > 1).Select(qitem => new { qitem.Key.qitem });
string message2 = "";
foreach (var sItem in tempList)
{
......@@ -320,7 +320,7 @@ namespace Edu.WebApi.Controllers.Course
{
tempStr = "固定日期";
}
return ApiResult.ParamIsNull(message:"学习时间段"+(tempStr)+ message2.TrimStart(',')+"重复!");
return ApiResult.ParamIsNull(message: "学习时间段" + (tempStr) + message2.TrimStart(',') + "重复!");
}
extModel.DefaultTimeJson = Common.Plugin.JsonHelper.Serialize(extModel.DefaultTimeList);
}
......@@ -586,7 +586,7 @@ namespace Edu.WebApi.Controllers.Course
var classId = base.ParmJObj.GetInt("ClassId");
var schoolId = 0;
//var schoolId = base.ParmJObj.GetInt("School_Id");
var data = classModule.GetClassStudentListModule(classId, schoolId, base.UserInfo.Group_Id);
var data = classModule.GetClassStudentListModule(classId, schoolId, base.UserInfo.Group_Id, "");
return ApiResult.Success(data: data);
}
......@@ -832,7 +832,80 @@ namespace Edu.WebApi.Controllers.Course
return result ? ApiResult.Success() : ApiResult.Failed("签到失败");
}
/// <summary>
/// 签到
/// </summary>
/// <returns></returns>
public ApiResult AddClassCheckOne()
{
List<RB_Class_Check_ViewModel> list = new List<RB_Class_Check_ViewModel>();
var exModel = new RB_Class_Check_ViewModel()
{
CheckStatus = base.ParmJObj.GetInt("CheckStatus"),
ClassDate = base.ParmJObj.GetDateTime("ClassDate"),
ClassRoomId = base.ParmJObj.GetInt("ClassRoomId"),
OrderGuestId = base.ParmJObj.GetInt("OrderGuestId"),
School_Id = base.ParmJObj.GetInt("School_Id"),
StudyNum = base.ParmJObj.GetInt("StudyNum"),
TeacherId = base.ParmJObj.GetInt("TeacherId"),
ClassId = base.ParmJObj.GetInt("classId"),
};
list.Add(exModel);
if (list == null || !list.Any())
{
return ApiResult.ParamIsNull("");
}
//获取班级的学员信息
var orderGuestList = classModule.GetOrderGuest(new RB_Order_Guest_ViewModel { Group_Id = base.UserInfo.Group_Id, ClassId = exModel.ClassId });
//判断今天有课没有
var planList = classModule.GetClassPlanModelRepository(new RB_Class_Plan_ViewModel
{
Group_Id = base.UserInfo.Group_Id,
ClassId = exModel.ClassId,
QClassDateStr = Common.ConvertHelper.FormatDate(exModel.ClassDate),
});
if (planList == null || !planList.Any())
{
return ApiResult.Failed("今日无课程,无须签到");
}
//判断当天是否有已签到数据
var checkLogList = classModule.GetClassCheckList(new RB_Class_Check_ViewModel { Group_Id = base.UserInfo.Group_Id, ClassId = list.FirstOrDefault().ClassId, StartDate = exModel.ClassDate.ToString("yyyy-MM-dd HH:mm:ss"), EndDate = exModel.ClassDate.ToString("yyyy-MM-dd HH:mm:ss") });
foreach (var item in list)
{
var signModel = checkLogList?.Where(qitem => qitem.ClassDate == item.ClassDate && qitem.ClassId == item.ClassId && qitem.OrderGuestId == item.OrderGuestId)?.FirstOrDefault();
if (signModel != null && signModel.ClassCheckId > 0)
{
item.ClassCheckId = signModel.ClassCheckId;
item.Group_Id = signModel.Group_Id;
item.CreateTime = signModel.CreateTime;
item.CreateBy = base.UserInfo.Id;
item.Status = 0;
}
else
{
item.Group_Id = base.UserInfo.Group_Id;
item.CreateTime = System.DateTime.Now;
item.CreateBy = base.UserInfo.Id;
item.Status = 0;
}
}
bool result = classModule.AddClassCheckModule(list);
if (result)
{
classModule.SetClassProcessModule(exModel.ClassId);
}
return result ? ApiResult.Success() : ApiResult.Failed("签到失败");
}
/// <summary>
/// 获取缺课分页列表
......@@ -847,12 +920,12 @@ namespace Edu.WebApi.Controllers.Course
CheckStatus = 1,
IsAbsentHours = 1,
MakeUpStatus = base.ParmJObj.GetInt("MakeUpStatus"),
GuestName=base.ParmJObj.GetStringValue("GuestName"),
ClassName= base.ParmJObj.GetStringValue("ClassName"),
GuestName = base.ParmJObj.GetStringValue("GuestName"),
ClassName = base.ParmJObj.GetStringValue("ClassName"),
CourseName = base.ParmJObj.GetStringValue("CourseName"),
TeacherName = base.ParmJObj.GetStringValue("TeacherName"),
RoomName = base.ParmJObj.GetStringValue("RoomName"),
StartDate=base.ParmJObj.GetStringValue("StartDate"),
StartDate = base.ParmJObj.GetStringValue("StartDate"),
EndDate = base.ParmJObj.GetStringValue("EndDate"),
};
query.Group_Id = base.UserInfo.Group_Id;
......@@ -875,7 +948,7 @@ namespace Edu.WebApi.Controllers.Course
item.TeacherName,
item.ClassRoomId,
item.RoomName,
ClassDate=Common.ConvertHelper.FormatDate(item.ClassDate),
ClassDate = Common.ConvertHelper.FormatDate(item.ClassDate),
item.MakeUpStatus,
item.MakeUpStatusStr
});
......@@ -894,7 +967,7 @@ namespace Edu.WebApi.Controllers.Course
int MakeUpStatus = base.ParmJObj.GetInt("MakeUpStatus");
int ClassCheckId = base.ParmJObj.GetInt("ClassCheckId");
int GuestId = base.ParmJObj.GetInt("GuestId");
bool flag= classModule.SetMakeUpStatusModule(MakeUpStatus, ClassCheckId, GuestId);
bool flag = classModule.SetMakeUpStatusModule(MakeUpStatus, ClassCheckId, GuestId);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
......@@ -1462,7 +1535,7 @@ namespace Edu.WebApi.Controllers.Course
{
DayStr = item.Key,
result = newClassPlanList.OrderBy(x=>x.NewPlanDateTime).Where(x => x.NewPlanDateTime.Value.ToString("yyyy-MM-dd") == item.Key).Select(x => new
result = newClassPlanList.OrderBy(x => x.NewPlanDateTime).Where(x => x.NewPlanDateTime.Value.ToString("yyyy-MM-dd") == item.Key).Select(x => new
{
TeacherName = x.TeacherName ?? "",
TeacherIcon = x.TeacherHead ?? "",
......@@ -1619,7 +1692,23 @@ namespace Edu.WebApi.Controllers.Course
var classId = base.ParmJObj.GetInt("ClassId");
var schoolId = 0;
var Group_Id = base.ParmJObj.GetInt("Group_Id", 100000);
var data = classModule.GetClassStudentListModule(classId, schoolId, Group_Id);
var data = classModule.GetClassStudentListModule(classId, schoolId, Group_Id, "");
return ApiResult.Success(data: data);
}
/// <summary>
/// 获取学员列表以及签到状态
/// </summary>
/// <returns></returns>
[HttpPost]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public ApiResult GetStudentCheckByClassId()
{
var classId = base.ParmJObj.GetInt("ClassId");
var ClassDate = base.ParmJObj.GetStringValue("ClassDate");
var schoolId = 0;
var Group_Id = base.ParmJObj.GetInt("Group_Id", 100000);
var data = classModule.GetClassStudentListModule(classId, schoolId, Group_Id, ClassDate);
return ApiResult.Success(data: data);
}
#endregion
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Edu.Common.API;
using Edu.WebApi.Filter;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using Edu.Common.Plugin;
using Aliyun.Acs.vod.Model.V20170321;
using Aliyun.Net.SDK.Core;
using Aliyun.Acs.Core.Profile;
namespace Edu.WebApi.Controllers.Video
{
[Route("api/[controller]/[action]")]
[ApiExceptionFilter]
[ApiController]
[EnableCors("AllowCors")]
public class VideoController : BaseController
{
/// <summary>
/// 获取视频播放凭证
/// </summary>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public ApiResult GetVideoPlayAuth()
{
JObject jobj = JObject.Parse(RequestParm.Msg.ToString());
string VideoId = jobj.GetStringValue("strVid");
try
{
string regionId = "cn-shanghai";
IClientProfile profile = DefaultProfile.GetProfile(regionId, "LTAI5tBoku6yPFSkacA3sbAT", "zcjzTpMGyPwchaKAyUFeKNEBcqAxvL");
var acsClient = new Aliyun.Acs.Core.DefaultAcsClient(profile);
if (string.IsNullOrEmpty(VideoId))
{
return ApiResult.Failed("获取失败");
}
GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
request.VideoId = VideoId;
request.AuthInfoTimeout = 30000;
// 初始化客户端
// DefaultAcsClient client = InitVodClient();
// 发起请求,并得到 response
GetVideoPlayAuthResponse response = acsClient.GetAcsResponse(request);
GetVideoPlayAuthResponse.GetVideoPlayAuth_VideoMeta VideoMetaModel = response.VideoMeta;
string RequestId = response.RequestId;
string PlayAuth = response.PlayAuth;
if (response != null && !string.IsNullOrWhiteSpace(response.RequestId))
{
return ApiResult.Success("", new { RequestId, PlayAuth, VideoMeta= VideoMetaModel });
}
else
{
return ApiResult.Failed("获取失败");
}
}
catch (Exception)
{
return ApiResult.Failed("获取失败");
}
}
}
}
......@@ -19,6 +19,8 @@
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="aliyun-net-sdk-core" Version="1.5.10" />
<PackageReference Include="aliyun-net-sdk-vod" Version="2.15.12" />
<PackageReference Include="AspNetCoreRateLimit" Version="3.2.2" />
<PackageReference Include="JWT" Version="5.3.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.0.0" />
......@@ -44,5 +46,8 @@
<ProjectReference Include="..\Edu.Repository\Edu.Repository.csproj" />
<ProjectReference Include="..\Edu.ThirdCore\Edu.ThirdCore.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="App_Code\" />
</ItemGroup>
</Project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment