示例#1
0
        /// <summary>
        /// 流程图
        /// </summary>
        /// <param name="db"></param>
        /// <param name="flowTypeCode"></param>
        /// <param name="approveBodyId"></param>
        /// <returns></returns>
        public static IEnumerable <Wechat.Entity.tbWeOAFlowDetail> GetWorkFlowList(XkSystem.Models.DbContext db, string flowTypeCode, int approveBodyId)
        {
            var approveList = db.Table <Wechat.Entity.tbWeOAFlowDetail>().Where(m => m.ApproveBodyId == approveBodyId && m.tbWeOAFlowType.Code == flowTypeCode).Include(m => m.tbSysUser).Include(m => m.tbWeOAFlowPreviousNode).Include(m => m.tbWeOAFlowNextNode).OrderBy(m => m.ApproveDate).ToList();
            var startFlows  = approveList.Where(m => m.tbWeOAFlowPreviousNode == null).ToList();

            //拼接未审批的流程
            List <Wechat.Entity.tbWeOAFlowDetail> otherDetail = new List <Wechat.Entity.tbWeOAFlowDetail>();
            var maxNode = approveList.OrderByDescending(m => m.ApproveDate).FirstOrDefault();

            if (maxNode.tbWeOAFlowNextNode != null)
            {
                List <Wechat.Entity.tbWeOAFlowNode> otherNodes = new List <tbWeOAFlowNode>();
                otherNodes = db.Table <Wechat.Entity.tbWeOAFlowNode>().Where(m => m.tbSysOAFlowType.Code == flowTypeCode && m.FlowStep > maxNode.tbWeOAFlowNextNode.FlowStep).OrderBy(m => m.FlowStep).ToList();

                Wechat.Entity.tbWeOAFlowDetail detail      = null;
                Wechat.Entity.tbWeOAFlowNode   tempPreNode = null;
                for (int i = 0; i <= otherNodes.Count(); i++)
                {
                    detail = new Wechat.Entity.tbWeOAFlowDetail();
                    detail.ApproveBodyId          = approveBodyId;
                    detail.tbWeOAFlowPreviousNode = i == 0 ? maxNode.tbWeOAFlowNextNode : tempPreNode;
                    if (i == otherNodes.Count())
                    {
                        detail.tbWeOAFlowNextNode = null;
                        tempPreNode = null;
                    }
                    else
                    {
                        detail.tbWeOAFlowNextNode = otherNodes[i];
                        tempPreNode = otherNodes[i];
                    }

                    otherDetail.Add(detail);
                }
                approveList = approveList.Concat(otherDetail).ToList();
            }

            //有2个分支,重构流程链
            if (startFlows.Count > 1)
            {
                approveList[2].tbWeOAFlowPreviousNode = startFlows[1].tbWeOAFlowNextNode;
                approveList[1].tbWeOAFlowPreviousNode = startFlows[0].tbWeOAFlowNextNode;
                approveList[1].tbSysUser = null;
            }
            return(approveList);
        }
示例#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();
                }
            }
        }