コード例 #1
0
ファイル: Attendance.cs プロジェクト: Everzhu/SystemCloud
        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);
            }
        }
コード例 #2
0
        /// <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();
                }
            }
        }