Commit a7752df6 authored by 黄奎's avatar 黄奎

Merge branch 'master' of http://gitlab.oytour.com/Kui2/education

parents 40b71267 e3f7ae99
......@@ -43,5 +43,10 @@ namespace Edu.Common.Enum.Finance
/// </summary>
[EnumField("订单分拆")]
OrderSplitClass = 6,
/// <summary>
/// 学生请假
/// </summary>
[EnumField("学生请假")]
LeaveClass = 7,
}
}
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.Entity.EduTask
{
/// <summary>
/// 学生请假申请实体类
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Student_Leave
{
/// <summary>
/// 主键(请假编号)
/// </summary>
public int Id { get; set; }
/// <summary>
/// 请假类型 1-事假,2-病假
/// </summary>
public int LeaveType { get; set; }
/// <summary>
/// 班级编号
/// </summary>
public int ClassId { get; set; }
/// <summary>
/// 课程编号
/// </summary>
public int CourseId { get; set; }
/// <summary>
/// 计划时间id
/// </summary>
public string ClassTimeIds { get; set; }
/// <summary>
/// 学生id
/// </summary>
public int OrderGuestId { get; set; }
/// <summary>
/// 请假信息
/// </summary>
public string LeaveInfo { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 学校编号
/// </summary>
public int School_Id { 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; }
/// <summary>
/// 申请备注
/// </summary>
public string Remarks { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Model.Entity.EduTask;
using Edu.Model.ViewModel.Sell;
namespace Edu.Model.ViewModel.EduTask
{
/// <summary>
/// 学员请假申请实体扩展表
/// </summary>
public class RB_Student_Leave_ViewModel : RB_Student_Leave
{
/// <summary>
/// 请假时间信息
/// </summary>
public List<LeaveInfoModel> LeaveInfoList { get; set; }
/// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 多个ids
/// </summary>
public string Q_Student_Leave_Ids { get; set; }
/// <summary>
/// 学员信息
/// </summary>
public RB_Order_Guest_ViewModel Order_Guest_ViewModel { get; set; }
}
public class LeaveInfoModel
{
/// <summary>
/// 计划id
/// </summary>
public int ClassPlanId { get; set; }
/// <summary>
/// 上课时间id
/// </summary>
public int ClassTimeId { get; set; }
/// <summary>
/// 上课日期
/// </summary>
public string ClassDate { get; set; }
/// <summary>
/// 上课开始时间
/// </summary>
public string StartTime { get; set; }
/// <summary>
/// 上课结束时间
/// </summary>
public string EndTime { get; set; }
/// <summary>
/// 上课课时
/// </summary>
public decimal TimeHour { get; set; }
/// <summary>
/// 老师名称
/// </summary>
public string TeacherName { get; set; }
/// <summary>
/// 教室名称
/// </summary>*
public string RoomName { get; set; }
}
}
......@@ -49,7 +49,10 @@ namespace Edu.Model.ViewModel.Grade
}
}
}
/// <summary>
/// ids
/// </summary>
public string Q_ClassTimeIds { get; set; }
/// <summary>
/// ids
/// </summary>
......
......@@ -64,6 +64,13 @@ namespace Edu.Module.EduTask
/// </summary>
private readonly RB_Change_ClassPlanRepository change_ClassPlanRepository = new RB_Change_ClassPlanRepository();
/// <summary>
/// 学生请假仓储层对象
/// </summary>
private readonly RB_Student_LeaveRepository studentLeaveRepository = new RB_Student_LeaveRepository();
/// <summary>
/// 老师仓储层对象
/// </summary>
......@@ -127,11 +134,24 @@ namespace Edu.Module.EduTask
List<RB_Student_StopClass_ViewModel> stopClassList = new List<RB_Student_StopClass_ViewModel>();
//临时上课邀请申请
List<RB_Student_TempInvitation_ViewModel> studentTempInvitationClassList = new List<RB_Student_TempInvitation_ViewModel>();
//学生请假申请
List<RB_Student_Leave_ViewModel> studentLeaveList = new List<RB_Student_Leave_ViewModel>();
List<RB_Order_Guest_ViewModel> orderGuestLeaveList = new List<RB_Order_Guest_ViewModel>();
//班级上课计划-学生请假申请列表
List<RB_Class_Plan_ViewModel> planLeaveList = new List<RB_Class_Plan_ViewModel>();
//班级上课时间-学生请假申请列表
List<RB_Class_Time_ViewModel> timeLeaveList = new List<RB_Class_Time_ViewModel>();
//老师列表
List<RB_Teacher_ViewModel> teacherList = new List<RB_Teacher_ViewModel>();
//学生信息
List<RB_Order_Guest_ViewModel> orderGuestList = new List<RB_Order_Guest_ViewModel>(); //学生信息
List<RB_Order_Guest_ViewModel> orderGuestTempInvitationList = new List<RB_Order_Guest_ViewModel>();
//教室列表
List<RB_Class_Room_ViewModel> roomList = new List<RB_Class_Room_ViewModel>();
//班级上课计划列表
......@@ -348,6 +368,46 @@ namespace Edu.Module.EduTask
}
}
#endregion
#region 学生请假申请
if (subItem.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.LeaveClass)
{
string changeIds = string.Join(",", list.Where(qitem => qitem.ReceiptType == subItem.ReceiptType).Select(qitem => qitem.RelationId));
studentLeaveList = studentLeaveRepository.GetStudentLeaveListRepository(new RB_Student_Leave_ViewModel()
{
Q_Student_Leave_Ids = changeIds,
});
if (studentLeaveList != null && studentLeaveList.Any())
{
string orderGuestIds = string.Join(",", studentLeaveList.Select(x => x.OrderGuestId));
if (!string.IsNullOrWhiteSpace(orderGuestIds))
{
orderGuestLeaveList = order_GuestRepository.GetStopingStudentPage(new RB_Order_Guest_ViewModel
{
OrderGuestIds = orderGuestIds
});
}
string classTimeIds = string.Join(",", studentLeaveList.Select(x => x.ClassTimeIds));
if (!string.IsNullOrWhiteSpace(classTimeIds))
{
timeLeaveList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel { QClassTimeIds = classTimeIds });
if (timeLeaveList != null && timeLeaveList.Any())
{
string classPlanIds = string.Join(",", timeLeaveList.Select(x => x.ClassPlanId));
if (!string.IsNullOrWhiteSpace(classPlanIds))
{
planLeaveList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel { QClassPlanIds = classPlanIds });
}
}
}
}
}
#endregion
}
foreach (var item in list)
......@@ -430,13 +490,43 @@ namespace Edu.Module.EduTask
//订单转班
if (item.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.OrderTransClass)
{
DataObj = orderTransList?.Where(qitem => qitem.Id == item.RelationId && qitem.ChangeType==1)?.FirstOrDefault();
DataObj = orderTransList?.Where(qitem => qitem.Id == item.RelationId && qitem.ChangeType == 1)?.FirstOrDefault();
}
//订单分拆
if (item.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.OrderSplitClass)
{
DataObj = orderTransList?.Where(qitem => qitem.Id == item.RelationId && qitem.ChangeType == 2)?.FirstOrDefault();
}
//学生请假申请
string accountName = "";
if (item.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.LeaveClass)
{
var tempModel = studentLeaveList.Where(qitem => qitem.Id == item.RelationId)?.FirstOrDefault();
tempModel.LeaveInfoList = new List<LeaveInfoModel>();
foreach (var itemClassTimeIds in tempModel.ClassTimeIds.Split(","))
{
if (!string.IsNullOrWhiteSpace(itemClassTimeIds))
{
var tempTimeModel = timeLeaveList.Where(x => x.ClassTimeId.ToString() == itemClassTimeIds).FirstOrDefault();
LeaveInfoModel classPlanTimeModel = new LeaveInfoModel()
{
StartTime = tempTimeModel?.StartTime ?? "",
EndTime = tempTimeModel?.EndTime ?? "",
TimeHour = tempTimeModel?.TimeHour ?? 0,
ClassPlanId = tempTimeModel.ClassPlanId,
ClassTimeId = tempTimeModel.ClassTimeId,
TeacherName = planLeaveList.Where(x => x.ClassPlanId == tempTimeModel.ClassPlanId).FirstOrDefault()?.TeacherName ?? "",
RoomName = planLeaveList.Where(x => x.ClassPlanId == tempTimeModel.ClassPlanId).FirstOrDefault()?.RoomName ?? "",
};
classPlanTimeModel.ClassDate = planLeaveList.Where(x => x.ClassPlanId == tempTimeModel.ClassPlanId).FirstOrDefault()?.ClassDate.ToString("yyyy-MM-dd") ?? "";
tempModel.LeaveInfoList.Add(classPlanTimeModel);
}
}
tempModel.Order_Guest_ViewModel = new RB_Order_Guest_ViewModel();
tempModel.Order_Guest_ViewModel = orderGuestLeaveList.Where(x => x.Id == tempModel.OrderGuestId).FirstOrDefault();
DataObj = tempModel;
accountName = tempModel.Order_Guest_ViewModel.GuestName;
}
object AuditObj = new object();
if (item.VerifyStatus == EduTaskRrocessStatus.NotAudit || item.VerifyStatus == EduTaskRrocessStatus.AuditIng)
{
......@@ -467,7 +557,7 @@ namespace Edu.Module.EduTask
item.SpecialNode,
item.RelationId,
ReceiptTypeName = item.ReceiptType.ToName(),
CreateByName = UserReidsCache.GetUserLoginInfo(item.CreateBy)?.AccountName,
CreateByName = item.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.LeaveClass ? accountName : UserReidsCache.GetUserLoginInfo(item.CreateBy)?.AccountName,
CreateTime = Common.ConvertHelper.FormatTime(item.CreateTime),
item.TeacherName,
item.SchoolName,
......@@ -475,7 +565,7 @@ namespace Edu.Module.EduTask
AuditObj,
item.VerifyStatus,
AuditStatusName = item.VerifyStatus == Common.Enum.EduTask.EduTaskRrocessStatus.NotAudit ? "待审" : item.VerifyStatus.ToName(),
ReceiptFileList= string.IsNullOrWhiteSpace(item.ReceiptFile)?new List<string>() : Common.Plugin.JsonHelper.DeserializeObject<List<string>>(item.ReceiptFile)
ReceiptFileList = string.IsNullOrWhiteSpace(item.ReceiptFile) ? new List<string>() : Common.Plugin.JsonHelper.DeserializeObject<List<string>>(item.ReceiptFile)
};
result.Add(obj);
}
......@@ -614,6 +704,11 @@ namespace Edu.Module.EduTask
var changeClassModel = student_StopClassRepository.GetEntity<RB_Student_StopClass_ViewModel>(receipt.RelationId);
ApplyReason = changeClassModel?.Remarks ?? "";
}
else if (receipt.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.LeaveClass)
{
var studentLeaveModel = studentLeaveRepository.GetEntity<RB_Student_Leave_ViewModel>(receipt.RelationId);
ApplyReason = studentLeaveModel?.Remarks ?? "";
}
//获取审核记录
var aurList = education_RecordRepository.GetEducationRecordListRepository(new RB_Education_Record_ViewModel()
{
......@@ -691,17 +786,19 @@ namespace Edu.Module.EduTask
newRecipientIds = ((!string.IsNullOrEmpty(receipt.RecipientIds) ? receipt.RecipientIds : "") + "," + auditModel.RecipientIds).TrimStart(',').TrimEnd(',');
#region 抄送通知
var notifyUsers = accountRepository.GetAccountListExtRepository(new RB_Account_ViewModel() {
QIds= newRecipientIds
var notifyUsers = accountRepository.GetAccountListExtRepository(new RB_Account_ViewModel()
{
QIds = newRecipientIds
});
if (notifyUsers != null && notifyUsers.Count() > 0)
{
notifyUsers.ForEach(x=> {
notifyUsers.ForEach(x =>
{
if (!string.IsNullOrEmpty(x.WorkUserId))
{
var recipientPath = HttpUtility.UrlEncode($"/teacher/change-class-manager?tab=4&id={receipt.Id}");
var content = $"<font color='info'>抄送通知</font> 你收到了一张{EnumHelper.ToName(receipt.ReceiptType)}单据抄送\n>**概要信息** \n>抄 送 人:<font color='comment'>{user.AccountName}</font>\n>单据编号:<font color='comment'>{receipt.Id}</font>\n>创 建 人:<font color='comment'>{UserReidsCache.GetUserLoginInfo(receipt.CreateBy).AccountName}</font>\n>申请时间:<font color='comment'>{receipt.CreateTime.ToString("MM-dd HH:mm")}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={recipientPath})";
PushWorkChatHelper.PushToWorkChat(content,x.WorkUserId,"抄送通知");
PushWorkChatHelper.PushToWorkChat(content, x.WorkUserId, "抄送通知");
}
});
}
......@@ -758,7 +855,8 @@ namespace Edu.Module.EduTask
#region 更新审核记录表状态
flag = UpdateEduRecordModule(WFRrocessStatus.AuditNotThrough, auditModel.Description, user.Id, amodel.Id);
if (flag) {
if (flag)
{
#region 驳回通知
var notifyUsers = accountRepository.GetWorkUserIdRepository(receipt.CreateBy);
if (!string.IsNullOrEmpty(notifyUsers))
......@@ -792,7 +890,7 @@ namespace Edu.Module.EduTask
{nameof(RB_Education_Receipt_ViewModel.VerifyStatus),(int)EduTaskRrocessStatus.Rejected}
};
flag = education_ReceiptRepository.Update(fileds, new WhereHelper(nameof(RB_Education_Receipt_ViewModel.Id), receipt.Id));
flag = UpdateOtherModule(receipt, auditModel);
flag = UpdateOtherModule(receipt, auditModel, user);
}
......@@ -852,7 +950,7 @@ namespace Edu.Module.EduTask
flag = UpdateEduRelevanceModule(model.Id, model.Stauts, model.AuditedId);
#endregion
flag = UpdateOtherModule(receipt, auditModel);
flag = UpdateOtherModule(receipt, auditModel, user);
}
else
......@@ -909,7 +1007,7 @@ namespace Edu.Module.EduTask
flag = UpdateEduRecordModule(WFRrocessStatus.OtherHaveAudit, auditModel.Description, user.Id, item.Id);
}
}
flag = UpdateOtherModule(receipt, auditModel);
flag = UpdateOtherModule(receipt, auditModel, user);
}
else
{
......@@ -943,7 +1041,7 @@ namespace Edu.Module.EduTask
flag = UpdateEduRelevanceModule(model.Id, model.Stauts, model.AuditedId);
#endregion
flag = UpdateOtherModule(receipt, auditModel);
flag = UpdateOtherModule(receipt, auditModel, user);
}
Dictionary<string, object> fileds = new Dictionary<string, object>()
......@@ -1161,7 +1259,7 @@ namespace Edu.Module.EduTask
/// <param name="receiptModel">单据实体</param>
/// <param name="auditModel">审核实体</param>
/// <returns></returns>
public bool UpdateOtherModule(RB_Education_Receipt receiptModel, EduReceiptAudit auditModel)
public bool UpdateOtherModule(RB_Education_Receipt receiptModel, EduReceiptAudit auditModel, UserInfo user)
{
bool flag = true;
//退课
......@@ -1228,6 +1326,15 @@ namespace Edu.Module.EduTask
//student_BackClassRepository.UpdateGuestStateRepository(receiptModel, auditModel);
}
}
if (receiptModel.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.OrderSplitClass)
{
if (auditModel.AuditStatus == 2)
{
studentLeaveRepository.UpdateStundetLeave(receiptModel.Id, user.Id);
}
}
return flag;
}
......
using Edu.Model.Entity.Course;
using Edu.Model.Entity.EduTask;
using Edu.Model.Entity.Sell;
using Edu.Model.ViewModel.EduTask;
using Edu.Model.ViewModel.Sell;
using Edu.Repository.Course;
using Edu.Repository.EduTask;
using Edu.Repository.Sell;
using System.Collections.Generic;
using System.Linq;
using VT.FW.AOP.CustomerAttribute;
using VT.FW.DB;
namespace Edu.Module.EduTask
{
/// <summary>
/// 调课计划处理类
/// </summary>
public class LeaveStudentModule
{
/// <summary>
/// 教务单据仓储层对象
/// </summary>
private readonly RB_Education_ReceiptRepository education_ReceiptRepository = new RB_Education_ReceiptRepository();
/// <summary>
/// 请假计划仓储层对象
/// </summary>
private readonly RB_Student_LeaveRepository RB_Student_LeaveRepository = new RB_Student_LeaveRepository();
/// <summary>
/// 订单学员仓储层对象
/// </summary>
private readonly RB_Order_GuestRepository order_GuestRepository = new RB_Order_GuestRepository();
/// <summary>
/// 获取请假列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Student_Leave_ViewModel> GetStudentLeaveListRepository(RB_Student_Leave_ViewModel query)
{
return RB_Student_LeaveRepository.GetStudentLeaveListRepository(query);
}
/// <summary>
/// 新增修改请假申请
/// </summary>
/// <returns></returns>
[TransactionCallHandler]
public virtual bool SetStudentLeaveModule(RB_Student_Leave_ViewModel extModel, string receiptFile)
{
bool flag = false;
if (extModel.Id > 0)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{nameof(RB_Student_Leave_ViewModel.OrderGuestId),extModel.OrderGuestId },
{nameof(RB_Student_Leave_ViewModel.ClassId),extModel.ClassId },
{nameof(RB_Student_Leave_ViewModel.CourseId),extModel.CourseId },
{nameof(RB_Student_Leave_ViewModel.LeaveInfo),extModel.LeaveInfo },
{nameof(RB_Student_Leave_ViewModel.UpdateBy),extModel.UpdateBy },
{nameof(RB_Student_Leave_ViewModel.UpdateTime),extModel.UpdateTime },
};
flag = RB_Student_LeaveRepository.Update(fileds, new WhereHelper(nameof(RB_Student_Leave_ViewModel.Id), extModel.Id));
}
else
{
var newId = RB_Student_LeaveRepository.Insert(extModel);
extModel.Id = newId;
flag = newId > 0;
if (flag)
{
var educationReceipt = new RB_Education_Receipt()
{
Id = 0,
Title = "学生请假申请",
ReceiptType = Common.Enum.Finance.ReceiptTypeEnum.LeaveClass,
RelationId = newId,
ClassId = extModel.ClassId,
Group_Id = extModel.Group_Id,
School_Id = extModel.School_Id,
CreateBy = extModel.CreateBy,
CreateTime = extModel.CreateTime,
UpdateBy = extModel.UpdateBy,
UpdateTime = extModel.UpdateTime,
VerifyStatus = Common.Enum.EduTask.EduTaskRrocessStatus.NotAudit,
ReceiptFile = receiptFile
};
flag = education_ReceiptRepository.SetEducationReceiptRepository(educationReceipt, out string message);
}
}
return flag;
}
public bool UpdateChangeClassPlan(int id)
{
return RB_Student_LeaveRepository.UpdateStundetLeave(id,1);
}
}
}
......@@ -121,5 +121,9 @@ namespace Edu.Module.EduTask
}
return flag;
}
}
}
......@@ -277,6 +277,15 @@ WHERE 1=1
return false;
}
}
else if (model.ReceiptType == Common.Enum.Finance.ReceiptTypeEnum.LeaveClass)
{
flowModel = flowRepository.GetFlowRepository(Common.Config.OrderSplitClassFlowId);
if (flowModel == null)
{
message = "未配置学生请假流程!";
return false;
}
}
if (flowModel?.FlowNodeList?.Count == 0)
{
message = "未配置审核流程!";
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Edu.Common;
using Edu.Common.Enum.System;
using Edu.Model.Entity.EduTask;
using Edu.Model.Entity.Sell;
using Edu.Model.ViewModel.EduTask;
using Edu.Model.ViewModel.Grade;
using Edu.Model.ViewModel.Sell;
using Edu.Repository.Grade;
using Edu.Repository.Sell;
using VT.FW.DB;
namespace Edu.Repository.EduTask
{
public class RB_Student_LeaveRepository : BaseRepository<RB_Student_Leave>
{
// <summary>
/// 订单学员仓储层对象
/// </summary>
private readonly RB_Order_GuestRepository order_GuestRepository = new RB_Order_GuestRepository();
/// <summary>
/// 教务单据仓储层对象
/// </summary>
private readonly RB_Education_ReceiptRepository education_ReceiptRepository = new RB_Education_ReceiptRepository();
/// <summary>
/// 课程基础配置
/// </summary>
private readonly RB_Class_ConfigRepository class_ConfigRepository = new RB_Class_ConfigRepository();
/// <summary>
/// 班级仓储层对象
/// </summary>
private readonly RB_ClassRepository classRepository = new RB_ClassRepository();
/// <summary>
/// 课程签到记录表
/// </summary>
private readonly RB_Class_CheckRepository classCheckRepository = new RB_Class_CheckRepository();
/// <summary>
/// 班级上课计划仓储层对象
/// </summary>
private readonly RB_Class_PlanRepository class_PlanRepository = new RB_Class_PlanRepository();
/// <summary>
/// 订单仓储层对象
/// </summary>
private readonly RB_OrderRepository orderRepository = new RB_OrderRepository();
/// <summary>
/// 账户仓储层
/// </summary>
private readonly User.RB_AccountRepository accountRepository = new User.RB_AccountRepository();
/// <summary>
/// 日志仓储对象
/// </summary>
private readonly Log.RB_User_ChangeLogRepository user_ChangeLogRepository = new Log.RB_User_ChangeLogRepository();
/// <summary>
/// 班级上课计划上课时间仓储层对象
/// </summary>
private readonly RB_Class_TimeRepository class_TimeRepository = new RB_Class_TimeRepository();
/// <summary>
/// 学员补课记录表仓储层对象
/// </summary>
private readonly BackClass.RB_Student_MakeupRepository student_MakeupRepository = new BackClass.RB_Student_MakeupRepository();
/// <summary>
/// 获取请假列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Student_Leave_ViewModel> GetStudentLeaveListRepository(RB_Student_Leave_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@" SELECT A.*,IFNULL(B.ClassName,'') AS ClassName FROM RB_Student_Leave AS A LEFT JOIN rb_class AS B ON A.ClassId=B.ClassId WHERE 1=1 ");
if (query != null)
{
if (!string.IsNullOrEmpty(query.Q_Student_Leave_Ids))
{
builder.AppendFormat(@" AND A.{0} IN ({1}) ", nameof(RB_Student_Leave_ViewModel.Id), query.Q_Student_Leave_Ids);
}
}
return Get<RB_Student_Leave_ViewModel>(builder.ToString()).ToList();
}
/// <summary>
/// 审核通过后更新学生签到表
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public bool UpdateStundetLeave(object Id, int CreateById)
{
//查询当前调课信息
bool flag = false;
var receiptModel = education_ReceiptRepository.GetEntity(Id);
if (receiptModel == null || receiptModel.Id == 0)
{
return false;
}
if (receiptModel.ReceiptType != Common.Enum.Finance.ReceiptTypeEnum.LeaveClass)
{
return false;
}
var model = GetEntity(receiptModel.RelationId);
if (model == null || model.Id == 0)
{
return false;
}
else //更新学生的信息
{
/// <summary>
/// 请假时间信息
/// </summary>
List<LeaveInfoModel> LeaveInfoList = new List<LeaveInfoModel>();
if (!string.IsNullOrWhiteSpace(model.LeaveInfo))
{
LeaveInfoList = Common.Plugin.JsonHelper.DeserializeObject<List<LeaveInfoModel>>(model.LeaveInfo);
}
//学生信息
List<RB_Order_Guest_ViewModel> orderGuestList = new List<RB_Order_Guest_ViewModel>();
//班级上课计划列表
List<RB_Class_Plan_ViewModel> planList = new List<RB_Class_Plan_ViewModel>();
//班级上课时间列表
List<RB_Class_Time_ViewModel> timeList = new List<RB_Class_Time_ViewModel>();
string orderGuestIds = model.OrderGuestId.ToString();
if (!string.IsNullOrWhiteSpace(orderGuestIds))
{
orderGuestList = order_GuestRepository.GetStopingStudentPage(new RB_Order_Guest_ViewModel
{
OrderGuestIds = orderGuestIds
});
}
string classTimeIds = model.ClassTimeIds;
if (!string.IsNullOrWhiteSpace(classTimeIds))
{
timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel { QClassTimeIds = classTimeIds });
if (timeList != null && timeList.Any())
{
string classPlanIds = string.Join(",", timeList.Select(x => x.ClassPlanId));
if (!string.IsNullOrWhiteSpace(classPlanIds))
{
planList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel { QClassPlanIds = classPlanIds });
}
}
}
List<RB_Class_Check_ViewModel> classCheckList = new List<RB_Class_Check_ViewModel>();
//判断当天是否有已签到数据
var checkLogList = classCheckRepository.GetClassCheckList(new RB_Class_Check_ViewModel
{
Group_Id = model.Group_Id,
ClassId = model.ClassId,
Q_ClassTimeIds = model.ClassTimeIds,
});
foreach (var item in timeList)
{
DateTime? dateTime = planList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.ClassDate;
if (!dateTime.HasValue)
{
try
{
dateTime = Convert.ToDateTime(LeaveInfoList.Where(x => x.ClassTimeId == item.ClassTimeId).FirstOrDefault().ClassDate);
}
catch (Exception ex)
{
}
}
var signModel = checkLogList?.Where(qitem => qitem.ClassTimeId == item.ClassTimeId && qitem.ClassId == item.ClassId && qitem.OrderGuestId == model.OrderGuestId)?.FirstOrDefault();
RB_Class_Check_ViewModel invitationModel = new RB_Class_Check_ViewModel()
{
ClassCheckId = (signModel != null && signModel.ClassCheckId > 0) ? signModel.ClassCheckId : 0,
ClassId = model.ClassId,
Group_Id = model.Group_Id,
School_Id = model.School_Id,
CheckStatus = 2,
StudyNum = 0,
Status = 0,
TeacherId = planList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.TeacherId ?? 0,
ClassRoomId = planList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.ClassRoomId ?? 0,
ClassDate = dateTime.Value,
ClassTimeId = item.ClassTimeId,
OrderGuestId = model.OrderGuestId,
CreateBy = CreateById,
CreateTime = DateTime.Now
};
classCheckList.Add(invitationModel);
}
if (classCheckList != null && classCheckList.Any())
{
var orderModel = orderRepository.GetEntity(orderGuestList.FirstOrDefault().OrderId);
var classModel = classRepository.GetEntity<RB_Class_ViewModel>(model.ClassId);
var sellerInfo = accountRepository.GetAccountListExtRepository(new Model.ViewModel.User.RB_Account_ViewModel { Id = orderModel.EnterID, Group_Id = model.Group_Id }).FirstOrDefault();//UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
flag= AddClassCheckModule(classCheckList, timeList, orderGuestList, orderModel, classModel, sellerInfo);
}
}
return flag;
}
/// <summary>
/// 新增签到
/// </summary>
/// <param name="Ids"></param>
/// <param name="DropOutRemark"></param>
/// <returns></returns>
public virtual bool AddClassCheckModule(List<RB_Class_Check_ViewModel> list, List<RB_Class_Time_ViewModel> timeList, List<RB_Order_Guest_ViewModel> orderGuestList, RB_Order orderModel, RB_Class_ViewModel classModel, Model.ViewModel.User.RB_Account_ViewModel sellerInfo)
{
//写日志
bool flag = true;
foreach (var item in list)
{
//基础课时分钟数
var BasicMinutes = 0;
BasicMinutes = class_ConfigRepository.GetClassMinutesRepository(item.ClassId);
var timeModel = timeList.Where(x => x.ClassTimeId == item.ClassTimeId).FirstOrDefault();
if (flag)
{
var guestModel = orderGuestList.Where(x => x.Id == item.OrderGuestId).FirstOrDefault();
item.CurrentDeductionHours = timeModel?.TimeHour ?? 0;
decimal currentDeductionHours = item.CurrentDeductionHours;
if (item.CheckStatus == 2)
{
currentDeductionHours = 0;
}
if (item.ClassCheckId > 0)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Class_Check_ViewModel.CheckStatus),item.CheckStatus},
{ nameof(RB_Class_Check_ViewModel.StudyNum),item.StudyNum},
{ nameof(RB_Class_Check_ViewModel.CurrentDeductionHours),currentDeductionHours},
};
List<WhereHelper> wheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),item.ClassCheckId)
};
flag = classCheckRepository.Update(fileds, wheres);
}
else
{
item.CurrentDeductionHours = currentDeductionHours;
item.MakeUpStatus = 1;
var newId = classCheckRepository.Insert(item);
item.ClassCheckId = newId;
flag = newId > 0;
}
var oldModel = classCheckRepository.GetGuestFinishMinutesRepository(item.OrderGuestId.ToString(), ClassCheckId: item.ClassCheckId)?.FirstOrDefault();
if (flag)
{
//更新学员完成课时
var completeHours = (oldModel?.FinishClassHours ?? 0) + currentDeductionHours;
Dictionary<string, object> orderFileds = new Dictionary<string, object>()
{
{nameof(RB_Order_Guest_ViewModel.CompleteHours),completeHours }
};
string LogContent = "";
var shenyuHours = guestModel.ValidClassHours - completeHours;
//已上课时>=有效课时,如果是,修改学员状态为停课,并且备注“有效课时消耗完毕,系统自动停课”
if (completeHours > guestModel.ValidClassHours)
{
orderFileds.Add(nameof(RB_Order_Guest_ViewModel.GuestState), 5);
orderFileds.Add(nameof(RB_Order_Guest_ViewModel.ChangeEffectTime), DateTime.Now);
orderFileds.Add(nameof(RB_Order_Guest_ViewModel.DropOutRemark), "有效课时消耗完毕,系统自动停课");
LogContent = guestModel.GuestName + "有效课时消耗完毕,系统自动停课!";
// var orderModel = orderRepository.GetEntity(guestModel.OrderId);
var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
// var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
// var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
#region 欠费提醒(销售)
var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
if (!string.IsNullOrEmpty(queryTargetWorkId))
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}\n>\n>待收金额:<font color='warning'>¥{shengyuMoney.ToString("0.00")}</font>\n>停课理由:费用不足,系统自动触发停课限制\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员欠费停课通知",
Platform = 5,
ReceiveId = queryTargetWorkId
};
Common.Message.MessageHelper.SendMessage(modelWork);
}
#endregion
#region 欠费提醒(管理者)
var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Arrears");
if (queryNotifyManager != null && queryNotifyManager.Count > 0)
{
queryNotifyManager.ForEach(x =>
{
var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}({sellerInfo.AccountName})\n>\n>待收金额:<font color='warning'>¥{shengyuMoney.ToString("0.00")}</font>\n>停课理由:费用不足,系统自动触发停课限制\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员欠费停课通知",
Platform = 5,
ReceiveId = x.WorkUserId
};
Common.Message.MessageHelper.SendMessage(modelWork);
});
}
#endregion
}
else if (guestModel.TotalHours > guestModel.ValidClassHours && shenyuHours < 12)
{
// var orderModel = orderRepository.GetEntity(guestModel.OrderId);
var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
// var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
// var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
#region 即将欠费提醒(销售)
var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
if (!string.IsNullOrEmpty(queryTargetWorkId))
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`欠费预警` 学员即将欠费通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>关联单号:{guestModel.OrderId}\n>\n>待收金额:<font color='warning'>¥{shengyuMoney.ToString("0.00")}</font>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员即将欠费通知",
Platform = 5,
ReceiveId = queryTargetWorkId
};
Common.Message.MessageHelper.SendMessage(modelWork);
}
#endregion
#region 即将欠费提醒(管理者)
var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Arrears");
if (queryNotifyManager != null && queryNotifyManager.Count > 0)
{
queryNotifyManager.ForEach(x =>
{
var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`欠费预警` 学员即将欠费通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>关联单号:{guestModel.OrderId}({sellerInfo.AccountName})\n>\n>待收金额:<font color='warning'>¥{shengyuMoney.ToString("0.00")}</font>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员即将欠费通知",
Platform = 5,
ReceiveId = x.WorkUserId
};
Common.Message.MessageHelper.SendMessage(modelWork);
});
}
#endregion
}
else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours < 12 && shenyuHours > 0)
{
// var orderModel = orderRepository.GetEntity(guestModel.OrderId);
var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
// var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
// var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
#region 即将结课提醒 (销售端)
var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
if (!string.IsNullOrEmpty(queryTargetWorkId))
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`结课预警` 学员即将结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId}\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员即将结课通知",
Platform = 5,
ReceiveId = queryTargetWorkId
};
Common.Message.MessageHelper.SendMessage(modelWork);
}
#endregion
#region 即将结课提醒 (管理端)
var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_EndClass");
if (queryNotifyManager != null && queryNotifyManager.Count > 0)
{
queryNotifyManager.ForEach(x =>
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`结课预警` 学员即将结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId} ({sellerInfo.AccountName})\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员即将结课通知",
Platform = 5,
ReceiveId = x.WorkUserId
};
Common.Message.MessageHelper.SendMessage(modelWork);
});
}
#endregion
}
else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours == 0)
{
// var orderModel = orderRepository.GetEntity(guestModel.OrderId);
var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
// var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
// var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
#region 即将结课提醒 (销售端)
var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
if (!string.IsNullOrEmpty(queryTargetWorkId))
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`结课通知` 学员已结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId}\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员已结课通知",
Platform = 5,
ReceiveId = queryTargetWorkId
};
Common.Message.MessageHelper.SendMessage(modelWork);
}
#endregion
#region 即将结课提醒 (销售端)
var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_EndClass");
if (queryNotifyManager != null && queryNotifyManager.Count > 0)
{
queryNotifyManager.ForEach(x =>
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`结课通知` 学员已结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId} ({sellerInfo.AccountName})\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员已结课通知",
Platform = 5,
ReceiveId = x.WorkUserId
};
Common.Message.MessageHelper.SendMessage(modelWork);
});
}
#endregion
}
if (item.CheckStatus == 1)
{
#region 通知缺勤信息
var param = new RB_Class_Plan_ViewModel()
{
ClassTimeId = item.ClassTimeId
};
var planModel = class_PlanRepository.GetClassPlanListExtRepository(param).FirstOrDefault();
var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Absence");
if (queryNotifyManager != null && queryNotifyManager.Count > 0)
{
queryNotifyManager.ForEach(x =>
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/stuMan/studentManage?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`缺勤通知` 学员缺勤信息告知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>缺勤时间:<font color='warning'>{planModel.ClassDate}({planModel.StartTime}-{planModel.EndTime})</font>\n>关联单号:{guestModel.OrderId}\n>班级名称:<font>{planModel.ClassName}</font>\n>带班老师:<font>{planModel.TeacherName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员缺勤通知",
Platform = 5,
ReceiveId = x.WorkUserId
};
Common.Message.MessageHelper.SendMessage(modelWork);
});
}
#endregion
}
flag = order_GuestRepository.Update(orderFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), item.OrderGuestId));
if (flag && !string.IsNullOrEmpty(LogContent))
{
user_ChangeLogRepository.Insert(new Model.Entity.Log.RB_User_ChangeLog()
{
Id = 0,
Type = 3,
CreateBy = item.CreateBy,
CreateTime = DateTime.Now,
Group_Id = item.Group_Id,
LogContent = LogContent,
School_Id = item.School_Id,
SourceId = guestModel.Id
});
}
//缺勤和请假
if (item.CheckStatus == 1 || item.CheckStatus == 2)
{
flag = CalcGuestHoursModule(guestModel, item, orderModel, classModel, sellerInfo);
}
}
}
}
return flag;
}
/// <summary>
/// 计算学员缺课课时
/// </summary>
/// <param name="guestModel"></param>
/// <param name="checkModel"></param>
/// <returns></returns>
public bool CalcGuestHoursModule(RB_Order_Guest guestModel, RB_Class_Check_ViewModel checkModel, RB_Order orderModel, RB_Class_ViewModel classModel, Model.ViewModel.User.RB_Account_ViewModel sellerInfo)
{
bool flag = true;
if (guestModel.GuestState == 1)
{
decimal NoFinishHours = 0;
//获取以前所有签到列表【倒叙】
var checkList = classCheckRepository.GetClassCheckListRepository(new RB_Class_Check_ViewModel()
{
ClassId = checkModel.ClassId,
OrderGuestId = checkModel.OrderGuestId,
EndDate = Common.ConvertHelper.FormatDate(checkModel.ClassDate)
}).OrderByDescending(qitem => qitem.ClassDate).ToList();
for (var i = 0; i < checkList.Count; i++)
{
if ((checkList[i].CheckStatus == 1) && (checkList[i].MakeUpStatus == 3 || checkList[i].MakeUpStatus == 4 || checkList[i].MakeUpStatus == 1))
{
NoFinishHours += checkList[i].CurrentDeductionHours;
}
else
{
break;
}
}
Dictionary<string, object> fileds = new Dictionary<string, object>();
Dictionary<string, object> checkFileds = new Dictionary<string, object>();
//缺勤课时超过12课时更新学员状态为【停课】
if (NoFinishHours >= Common.Config.AbsentHours)
{
fileds.Add(nameof(RB_Order_Guest_ViewModel.GuestState), 5);
checkFileds.Add(nameof(RB_Class_Check_ViewModel.IsAbsentHours), 1);
checkFileds.Add(nameof(RB_Class_Check_ViewModel.MakeUpStatus), 4);
// var orderModel = orderRepository.GetEntity(guestModel.OrderId);
var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
// var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
// var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
#region 欠费提醒(销售)
var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
if (!string.IsNullOrEmpty(queryTargetWorkId))
{
// 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}\n>\n>待收金额:<font color='warning'>¥{shengyuMoney.ToString("0.00")}</font>\n>停课理由:连续缺课超过{Config.AbsentHours}课时,系统自动停课\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员欠费停课通知",
Platform = 5,
ReceiveId = queryTargetWorkId
};
Common.Message.MessageHelper.SendMessage(modelWork);
}
#endregion
#region 欠费提醒(管理者)
var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Arrears");
if (queryNotifyManager != null && queryNotifyManager.Count > 0)
{
queryNotifyManager.ForEach(x =>
{
var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
path = HttpUtility.UrlEncode(path);
string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}({sellerInfo.AccountName})\n>\n>待收金额:<font color='warning'>¥{shengyuMoney.ToString("0.00")}</font>\n>停课理由:连续缺课超过{Config.AbsentHours}课时,系统自动停课\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.SalePeople,
Content = markdownContent,
CoverImg = "",
CreateByName = "系统",
JumpUrl = "",
WorkMsgType = "markdown",
SendTime = DateTime.Now,
SendType = 0,
Title = "学员欠费停课通知",
Platform = 5,
ReceiveId = x.WorkUserId
};
Common.Message.MessageHelper.SendMessage(modelWork);
});
}
#endregion
}
if (fileds != null && fileds.Count > 0 && checkFileds != null && checkFileds.Count > 0)
{
List<WhereHelper> wheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Order_Guest_ViewModel.Id),guestModel.Id),
};
flag = order_GuestRepository.Update(fileds, wheres);
List<WhereHelper> checkWheres = new List<WhereHelper>()
{
new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),checkModel.ClassCheckId),
};
flag = classCheckRepository.Update(checkFileds, checkWheres);
}
if (flag && checkModel.CheckStatus == 1 && checkModel.IsUpdateMakeUp != 1)
{
//请假的 因为不扣课时, 无法进补课
flag = student_MakeupRepository.SetStudentMakeUpRepository(new RB_Student_Makeup()
{
Id = 0,
ClassCheckId = checkModel.ClassCheckId,
ClassDate = checkModel.ClassDate,
ClassId = checkModel.ClassId,
CreateBy = checkModel.CreateBy,
CreateTime = checkModel.CreateTime,
Group_Id = checkModel.Group_Id,
MakeUpStatus = 1,
OrderGuestId = checkModel.OrderGuestId
});
}
}
return flag;
}
}
}
......@@ -233,6 +233,12 @@ GROUP BY A.ClassId
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds);
}
if (!string.IsNullOrEmpty(query.Q_ClassTimeIds))
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassTimeId), query.Q_ClassTimeIds);
}
if (!string.IsNullOrWhiteSpace(query.StartDate))
{
builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate);
......
......@@ -7,6 +7,7 @@ using Edu.Common.Plugin;
using Edu.Model.ViewModel.Grade;
using Edu.Model.ViewModel.User;
using Edu.Module.Course;
using Edu.Module.EduTask;
using Edu.Module.Public;
using Edu.Module.User;
using Edu.WebApi.Filter;
......@@ -51,6 +52,11 @@ namespace Edu.WebApi.Controllers.Applet
/// </summary>
private readonly CourseModule courseModule = AOP.AOPHelper.CreateAOPObject<CourseModule>();
/// <summary>
/// 教务单据处理类对象
/// </summary>
private readonly EducationReceiptModule educationReceiptModule = AOP.AOPHelper.CreateAOPObject<EducationReceiptModule>();
#region 小程序首页
/// <summary>
/// 小程序首页
......@@ -103,6 +109,7 @@ namespace Edu.WebApi.Controllers.Applet
studentModel.SurplusHours,//剩余时间
studentModel.TeacherName,//老师
studentModel.ClassId,
studentModel.ClassName,
studentModel.CourseId,
EnterPhone = Cache.User.UserReidsCache.GetUserLoginInfo(studentModel.EnterID).UserMobile,
ContractNum = (((contractList != null && contractList.Any()) ? contractList.Count() : 0) + ((backClassList != null && backClassList.Any()) ? backClassList.Count() : 0)),//合同数
......@@ -191,6 +198,7 @@ namespace Edu.WebApi.Controllers.Applet
}
planListResult.Add(new
{
itemGroup.Chapter,
DateYear = startTime.AddDays(i).ToString("yyyy"),
DateMonth = startTime.AddDays(i).ToString("MM"),
......@@ -198,13 +206,19 @@ namespace Edu.WebApi.Controllers.Applet
WeekStr = StringHelper.GetJapanWeekChar(startTime.AddDays(i)),
ClassDateStr = startTime.AddDays(i).ToString("yyyy-MM-dd"),
ClassName = plan.Where(x => x.ClassId == itemGroup.ClassId).FirstOrDefault()?.ClassName ?? "",
itemGroup.ClassId,
itemGroup.CourseId,
PlanTimeList = itemGroup.PlanTimeList.Select(x => new
{
x.StartTime,
x.EndTime,
x.ClassPlanId,
x.ClassTimeId,
x.TimeHour,
TeacherName = itemGroup.TeacherName ?? "",
UserIcon = itemGroup.UserIcon ?? "",
IsCheck = x.GuestList.Where(x => x.StudentId == base.AppletUserInfo.AccountId).FirstOrDefault()?.IsCheck,
OrderGuestId = x.GuestList.Where(x => x.StudentId == base.AppletUserInfo.AccountId).FirstOrDefault()?.Id,
IsLeave = Convert.ToDateTime(x.NewPlanDateTime) > DateTime.Now ? 1 : 0
})
});
......@@ -373,5 +387,68 @@ namespace Edu.WebApi.Controllers.Applet
return ApiResult.Success(data: planListResult);
}
#endregion
#region 我的请假列表
/// <summary>
/// 获取请假单据分页列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetEducationReceiptPage()
{
var pageModel = Common.Plugin.JsonHelper.DeserializeObject<ResultPageModel>(RequestParm.Msg.ToString());
var query = new Model.ViewModel.EduTask.EducationReceiptQuery()
{
Group_Id = base.AppletUserInfo.Group_Id,
StartTime = base.ParmJObj.GetStringValue("StartTime"),
EndTime = base.ParmJObj.GetStringValue("EndTime"),
Conditon = Common.Enum.Course.EduReceiptConditionEnum.Launch,
ReceiptType = 7,
Title = base.ParmJObj.GetStringValue("Title")
};
if (!string.IsNullOrEmpty(base.ParmJObj.GetStringValue("VerifyStatus")))
{
query.VerifyStatus = base.ParmJObj.GetInt("VerifyStatus", -1);
}
var id = base.ParmJObj.GetInt("Id");
if (id > 0)
{
query.QIds = id.ToString();
}
query.CreateBy = base.AppletUserInfo.Id;
var list = educationReceiptModule.GetEducationReceiptPageModule(pageModel.PageIndex, pageModel.PageSize, out long rowsCount, query);
pageModel.PageData = list;
pageModel.Count = rowsCount;
return ApiResult.Success(data: pageModel);
}
/// <summary>
/// 获取教务单据类型
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetEduReceiptInfo()
{
var Id = base.ParmJObj.GetInt("Id");
var Info = educationReceiptModule.GetEducationReceiptInfoModule(Id);
return ApiResult.Success(data: Info);
}
/// <summary>
/// 教务单据作废
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult InvalidReceipt()
{
var Id = base.ParmJObj.GetInt("Id");
var flag = educationReceiptModule.InvalidReceiptModule(Id);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
#endregion
}
}
using Edu.Common.API;
using Edu.Common.Enum.Course;
using Edu.Common.Plugin;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.EduTask;
using Edu.Module.Course;
using Edu.Module.EduTask;
using Edu.WebApi.Filter;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Edu.WebApi.Controllers.Applet
{
/// <summary>
/// 改变流程相关申请
/// </summary>
[Route("api/[controller]/[action]")]
[ApiExceptionFilter]
[ApiController]
[EnableCors("AllowCors")]
public class LeaveStudentController : AppletBaseController
{
/// <summary>
/// 学生请假处理类对象
/// </summary>
private readonly LeaveStudentModule leaveStudentModule = AOP.AOPHelper.CreateAOPObject<LeaveStudentModule>();
/// <summary>
/// 班级处理类对象
/// </summary>
private readonly ClassModule classModule = AOP.AOPHelper.CreateAOPObject<ClassModule>();
/// <summary>
/// 新增修改学生请假
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult SetStudentLeave()
{
var model = new RB_Student_Leave_ViewModel()
{
Id = base.ParmJObj.GetInt("Id"),
ClassId = base.ParmJObj.GetInt("ClassId"),
CourseId = base.ParmJObj.GetInt("CourseId"),
OrderGuestId = base.ParmJObj.GetInt("OrderGuestId"),
Remarks = base.ParmJObj.GetStringValue("Remarks"),
LeaveType = base.ParmJObj.GetInt("LeaveType")
};
var classModel = classModule.GetClassModule(model.ClassId);
string receiptFile = string.Empty;
try
{
List<LeaveInfoModel> LeaveInfoList = Common.Plugin.JsonHelper.DeserializeObject<List<LeaveInfoModel>>(base.ParmJObj.GetStringValue("LeaveInfoList"));
if (LeaveInfoList == null || !LeaveInfoList.Any())
{
return ApiResult.Failed("请选择请假时间");
}
else
{
model.LeaveInfo = JsonHelper.Serialize(LeaveInfoList);
model.ClassTimeIds = string.Join(",", LeaveInfoList.Select(x => x.ClassTimeId));
}
List<string> receiptFileList = Common.Plugin.JsonHelper.DeserializeObject<List<string>>(base.ParmJObj.GetStringValue("ReceiptFileList"));
if (receiptFileList == null || !receiptFileList.Any())
{
receiptFile = "";
// return ApiResult.Failed("附件必须上传");
}
else
{
receiptFile = JsonHelper.Serialize(receiptFileList);
}
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, "SetStudentLeave");
}
if (model.Id == 0)
{
model.CreateBy = base.AppletUserInfo.Id;
model.CreateTime = DateTime.Now;
model.Group_Id = base.AppletUserInfo.Group_Id;
model.School_Id = classModel.School_Id;
}
model.UpdateBy = base.AppletUserInfo.Id;
model.UpdateTime = DateTime.Now;
bool flag = leaveStudentModule.SetStudentLeaveModule(model, receiptFile);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
public ApiResult TestUpdateClassPlan()
{
int id = base.ParmJObj.GetInt("Id");
var result = leaveStudentModule.UpdateChangeClassPlan(id);
return ApiResult.Success("");
}
}
}
......@@ -95,6 +95,8 @@
"OrderTransClassFlowId": 5,
//订单分拆流程编号
"OrderSplitClassFlowId": 6,
//学生请假流程编号
"StudentLeaveFlowId": 7,
"ErpUrl": "http://localhost:8181/#",
//是否开启调课数据验证
"IsOpenChangeClassVerify": 1,
......
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