using Edu.Common.Enum;
using Edu.Common.Enum.Duty;
using Edu.Common.Enum.System;
using Edu.Common.Enum.User;
using Edu.Common.Message;
using Edu.Model.CacheModel;
using Edu.Model.ViewModel.Duty;
using Edu.Model.ViewModel.Reserve;
using Edu.Model.ViewModel.User;
using Edu.Repository.Duty;
using Edu.Repository.Reserve;
using Edu.Repository.User;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VT.FW.AOP.CustomerAttribute;
using VT.FW.DB;
namespace Edu.Module.Duty
{
///
/// 值班计划处理类
///
public class DutyPlanModule
{
///
/// 值班计划仓储层对象
///
private readonly RB_Duty_PlanRepository duty_PlanRepository = new RB_Duty_PlanRepository();
///
/// 值班班次仓储层对象
///
private readonly RB_Duty_PlanDetailsRepository duty_PlanDetailsRepository = new RB_Duty_PlanDetailsRepository();
///
/// 账号仓储层对象
///
private readonly RB_AccountRepository accountRepository = new RB_AccountRepository();
///
/// 值班事项仓储层对象
///
private readonly RB_Duty_ItemRepository duty_ItemRepository = new RB_Duty_ItemRepository();
///
/// 值班内容仓储层对象
///
private readonly RB_Duty_ContentRepository duty_ContentRepository = new RB_Duty_ContentRepository();
///
/// 访客仓储层对象
///
private readonly RB_VisitorRepository visitorRepository = new RB_VisitorRepository();
///
/// 班次仓储层对象
///
private readonly RB_Duty_FrequencyRepository duty_FrequencyRepository = new RB_Duty_FrequencyRepository();
///
/// 试听课仓储层对象
///
private readonly RB_Visitor_ReserveRepository visitor_ReserveRepository = new RB_Visitor_ReserveRepository();
///
/// 学员仓储层对象
///
public readonly RB_StudentRepository studentRepository = new RB_StudentRepository();
///
/// 获取值班计划分页列表【管理端】
///
///
///
///
///
///
public List GetDutyPlanPageModule(int pageIndex, int pageSize, out long rowsCount, RB_Duty_Plan_ViewModel query)
{
var list = duty_PlanRepository.GetDutyPlanPageRepository(pageIndex, pageSize, out rowsCount, query);
if (list != null && list.Count > 0)
{
var ids = string.Join(",", list.Select(qitem => qitem.Id));
List planDetails = new List();
if (!string.IsNullOrEmpty(ids))
{
planDetails = GetDutyPlanDetailsListModule(new RB_Duty_PlanDetails_ViewModel() { QPlanIds = ids, QDutyStatus = query.QDutyStatus, QAttendanceStatus = query.QAttendanceStatus }, IsQueryDutyMan: true);
}
foreach (var item in list)
{
item.PlanDetails = planDetails?.Where(qitem => qitem.PlanId == item.Id)?.ToList() ?? new List();
}
}
return list;
}
///
/// 获取我的值班计划分页列表
///
///
///
///
///
///
public List GetMyDutyPlanPageModule(int pageIndex, int pageSize, out long rowsCount, RB_Duty_Plan_ViewModel query)
{
var list = duty_PlanRepository.GetMyDutyPlanPageRepository(pageIndex, pageSize, out rowsCount, query);
if (list != null && list.Count > 0)
{
var ids = string.Join(",", list.Select(qitem => qitem.Id));
string schoolIds = string.Join(",", list.Select(qitem => qitem.School_Id));
string shiftIds = "";
List planDetails = new List();
List dutyItemList = new List();
List dutyContentList = new List();
if (!string.IsNullOrEmpty(ids))
{
planDetails = GetDutyPlanDetailsListModule(new RB_Duty_PlanDetails_ViewModel() { QPlanIds = ids, QDutyStatus=-1 }, IsQueryDutyMan: true);
dutyContentList = duty_ContentRepository.GetDutyContentListRepository(new RB_Duty_Content_ViewModel() { QPlanIds = ids });
}
if (planDetails != null && planDetails.Count > 0)
{
shiftIds = string.Join(",", planDetails.Select(qitem => qitem.Shift));
}
if (!string.IsNullOrEmpty(schoolIds) && !string.IsNullOrEmpty(shiftIds))
{
dutyItemList = duty_ItemRepository.GetDutyItemListRepository(new RB_Duty_Item_ViewModel()
{
ItemSchools = schoolIds,
Shifts = shiftIds
});
}
foreach (var item in list)
{
item.PlanDetails = planDetails?.Where(qitem => qitem.PlanId == item.Id)?.ToList() ?? new List();
item.WorkContentList = new List();
if (item.PlanDetails != null && item.PlanDetails.Count > 0)
{
foreach (var subItem in item.PlanDetails)
{
subItem.WorkContentList = new List();
var tempContentList = dutyContentList.Where(qitem => qitem.PlanType == 1 && qitem.PlanId == item.Id && qitem.PlanShift == subItem.Shift && qitem.CreateBy == subItem.DutyMan)?.ToList();
if (tempContentList != null && tempContentList.Count > 0)
{
foreach (var dItem in tempContentList)
{
var dutyItem = dutyItemList?.Where(qitem => qitem.Shifts.Contains(subItem.Shift.ToString()) && qitem.Id == dItem.ItemId && qitem.ItemSchools.Contains(item.School_Id.ToString()))?.FirstOrDefault();
int isFinish = 0;
if (dutyItem!=null&&dutyItem.ItemType == ItemTypeEnum.Choice)
{
isFinish = dItem.WorkIsFinish;
}
else if (dutyItem!=null&&dutyItem.ItemType == ItemTypeEnum.FillIn)
{
if (!string.IsNullOrEmpty(dItem.WorkContent))
{
isFinish = 1;
}
}
subItem.WorkContentList.Add(new RB_Duty_PlanWork_ViewModel()
{
Id = dItem.Id,
ItemId = dutyItem?.Id ?? 0,
ItemType = dutyItem?.ItemType ?? ItemTypeEnum.Choice,
ItemName = dutyItem?.ItemName ?? "",
WorkContent = dItem?.WorkContent ?? "",
IsChecked = isFinish
});
}
}
else
{
foreach (var dutyItem in dutyItemList.Where(qitem => qitem.ItemSchools.Contains(item.School_Id.ToString()) && qitem.Shifts.Contains(subItem.Shift.ToString())))
{
int isFinish = 0;
var dItem = dutyContentList.Where(qitem => qitem.PlanType == 1 && qitem.PlanId == item.Id
&& qitem.PlanShift == subItem.Shift && qitem.ItemId == dutyItem.Id && qitem.CreateBy == subItem.DutyMan)?.FirstOrDefault();
if (dutyItem.ItemType == ItemTypeEnum.Choice)
{
isFinish = dItem?.WorkIsFinish ?? 0;
}
else if (dutyItem.ItemType == ItemTypeEnum.FillIn)
{
if (!string.IsNullOrEmpty(dItem?.WorkContent))
{
isFinish = 1;
}
}
subItem.WorkContentList.Add(new RB_Duty_PlanWork_ViewModel()
{
Id = dItem?.Id ?? 0,
ItemId = dutyItem?.Id ?? 0,
ItemType = dutyItem?.ItemType ?? ItemTypeEnum.Choice,
ItemName = dutyItem?.ItemName ?? "",
WorkContent = dItem?.WorkContent ?? "",
IsChecked = isFinish
});
}
}
subItem.BurstCount = dutyContentList?.Where(qitem => qitem.PlanType == 3 && qitem.PlanId == item.Id && qitem.CreateBy == subItem.DutyMan)?.Count() ?? 0;
if (subItem.Status == DutyStatusEnum.DutyFinished)
{
subItem.HandoverCount = dutyContentList?.Where(qitem => qitem.PlanType == 2 && qitem.PlanId == item.Id && qitem.CreateBy == subItem.DutyMan)?.Count() ?? 0;
}
}
}
item.TotalBurstCount = item.PlanDetails.Sum(qitem => qitem.BurstCount);
item.TotalHandoverCount = item.PlanDetails.Sum(qitem => qitem.HandoverCount);
}
}
return list;
}
///
/// 计算班次值班是否完成
///
///
///
///
///
public DutyStatusEnum CalcDutyPlanStatusModule(DateTime planDate, string startTime, string endTime)
{
DutyStatusEnum dutyStatus = DutyStatusEnum.NoStart;
var dutyStartTime = Convert.ToDateTime(Common.ConvertHelper.FormatDate(planDate) + " " + startTime);
var dutyEndTime = Convert.ToDateTime(Common.ConvertHelper.FormatDate(planDate) + " " + endTime);
var dt = DateTime.Now.AddMinutes(30);
if (dt > dutyEndTime)
{
dutyStatus = Common.Enum.Duty.DutyStatusEnum.DutyFinished;
}
else if (dt >= dutyStartTime && DateTime.Now <= dutyEndTime)
{
dutyStatus = Common.Enum.Duty.DutyStatusEnum.DutyIng;
}
else
{
dutyStatus = Common.Enum.Duty.DutyStatusEnum.NoStart;
}
return dutyStatus;
}
///
/// 获取值班班次详情列表
///
///
/// true-查询人员
///
public List GetDutyPlanDetailsListModule(RB_Duty_PlanDetails_ViewModel query, bool IsQueryDutyMan = false)
{
var list = duty_PlanDetailsRepository.GetDutyPlanDetailsListRepository(query);
if (IsQueryDutyMan && list != null && list.Count > 0)
{
var ids = string.Join(",", list.Select(qitem => qitem.DutyMan));
List empList = new List();
if (!string.IsNullOrEmpty(ids))
{
empList = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { QIds = ids });
}
foreach (var item in list)
{
var empModel = empList?.Where(qitem => qitem.Id == item.DutyMan)?.FirstOrDefault();
item.DutyManName = empModel?.EmployeeName ?? "";
item.DutyManIcon = empModel?.UserIcon ?? "";
if (string.IsNullOrEmpty(item.StartTime) && !string.IsNullOrEmpty(item.ConfigStartTime))
{
item.StartTime = item.ConfigStartTime;
}
if (string.IsNullOrEmpty(item.EndTime) && !string.IsNullOrEmpty(item.ConfigEndTime))
{
item.EndTime = item.ConfigEndTime;
}
}
}
return list;
}
///
/// 检查值班计划是否存在
///
///
///
public bool CheckExistsDutyPlanModule(RB_Duty_Plan_ViewModel query)
{
return duty_PlanRepository.CheckExistsDutyPlanRepository(query);
}
///
/// 新增修改值班计划
///
///
///
[TransactionCallHandler]
public virtual bool SetDutyPlanModule(RB_Duty_Plan_ViewModel model, UserInfo userInfo)
{
bool flag = false;
if (model.Id > 0)
{
Dictionary fileds = new Dictionary()
{
{ nameof(RB_Duty_Plan_ViewModel.Date), model.Date},
{ nameof(RB_Duty_Plan_ViewModel.School_Id), model.School_Id},
{ nameof(RB_Duty_Plan_ViewModel.UpdateBy), model.UpdateBy},
{ nameof(RB_Duty_Plan_ViewModel.UpdateTime), model.UpdateTime},
};
flag = duty_PlanRepository.Update(fileds, new WhereHelper(nameof(RB_Duty_Plan_ViewModel.Id), model.Id));
}
else
{
var newId = duty_PlanRepository.Insert(model);
model.Id = newId;
flag = newId > 0;
}
//原班次列表
var oldPlanDetailsList = GetDutyPlanDetailsListModule(new RB_Duty_PlanDetails_ViewModel()
{
PlanId = model.Id
});
List messageList = new List();
//原没有班次信息
if (oldPlanDetailsList == null || (oldPlanDetailsList != null && oldPlanDetailsList.Count == 0))
{
if (model.PlanDetails != null && model.PlanDetails.Count > 0)
{
foreach (var item in model.PlanDetails)
{
item.PlanId = model.Id;
duty_PlanDetailsRepository.Insert(item);
messageList.Add(new PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.UserDuty,
Content = string.Format("您有{0}的值班信息,请注意查收!", Common.ConvertHelper.FormatDate(model.Date)),
CoverImg = "",
CreateByName = userInfo.AccountName,
JumpUrl = "/home",
ReceiveId = item.DutyMan.ToString(),
SendTime = DateTime.Now,
SendType = 0,
Title = "值班信息",
Platform = 2
});
}
}
}
else
{
//现在没有值班信息了【直接删除以前的值班信息】
if (model.PlanDetails == null || (model.PlanDetails != null && model.PlanDetails.Count == 0))
{
duty_PlanDetailsRepository.DeletePlanDetailsRepository(model.Id);
foreach (var item in model.PlanDetails)
{
messageList.Add(new PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.UserDuty,
Content = string.Format("您在{0}的值班,已被取消!", Common.ConvertHelper.FormatDate(model.Date)),
CoverImg = "",
CreateByName = userInfo.AccountName,
JumpUrl = "",
ReceiveId = item.DutyMan.ToString(),
SendTime = DateTime.Now,
SendType = 0,
Title = "值班取消",
Platform = 2
});
}
}
//找出差异的数据
var deleteList = oldPlanDetailsList.Where(qitem => !model.PlanDetails.Any(oldItem => qitem.Id == oldItem.Id)).ToList();
foreach (var dItem in deleteList)
{
if (dItem.Id > 0)
{
duty_PlanDetailsRepository.Delete(dItem.Id);
}
messageList.Add(new PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.UserDuty,
Content = string.Format("您在{0}的值班,已被取消!", Common.ConvertHelper.FormatDate(model.Date)),
CoverImg = "",
CreateByName = userInfo.AccountName,
JumpUrl = "",
ReceiveId = dItem.DutyMan.ToString(),
SendTime = DateTime.Now,
SendType = 0,
Title = "值班取消",
Platform = 2
});
}
foreach (var item in model.PlanDetails)
{
item.PlanId = model.Id;
if (item.Id == 0)
{
duty_PlanDetailsRepository.Insert(item);
messageList.Add(new PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.UserDuty,
Content = string.Format("您有{0}的值班信息,请注意查收!", Common.ConvertHelper.FormatDate(model.Date)),
CoverImg = "",
CreateByName = userInfo.AccountName,
JumpUrl = "/home",
ReceiveId = item.DutyMan.ToString(),
SendTime = DateTime.Now,
SendType = 0,
Title = "值班信息",
Platform = 2
});
}
else
{
duty_PlanDetailsRepository.Update(item);
}
}
}
if (messageList != null && messageList.Count > 0)
{
Common.Message.MessageHelper.SendMessage(messageList);
}
return flag;
}
///
/// 根据编号获取计划详情
///
///
///
public RB_Duty_Plan_ViewModel GetDutyPlanModule(int Id)
{
RB_Duty_Plan_ViewModel model = duty_PlanRepository.GetEntity(Id);
if (model != null && model.Id > 0)
{
model.PlanDetails = GetDutyPlanDetailsListModule(new RB_Duty_PlanDetails_ViewModel() { PlanId = model.Id ,QDutyStatus=-1});
}
return model;
}
///
/// 删除值班计划
///
///
///
[TransactionCallHandler]
public virtual bool RemoveDutyPlanModule(int Id, UserInfo userInfo)
{
Dictionary fileds = new Dictionary()
{
{ nameof(RB_Duty_Plan_ViewModel.Status),(int) DateStateEnum.Delete}
};
var flag = duty_PlanRepository.Update(fileds, new WhereHelper(nameof(RB_Duty_Plan_ViewModel.Id), Id));
if (flag)
{
var dutyModel = GetDutyPlanModule(Id);
if (dutyModel != null && dutyModel.PlanDetails != null && dutyModel.PlanDetails.Count > 0)
{
List messageList = new List();
foreach (var item in dutyModel.PlanDetails)
{
messageList.Add(new PushMessageModel()
{
CategoryId = PushMessageCategoryEnum.UserDuty,
Content = string.Format("您在{0}的值班,已被取消!", Common.ConvertHelper.FormatDate(dutyModel.Date)),
CoverImg = "",
CreateByName = userInfo.AccountName,
JumpUrl = "",
ReceiveId = item.DutyMan.ToString(),
SendTime = DateTime.Now,
SendType = 0,
Title = "值班取消",
Platform = 2
});
}
if (messageList != null && messageList.Count > 0)
{
Common.Message.MessageHelper.SendMessage(messageList);
}
}
}
return flag;
}
///
/// 用户值班
///
/// 值班编号
/// 值班班次
/// 用户信息
/// 是否查询工作内容-TRUE(查询)
///
public Dictionary OnDutyModule(int Id, int Shift, int userId, bool isQueryWork = false)
{
Dictionary result = new Dictionary();
var model = GetMyDutyPlanPageModule(1, 1, out _, new RB_Duty_Plan_ViewModel() { Id = Id, QDutyMan = userId.ToString(), QShift = Shift })?.FirstOrDefault();
if (model == null)
{
return result;
}
//当前班次
var currentModel = new RB_Duty_PlanDetails_ViewModel();
if (model.PlanDetails != null && model.PlanDetails.Count > 0)
{
//查找当前人员索引
int currentIndex = CalcCurrentDutyManIndexModule_V2(model);
//当前班次
currentModel = model.PlanDetails[currentIndex];
}
if (!isQueryWork)
{
result.Add("Id", model?.Id);
result.Add("PlanDate", Common.ConvertHelper.FormatDate(model?.Date));
result.Add("WeekDay", Common.ConvertHelper.GetWeekDay(model?.Date));
result.Add("CheckTime", currentModel?.CheckTimeStr);
result.Add("CheckLateTime", currentModel?.CheckLateTime);
if (currentModel?.CheckTimeStr != "未打卡")
{
result.Add("CheckLateTimeStr", (currentModel?.CheckLateTime > 0 ? string.Format("[迟到{0}分钟]", currentModel.CheckLateTime) : "[正常]"));
}
else
{
result.Add("CheckLateTimeStr", "");
}
result.Add("FinishTime", currentModel?.FinishTimeStr);
result.Add("FinishLateTime", currentModel?.FinishLateTime);
if (currentModel?.FinishTimeStr != "未打卡")
{
result.Add("FinishLateTimeStr", (currentModel?.FinishLateTime > 0 ? string.Format("[早退{0}分钟]", currentModel.FinishLateTime) : "[正常]"));
}
else
{
result.Add("FinishLateTimeStr", "");
}
result.Add("SchoolName", model?.SchoolName);
result.Add("ShiftName", currentModel?.ShiftName);
result.Add("StartTime", currentModel?.StartTime);
result.Add("EndTime", currentModel?.EndTime);
result.Add("DutyManName", currentModel?.DutyManName);
result.Add("DutyManIcon", currentModel?.DutyManIcon);
result.Add("Status", currentModel?.Status);
result.Add("StatusStr", currentModel?.StatusStr);
result.Add("DutyMan", currentModel?.DutyMan);
}
else
{
var dutyItemList = duty_ItemRepository.GetDutyItemListRepository(new RB_Duty_Item_ViewModel()
{
ItemSchools = model.School_Id.ToString(),
Shifts = currentModel.Shift.ToString(),
});
var PlanList = dutyItemList ?? new List();
//获取所有的值班内容
var contentList = duty_ContentRepository.GetDutyContentListRepository(new RB_Duty_Content_ViewModel() { PlanId = model.Id });
List empList = new List();
if (contentList != null)
{
string accountIdStr = string.Join(",", contentList.Select(qitem => qitem.CreateBy));
if (!string.IsNullOrEmpty(accountIdStr))
{
empList = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { QIds = accountIdStr });
}
}
foreach (var item in contentList)
{
if (!string.IsNullOrEmpty(item.FileURL))
{
try
{
item.FileList = Common.Plugin.JsonHelper.DeserializeObject>(item.FileURL);
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, "OnDutyModule_FileList");
}
}
}
List