/// <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); }
/// <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(); } } }