Beispiel #1
0
        /// <summary>
        /// 执行工作流提交
        /// </summary>
        /// <param name="defId">工作流定义的ID</param>
        /// <param name="user">提交工作流的用户</param>
        protected virtual void DoWorkFlowBegin(string defId, ICommunicationable user)
        {
            this.WorkFlowDefinitionId = defId;

            if (!DoWorkFlowBeginBefore(defId, user))
            {
                throw new ValiDataException("当前工作流无法启动");
            }

            var defInfo = WorkFlowDefinition.GetInstance(defId);

            //获取启动步骤
            defInfo.SetUnits();//获取流程信息
            var beginStep = defInfo.GetBegin();

            if (beginStep == null)
            {
                throw new ValiDataException(string.Format("工作流[{0}]没有起点,无法启动", defInfo.Caption));
            }

            //修改工单状态
            using (var db = new DefaultContainer())
            {
                var row = db.Db_BaseWorkOrderSet.Single(p => p.Id == this.Id);
                row.WorkFlowDefinitionId = defId;
                row.OrderStatus          = (byte)WorkOrderStatus.执行中.GetHashCode();
                db.SaveChanges();
            }

            //记录到日志
            UserLog.create(string.Format("启动工作流,执行流程[{0}]", defInfo.Caption), "工作流", user, this);

            //执行
            //获取下一步
            var nextList = beginStep.GetNextLineDetails();

            if (nextList.Count > 0)
            {
                DoWorkFlowConfim(nextList.First());
            }

            DoWorkFlowBeginAfter(defId, user);
        }
Beispiel #2
0
        /// <summary>
        /// 编辑流程图结构
        /// </summary>
        /// <param name="condtion"></param>
        /// <returns></returns>
        public WorkFlowDefinition EditDefUnit(WorkFlowDefEditRequest condtion)
        {
            if (condtion.lines == null)
            {
                condtion.lines = new List <WorkFlowDefLine>();
            }
            if (condtion.areas == null)
            {
                condtion.areas = new List <WorkFlowDefArea>();
            }
            if (condtion.nodes == null)
            {
                condtion.nodes = new List <WorkFlowDefStep>();
            }

            using (var db = new DefaultContainer()) {
                //三从表 创建新增/编辑已有/删除多余

                //节点
                Dictionary <string, string> nodesComb = new Dictionary <string, string>();//ID转换
                #region -- 节点
                foreach (var item in condtion.nodes)
                {
                    var row = db.Db_WorkFlowDefBaseUnitSet.OfType <Db_WorkFlowDefStep>().SingleOrDefault(p => p.Id == item.Id);
                    if (row == null)
                    {
                        var newId = SysHelps.GetNewId();
                        nodesComb.Add(item.Id, newId);
                        var newRow = new Db_WorkFlowDefStep()
                        {
                            Id = newId,
                            Db_WorkFlowDefinitionId = this.Id,
                            Name   = item.name,
                            Type   = (int)item.type,
                            Height = item.height,
                            Width  = item.width,
                            Left   = item.left,
                            Top    = item.top
                        };
                        db.Db_WorkFlowDefBaseUnitSet.Add(newRow);
                    }
                    else
                    {
                        nodesComb.Add(item.Id, item.Id);
                        row.Name   = item.name;
                        row.Type   = (int)item.type;
                        row.Height = item.height;
                        row.Width  = item.width;
                        row.Left   = item.left;
                        row.Top    = item.top;
                    }
                }
                var delSetpRows = (from c in db.Db_WorkFlowDefBaseUnitSet.OfType <Db_WorkFlowDefStep>().AsEnumerable() where !condtion.nodes.Select(p => p.Id).Contains(c.Id) && c.Db_WorkFlowDefinitionId == this.Id select c);
                if (delSetpRows.Count() > 0)
                {
                    db.Db_WorkFlowDefBaseUnitSet.RemoveRange(delSetpRows);
                }
                #endregion

                //连线

                #region -- 连线
                foreach (var item in condtion.lines)
                {
                    var row = db.Db_WorkFlowDefLineSet.SingleOrDefault(p => p.Id == item.Id);
                    if (row == null)
                    {
                        var newRow = new Db_WorkFlowDefLine()
                        {
                            Id   = SysHelps.GetNewId(),
                            From = nodesComb[item.from],
                            To   = nodesComb[item.to],
                            M    = item.M,
                            Name = item.name,
                            Type = item.type,
                            Db_WorkFlowDefinitionId = this.Id
                        };
                        db.Db_WorkFlowDefLineSet.Add(newRow);
                    }
                    else
                    {
                        row.From = nodesComb[item.from];
                        row.To   = nodesComb[item.to];
                        row.M    = item.M;
                        row.Name = item.name;
                        row.Type = item.type;
                    }
                }
                var delLineRows = (from c in db.Db_WorkFlowDefLineSet.AsEnumerable() where !condtion.lines.Select(p => p.Id).Contains(c.Id) && c.Db_WorkFlowDefinitionId == this.Id select c);
                if (delLineRows.Count() > 0)
                {
                    db.Db_WorkFlowDefLineSet.RemoveRange(delLineRows);
                }
                #endregion

                //区域

                #region -- 区域
                foreach (var item in condtion.areas)
                {
                    var row = db.Db_WorkFlowDefBaseUnitSet.OfType <Db_WorkFlowDefArea>().SingleOrDefault(p => p.Id == item.Id);
                    if (row == null)
                    {
                        var newRow = new Db_WorkFlowDefArea()
                        {
                            Id = SysHelps.GetNewId(),
                            Db_WorkFlowDefinitionId = this.Id,
                            Name   = item.name,
                            Color  = item.color,
                            Height = item.height,
                            Width  = item.width,
                            Left   = item.left,
                            Top    = item.top
                        };
                        db.Db_WorkFlowDefBaseUnitSet.Add(newRow);
                    }
                    else
                    {
                        row.Name   = item.name;
                        row.Color  = item.color;
                        row.Height = item.height;
                        row.Width  = item.width;
                        row.Left   = item.left;
                        row.Top    = item.top;
                    }
                }
                var delAreaRows = (from c in db.Db_WorkFlowDefBaseUnitSet.OfType <Db_WorkFlowDefArea>().AsEnumerable() where !condtion.areas.Select(p => p.Id).Contains(c.Id) && c.Db_WorkFlowDefinitionId == this.Id select c);
                if (delAreaRows.Count() > 0)
                {
                    db.Db_WorkFlowDefBaseUnitSet.RemoveRange(delAreaRows);
                }

                #endregion

                db.SaveChanges();
            }

            var info = WorkFlowDefinition.GetInstance(this.Id);
            info.SetUnits();
            return(info);
        }