コード例 #1
0
        public bool IsFinished(WorkFlowBag workFlowBag)
        {
            var endNodeId = FindEndNodeId(workFlowBag.Instance.WorkFlowID, workFlowBag.Instance.WorkFlow.StartNodeID);
            var old       = Find(workFlowBag.Instance.WorkFlowInstanceID);

            return(old.CurrentNodeID == endNodeId);
        }
コード例 #2
0
        public WorkFlowBag CreateInstance(string workFlowId, string uid, string unitId)
        {
            var workFlow = Db.WorkFlow.Find(workFlowId);

            if (workFlow == null)
            {
                throw new Exception("不存在该工作流!workFlowId=>" + workFlowId);
            }

            var model = new WorkFlowInstance()
            {
                CreateTime         = DateTime.Now,
                CurrentNodeID      = workFlow.StartNodeID,
                Note               = Note(uid, "创建工作流实例"),
                WorkFlowID         = workFlowId,
                WorkFlowInstanceID = workFlowId + "-" + uid + "-" + DateTime.Now.Random(),
                InstancePeople     = uid,
                UnitID             = unitId
            };

            Db.WorkFlowInstance.Add(model);
            //创建转移日志
            Db.CreateInstanceChangeLog(model, "1", uid, "激活" + model.WorkFlow.Name + "实例");
            if (Db.SaveChanges() > 0)
            {
                var result = new WorkFlowBag(model);
                return(result);
            }
            else
            {
                throw new Exception("工作流实例化失败!");
            }
        }
コード例 #3
0
        //强制移动
        //private MoveResult _MoveNext(WorkFlowBag workFlowBag, string nextNodeId, string operatorId, string reason, RelationMoveParam relation)
        //{
        //    var currentId = workFlowBag.Instance.CurrentNodeID;
        //    var result = ChoosePath(currentId, nextNodeId);

        //    return __MoveNext(workFlowBag, result, operatorId, reason, relation);
        //}
        public bool DeleteInstance(WorkFlowBag workFlowBag, string operatorId, string reason = "未填写")
        {
            var old = Find(workFlowBag.Instance.WorkFlowInstanceID);

            Db.Entry(old).State = EntityState.Deleted;
            //记录转移日志
            Db.CreateInstanceHistory(old, "3", Note(operatorId, reason));
            return(Db.Saved());
        }
コード例 #4
0
        public static List <WorkFlowPath> NextStepInfo(this WorkFlowBag bag)
        {
            var Db = new MyDbContext();

            return(Db.NodeRelation.Where(a => a.NodeID == bag.Instance.CurrentNodeID).
                   SelectMany(z => z.ConvertCondition).
                   ToList().
                   GroupBy(a => a.NodeRelationID).
                   Select(g =>
                          new WorkFlowPath(g.Key, g.AsEnumerable().ToList())).ToList());
        }
コード例 #5
0
        public bool AbortInstance(WorkFlowBag workFlowBag, string operatorId, string reason)
        {
            var instanceId = workFlowBag.Instance.WorkFlowInstanceID;
            var old        = Find(instanceId);
            var note       = Note(operatorId, reason);

            //记录转移日志
            Db.CreateInstanceChangeLog(old, "4", operatorId, reason);
            //记录实例日志
            Db.CreateInstanceHistory(old, "2", old.Note + "\n" + note);
            //删除实例
            Db.WorkFlowInstance.Remove(old);
            return(Db.Saved());
        }
コード例 #6
0
        private MoveResult __MoveNext(WorkFlowBag workFlowBag, MoveResult result,
                                      string operatorId, string reason)
        {
            //移动到下一节点
            if (result.Successful)
            {
                workFlowBag.MoveToNext(Db, result.ToNodeId, operatorId, reason,
                                       FindEndNodeId(workFlowBag.Instance.WorkFlowID,
                                                     workFlowBag.Instance.WorkFlow.StartNodeID));

                result.SucessMsgs.Add("已成功转移到下一状态");
            }
            else
            {
                result.SucessMsgs.Add("转移到下一状态失败");
            }
            return(result);
        }
コード例 #7
0
        //自动移动
        private MoveResult _MoveNext(WorkFlowBag workFlowBag, object moveParam, string operatorId, string reason, RelationMoveParam relation)
        {
            var currentId = workFlowBag.Instance.CurrentNodeID;
            var allPath   = Db.NodeRelation.NoTrackingWhere(a => a.NodeID == currentId);
            var result    = ChoosePath(allPath, moveParam);
            //移动主流程
            var moveResult = __MoveNext(workFlowBag, result, operatorId, reason);

            //移动相关节点(子流程)
            if (moveResult.Successful && relation != null)
            {
                for (var i = 0; i < relation.WorkFlowParam.Count; i++)
                {
                    var item = relation.WorkFlowParam[i];
                    //循环递归移动
                    moveResult.AddRelationMoveResult(_MoveNext(FindInstance(item.WorkFlowInstanceId), relation.GetMoveParam(i), relation.GetOperatorId(i),
                                                               relation.GetReason(i), relation.GetRelaton(i)));
                }
            }
            return(moveResult);
        }
コード例 #8
0
        public static MyDbContext MoveToNext(this WorkFlowBag bag, MyDbContext db, string nextNodeId,
                                             string operatorId, string reason, string endNodeId)
        {
            //创建转移日志
            db.CreateInstanceChangeLog(bag.Instance, "3", operatorId, reason, nextNodeId);
            bag.Move(nextNodeId);
            db.WorkFlowInstance.AddOrUpdate(bag.Instance);
            var isFinish = endNodeId == bag.Instance.CurrentNodeID;

            //如果为结束节点
            if (isFinish)
            {
                //记录实例日志
                db.CreateInstanceHistory(bag.Instance, "2", bag.Instance.Note + "\n" + DateTime.Now + "流程已结束");
                //创建转移日志
                db.CreateInstanceChangeLog(bag.Instance, "2", "system", "[sytem]流程自动结束", null);
                //删除示例
                db.WorkFlowInstance.Remove(db.WorkFlowInstance.Find(bag.Instance.WorkFlowInstanceID));
            }

            return(db);
        }