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