public static bool DealWithAttendanceLog(string TenantName) { int VailTime = -30; //提前打卡有效时间内 int LastTime = 5; //最晚打卡时间后(迟到) int AbsentTime = 15; //最晚打卡时间后(旷课) var date = DateTime.Now; try { using (var db = new XkSystem.Models.DbContext()) { var Tenant = db.TableRoot <Admin.Entity.tbTenant>().Where(d => d.TenantName == TenantName).FirstOrDefault(); var SysUser = db.TableRoot <Sys.Entity.tbSysUser>().Where(d => d.UserCode == "System" && d.tbTenant.TenantName == TenantName).FirstOrDefault(); if (SysUser == null) { var admin = new Sys.Entity.tbSysUser() { tbTenant = Tenant, UserCode = "System", UserName = "******", UserType = Code.EnumHelper.SysUserType.Other, Password = "******", PasswordMd5 = Code.Common.CreateMD5Hash("system&123456"), }; db.Set <Sys.Entity.tbSysUser>().Add(admin); db.SaveChanges(); } int weekIndex = (int)DateTime.Now.DayOfWeek; weekIndex = weekIndex == 0 ? 7 : weekIndex; var OrgScheduleList = (from p in db.TableRoot <Course.Entity.tbOrgSchedule>().Where(d => d.tbTenant.TenantName == TenantName && d.tbWeek.No == weekIndex) select p).Include(d => d.tbPeriod).Include(d => d.tbOrg).ToList(); List <Entity.tbAttendance> ADlist = new List <Entity.tbAttendance>(); foreach (var ScheItem in OrgScheduleList) { var PeriodModel = (from p in db.TableRoot <Basis.Entity.tbPeriod>().Where(d => d.tbTenant.TenantName == TenantName && d.Id == ScheItem.tbPeriod.Id) select p).FirstOrDefault(); var PrevPeriodToDate = new DateTime(); if (PeriodModel.No > 1) { var PrevNo = PeriodModel.No - 1; var PrevPeriodModel = (from p in db.TableRoot <Basis.Entity.tbPeriod>().Where(d => d.tbTenant.TenantName == TenantName && d.No == PrevNo) select p).FirstOrDefault(); PrevPeriodToDate = Convert.ToDateTime(date.Year.ToString() + "-" + date.Month.ToString() + "-" + date.Day.ToString() + " " + PrevPeriodModel.ToDate); } var PeriodFromDate = Convert.ToDateTime(date.Year.ToString() + "-" + date.Month.ToString() + "-" + date.Day.ToString() + " " + PeriodModel.FromDate); var PeriodToDate = Convert.ToDateTime(date.Year.ToString() + "-" + date.Month.ToString() + "-" + date.Day.ToString() + " " + PeriodModel.ToDate); var KkDate = PeriodFromDate.AddMinutes(AbsentTime); //旷课时间点 var LDate = PeriodFromDate.AddMinutes(LastTime); //迟到时间点 var VDate = PeriodFromDate.AddMinutes(VailTime); //有效打卡时间点 var OrgModel = (from p in db.TableRoot <Course.Entity.tbOrg>().Where(d => d.tbTenant.TenantName == TenantName && d.Id == ScheItem.tbOrg.Id) select p).Include(d => d.tbClass).FirstOrDefault(); if (OrgModel.tbClass != null)//tbClassStudent { var ClassStudentList = (from p in db.TableRoot <Basis.Entity.tbClassStudent>().Where(d => d.tbTenant.TenantName == TenantName && d.tbClass.Id == OrgModel.tbClass.Id) select p).Include(d => d.tbStudent).Include(d => d.tbStudent.tbSysUser).ToList(); var StudentUserIds = ClassStudentList.Where(d => d.tbStudent.tbSysUser.CardNo != null).Select(d => d.tbStudent.tbSysUser.CardNo).ToList(); var LCardNoIds = new List <string>(); var LogList = new List <Entity.tbAttendanceLog>(); //迟到 if (PeriodModel.No == 1) { LogList = (from p in db.TableRoot <Entity.tbAttendanceLog>().Where(d => d.tbTenant.TenantName == TenantName && d.Status == false && StudentUserIds.Contains(d.CardNumber) && d.AttendanceDate <= PeriodToDate) select p).ToList();//第一节课 } else { LogList = (from p in db.TableRoot <Entity.tbAttendanceLog>().Where(d => d.tbTenant.TenantName == TenantName && d.Status == false && StudentUserIds.Contains(d.CardNumber) && d.AttendanceDate > PrevPeriodToDate && d.AttendanceDate <= PeriodToDate) select p).ToList();//其他节课 } foreach (var LogItem in LogList) { LogItem.Status = true; if (LogItem.AttendanceDate > LDate && LogItem.AttendanceDate <= KkDate)//迟到 { var model = new Entity.tbAttendance(); model.AttendanceDate = LogItem.AttendanceDate; model.No = 0; model.tbTenant = Tenant; model.InputDate = DateTime.Now; model.tbOrg = OrgModel; model.tbAttendanceType = db.TableRoot <Entity.tbAttendanceType>().Where(d => d.AttendanceTypeName == "迟到").FirstOrDefault(); model.tbPeriod = PeriodModel; model.tbStudent = db.TableRoot <Student.Entity.tbStudent>().Where(d => d.CardNo == LogItem.CardNumber).FirstOrDefault(); model.tbSysUser = db.TableRoot <Sys.Entity.tbSysUser>().Where(d => d.UserCode == "System" && d.tbTenant.TenantName == TenantName).FirstOrDefault(); ADlist.Add(model); LCardNoIds.Add(LogItem.CardNumber); } else if (LogItem.AttendanceDate >= VDate && LogItem.AttendanceDate <= LDate)//正常 { LCardNoIds.Add(LogItem.CardNumber); } else if (LogItem.AttendanceDate > KkDate) { LCardNoIds.Add(LogItem.CardNumber); } } //旷课 if (LCardNoIds != null && LCardNoIds.Count > 0 && LCardNoIds.Count >= (ClassStudentList.Count / 2)) { var KkStudentList = ClassStudentList.Where(d => !LCardNoIds.Contains(d.tbStudent.tbSysUser.CardNo)); foreach (var KsItem in KkStudentList) { var model = new Entity.tbAttendance(); model.AttendanceDate = DateTime.Today; model.tbTenant = Tenant; model.InputDate = DateTime.Now; model.tbOrg = OrgModel; model.tbAttendanceType = db.TableRoot <Entity.tbAttendanceType>().Where(d => d.AttendanceTypeName == "缺席").FirstOrDefault(); model.tbPeriod = PeriodModel; model.tbStudent = db.TableRoot <Student.Entity.tbStudent>().Where(d => d.CardNo == KsItem.tbStudent.tbSysUser.CardNo).FirstOrDefault(); model.tbSysUser = db.TableRoot <Sys.Entity.tbSysUser>().Where(d => d.UserCode == "System" && d.tbTenant.TenantName == TenantName).FirstOrDefault(); ADlist.Add(model); } } db.Set <Entity.tbAttendance>().AddRange(ADlist); } else//tbOrgStudent { var OrgStudentList = (from p in db.TableRoot <Course.Entity.tbOrgStudent>().Where(d => d.tbTenant.TenantName == TenantName && d.tbOrg.Id == ScheItem.tbOrg.Id) select p).Include(d => d.tbStudent).Include(d => d.tbStudent.tbSysUser).ToList(); var StudentUserIds = OrgStudentList.Where(d => d.tbStudent.tbSysUser.CardNo != null).Select(d => d.tbStudent.tbSysUser.CardNo).ToList(); var LCardNoIds = new List <string>(); var LogList = new List <Entity.tbAttendanceLog>(); //迟到 if (PeriodModel.No == 1) { LogList = (from p in db.TableRoot <Entity.tbAttendanceLog>().Where(d => d.tbTenant.TenantName == TenantName && d.Status == false && StudentUserIds.Contains(d.CardNumber) && d.AttendanceDate <= PeriodToDate) select p).ToList();//第一节课 } else { LogList = (from p in db.TableRoot <Entity.tbAttendanceLog>().Where(d => d.tbTenant.TenantName == TenantName && d.Status == false && StudentUserIds.Contains(d.CardNumber) && d.AttendanceDate > PrevPeriodToDate && d.AttendanceDate <= PeriodToDate) select p).ToList();//其他节课 } //List<Perform.Entity.tbAttendance> ADlist = new List<Perform.Entity.tbAttendance>(); foreach (var LogItem in LogList) { LogItem.Status = true; if (LogItem.AttendanceDate > LDate && LogItem.AttendanceDate <= KkDate)//迟到 { var model = new Entity.tbAttendance(); model.AttendanceDate = LogItem.AttendanceDate; model.No = 0; model.tbTenant = Tenant; model.InputDate = DateTime.Now; model.tbOrg = OrgModel; model.tbAttendanceType = db.TableRoot <Entity.tbAttendanceType>().Where(d => d.AttendanceTypeName == "迟到").FirstOrDefault(); model.tbPeriod = PeriodModel; model.tbStudent = db.TableRoot <Student.Entity.tbStudent>().Where(d => d.CardNo == LogItem.CardNumber).FirstOrDefault(); model.tbSysUser = db.TableRoot <Sys.Entity.tbSysUser>().Where(d => d.UserCode == "SysUser" && d.tbTenant.TenantName == TenantName).FirstOrDefault(); ADlist.Add(model); LCardNoIds.Add(LogItem.CardNumber); } else if (LogItem.AttendanceDate >= VDate && LogItem.AttendanceDate <= LDate)//正常 { LCardNoIds.Add(LogItem.CardNumber); } else if (LogItem.AttendanceDate > KkDate) { LCardNoIds.Add(LogItem.CardNumber); } } //旷课 if (LCardNoIds != null && LCardNoIds.Count > 0 && LCardNoIds.Count >= (OrgStudentList.Count / 2)) { var KkStudentList = OrgStudentList.Where(d => !LCardNoIds.Contains(d.tbStudent.tbSysUser.CardNo)); foreach (var KsItem in KkStudentList) { var model = new Entity.tbAttendance(); model.AttendanceDate = DateTime.Today; model.No = 0; model.tbTenant = Tenant; model.InputDate = DateTime.Now; model.tbOrg = OrgModel; model.tbAttendanceType = db.TableRoot <Entity.tbAttendanceType>().Where(d => d.AttendanceTypeName == "缺席").FirstOrDefault(); model.tbPeriod = PeriodModel; model.tbStudent = db.TableRoot <Student.Entity.tbStudent>().Where(d => d.CardNo == KsItem.tbStudent.tbSysUser.CardNo).FirstOrDefault(); model.tbSysUser = db.TableRoot <Sys.Entity.tbSysUser>().Where(d => d.UserCode == "SysUser" && d.tbTenant.TenantName == TenantName).FirstOrDefault(); ADlist.Add(model); } } db.Set <Entity.tbAttendance>().AddRange(ADlist); } } db.SaveChanges(); } return(true); } catch { return(false); } }
/// <summary> /// 审批流程 /// </summary> /// <param name="flowTypeCode">流程类型</param> /// <param name="approveBodyId">流程审批内容ID</param> /// <param name="conditionalFormula">匹配公式</param> /// <param name="approveOpinion">审批意见</param> /// <param name="reject">是否驳回</param> /// <param name="nextApproveUserId">下一个节点指定的审批人</param> public static void ExecuteWorkFlowEngine(XkSystem.Models.DbContext db, string flowTypeCode, int approveBodyId, string conditionalFormula, string approveOpinion, bool reject = false, int nextApproveUserId = 0) { //流程类型 var flowType = db.Table <Wechat.Entity.tbWeOAFlowType>().Where(m => m.Code == flowTypeCode).FirstOrDefault(); //当前审批人或流程发起人,如果登录角色非发起人角色则没有提交审批申请单的功能 var approveUser = db.Set <Sys.Entity.tbSysUser>().Find(XkSystem.Code.Common.UserId); //获取该审批项目的流程列表,排除驳回的流程 var approveDetailList = db.Table <Wechat.Entity.tbWeOAFlowDetail>() .Where(m => m.tbWeOAFlowType.Code == flowTypeCode && m.ApproveBodyId == approveBodyId && m.NodeApproveStatus != Code.EnumHelper.OAFlowNodeStatus.WithoutApproval) .Include(m => m.tbWeOAFlowNextNode) .Include(m => m.tbWeOAFlowPreviousNode); //上次申请或审批的节点,可能有可能多个分支,e.g.:2个FlowStep=2 var approveDetailNode = approveDetailList.OrderByDescending(m => m.tbWeOAFlowNextNode.FlowStep).FirstOrDefault(); //查询当前审批流程是否有并列分支,判断走哪条分支,过滤流程节点,保留一个节点 if (approveDetailNode != null) { var mulStepNo = (from m in approveDetailList group m by m.tbWeOAFlowNextNode.FlowStep into g where g.Count() > 1 select g.Key).FirstOrDefault();//??? if (mulStepNo != 0) { int step = Convert.ToInt32(mulStepNo); //查询当前审批角色对应的是哪个节点 var flowApprovalNode = db.Table <Wechat.Entity.tbWeOAFlowApprover>().Where(m => m.tbWeOAFlowNode.tbSysOAFlowType.Code == flowTypeCode && m.tbSysUser.Id == approveUser.Id && m.tbWeOAFlowNode.FlowStep == step).Select(m => m.tbWeOAFlowNode.FlowApprovalNode).FirstOrDefault(); approveDetailNode = approveDetailList.Where(m => m.tbWeOAFlowNextNode.FlowStep == step && m.tbWeOAFlowNextNode.FlowApprovalNode == flowApprovalNode).FirstOrDefault(); } } //1.发起流程 if (approveDetailNode == null) { //发起流程可能有多个分支,则产生多个detail流程实例,该分支是或者关系 var thisNextNodeList = db.Table <Wechat.Entity.tbWeOAFlowNode>().Where(m => m.tbSysOAFlowType.Code == flowTypeCode); if (!string.IsNullOrEmpty(conditionalFormula)) { thisNextNodeList = thisNextNodeList.Where(m => m.ConditionalFormula == conditionalFormula).OrderBy(m => m.FlowStep); } else { thisNextNodeList = thisNextNodeList.Where(m => m.FlowStep == 2).OrderBy(m => m.FlowStep);//正常顺序流下一个流程是2 } Wechat.Entity.tbWeOAFlowDetail tbWeOAFlowDetail = null; Sys.Entity.tbSysUser nextApproveUser = null; if (nextApproveUserId != 0) { nextApproveUser = db.Set <Sys.Entity.tbSysUser>().Find(nextApproveUserId); } var step = 0; foreach (var thisNextNode in thisNextNodeList) { if (step == thisNextNode.FlowStep || step == 0) { tbWeOAFlowDetail = new Wechat.Entity.tbWeOAFlowDetail(); tbWeOAFlowDetail.tbSysUser = approveUser; tbWeOAFlowDetail.NodeApproveStatus = Code.EnumHelper.OAFlowNodeStatus.Approved; tbWeOAFlowDetail.tbWeOAFlowType = flowType; tbWeOAFlowDetail.ApproveBodyId = approveBodyId; tbWeOAFlowDetail.ApproveDate = System.DateTime.Now; tbWeOAFlowDetail.ApproveOpinion = approveOpinion; tbWeOAFlowDetail.tbWeOAFlowPreviousNode = null;//我的申请则查询该字段为null的数据 tbWeOAFlowDetail.tbWeOAFlowNextNode = thisNextNode; tbWeOAFlowDetail.AssignNextApproveUser = nextApproveUser; db.Set <Wechat.Entity.tbWeOAFlowDetail>().Add(tbWeOAFlowDetail); } step = thisNextNode.FlowStep; } db.SaveChanges(); } //2.审批流程,流程节点链条:P1-N1-P2(N1)-N2-P3(N2)-N3 else { //执行下一个流程,**不考虑审批分支** if (approveDetailNode.tbWeOAFlowNextNode != null) { //本次审批的上一个节点 var thisPreNode = db.Table <Wechat.Entity.tbWeOAFlowNode>().Where(m => m.tbSysOAFlowType.Code == flowTypeCode && m.FlowStep == approveDetailNode.tbWeOAFlowNextNode.FlowStep).FirstOrDefault(); //检查当前审批后是否还有下一个流程,比如用车申请司机关闭流程 Wechat.Entity.tbWeOAFlowNode thisNextNode = null;//为null则流程结束 int nextNodeNo = approveDetailNode.tbWeOAFlowNextNode.FlowStep; if (approveDetailNode.tbWeOAFlowNextNode.FlowComplete == false) { nextNodeNo += 1; //本次审批的下一个节点,如果驳回则为null if (reject == false) { thisNextNode = db.Table <Wechat.Entity.tbWeOAFlowNode>().Where(m => m.tbSysOAFlowType.Code == flowTypeCode && m.FlowStep == nextNodeNo).FirstOrDefault(); } } var tbWeOAFlowDetail = new Wechat.Entity.tbWeOAFlowDetail(); tbWeOAFlowDetail.tbSysUser = approveUser; tbWeOAFlowDetail.NodeApproveStatus = reject ? Code.EnumHelper.OAFlowNodeStatus.WithoutApproval : Code.EnumHelper.OAFlowNodeStatus.Approved; tbWeOAFlowDetail.tbWeOAFlowType = flowType; tbWeOAFlowDetail.ApproveBodyId = approveBodyId; tbWeOAFlowDetail.ApproveDate = System.DateTime.Now; tbWeOAFlowDetail.ApproveOpinion = approveOpinion; tbWeOAFlowDetail.tbWeOAFlowPreviousNode = thisPreNode; tbWeOAFlowDetail.tbWeOAFlowNextNode = thisNextNode; if (nextApproveUserId != 0) { tbWeOAFlowDetail.AssignNextApproveUser = db.Set <Sys.Entity.tbSysUser>().Find(nextApproveUserId); } db.Set <Wechat.Entity.tbWeOAFlowDetail>().Add(tbWeOAFlowDetail); db.SaveChanges(); } } }