Ejemplo n.º 1
0
        public static WorkFlowItem ToDomain(this WorkFlowItemDto item, WorkFlowItem originalItem = null)
        {
            if (originalItem != null && originalItem.Id == item.Id)
            {
                originalItem.Json       = JsonConvert.SerializeObject(item.Obj);
                originalItem.Type       = item.Type.Replace("Dto", "");
                originalItem.ParentType = item.ParentType.Replace("Dto", "");
                originalItem.ParentId   = item.ParentId;
                originalItem.API        = item.API;
                originalItem.ObjId      = item.ObjId;
                originalItem.ApprovalStatus
                    = (ApprovalStatus)Enum.Parse(typeof(ApprovalStatus), item.ApprovalStatus.ToString(), true);

                ((IDataDto)item).ToDomain((IData)originalItem);
                return(originalItem);
            }

            var data = new WorkFlowItem
            {
                Json       = JsonConvert.SerializeObject(item.Obj),
                Type       = item.Type.Replace("Dto", ""),
                ParentType = item.ParentType.Replace("Dto", ""),
                ParentId   = item.ParentId,
                API        = item.API,
                ObjId      = item.ObjId,
                ApprovalStatus
                    = (ApprovalStatus)Enum.Parse(typeof(ApprovalStatus), item.ApprovalStatus.ToString(), true)
            };

            ((IDataDto)item).ToDomain((IData)data);
            return(data);
        }
Ejemplo n.º 2
0
        public async Task <List <WorkFlowItem> > GetAllWorkflows(string teamName)
        {
            List <KeyValue>     metaData     = new List <KeyValue>();
            List <WorkFlowItem> workFlowList = new List <WorkFlowItem>();

            JArray result =
                await
                InvokeAsync <JArray>(string.Format(Constants.GET_ALL_TEAM_WORKFLOWS, teamName),
                                     Constants.HttpMethod.GET, metaData)
                .ConfigureAwait(false);

            if (result?.Count > 0)
            {
                List <string> connectorNames = new List <string>();
                foreach (var wkf in result)
                {
                    JObject      wItem = wkf as JObject;
                    WorkFlowItem item  = new WorkFlowItem()
                    {
                        Name        = wItem?["Name"].Value <string>(),
                        Description = wItem?["Description"].Value <string>(),
                        Expression  = GetExpression(wItem?["Expression"] as JObject, connectorNames),
                    };
                    workFlowList.Add(item);
                }
            }

            return(workFlowList);
        }
Ejemplo n.º 3
0
        private void Edit(WorkFlowItem item)
        {
            WorkflowEditorView wnd = new WorkflowEditorView();

            ((WorkflowEditorViewModel)wnd.DataContext).LoadXml(item.File);
            wnd.ShowDialog();
            LoadWorkFlows();
        }
Ejemplo n.º 4
0
        private void LoadWorkFlows()
        {
            WorkFlows = new AsyncObservableCollection <WorkFlowItem>();
            try
            {
                if (!Directory.Exists(Settings.Instance.WorkflowFolder))
                {
                    Directory.CreateDirectory(Settings.Instance.WorkflowFolder);
                }
            }
            catch (Exception e)
            {
                Log.Error("Unable to create workflow folder");
            }

            var files = Directory.GetFiles(Settings.Instance.WorkflowFolder, "*.cwpkg");

            foreach (var file in files)
            {
                try
                {
                    WorkFlowItem item = new WorkFlowItem()
                    {
                        Workflow   = WorkflowManager.Instance.LoadFromPackage(file),
                        IsEditable = false,
                        IsPackage  = true,
                        File       = file
                    };
                    WorkFlows.Add(item);
                }
                catch (Exception e)
                {
                    Log.Debug("Unable to load package" + file, e);
                }
            }

            files = Directory.GetFiles(Settings.Instance.WorkflowFolder, "*.cwxml");
            foreach (var file in files)
            {
                var fileName = Path.GetFileName(file);
                try
                {
                    WorkFlowItem item = new WorkFlowItem()
                    {
                        Workflow     = WorkflowManager.Instance.Load(file),
                        IsEditable   = true,
                        IsPackage    = false,
                        File         = file,
                        IsRevertable = File.Exists(Path.Combine(Settings.Instance.DefaultWorkflowFolder, fileName))
                    };
                    WorkFlows.Add(item);
                }
                catch (Exception e)
                {
                    Log.Debug("Unable to load package" + file, e);
                }
            }
        }
        private void Copy(WorkFlowItem obj)
        {
            var workflow = obj.Workflow;

            workflow.Name = workflow.Name + " Copy";
            workflow.Id   = Guid.NewGuid().ToString();
            WorkflowManager.Instance.Save(workflow,
                                          Path.Combine(Settings.Instance.WorkflowFolder, workflow.Id + ".cwxml"));
            LoadWorkFlows();
        }
Ejemplo n.º 6
0
        public static WorkFlowItem GetHeadName()
        {
            WorkFlowItem i = new WorkFlowItem();

            i.CaseCode    = "流水号";
            i.ProjectName = "项目简称";
            i.FlowName    = "流程名称";
            i.TaskName    = "任务";
            i.Title       = "主题";
            i.FromUser    = "******";
            i.FromDate    = "发件时间";
            i.Url         = "链接地址";
            return(i);
        }
Ejemplo n.º 7
0
 public WorkFlowItem[] GetAllCase(string type)
 {
     if (Session["User"] == null)
     {
         WorkFlowItem[] items = new WorkFlowItem[2];
         items[0]       = WorkFlowItem.GetHeadName();
         items[1]       = new WorkFlowItem();
         items[1].Title = "未登录,不能取得流程清单";
         return(items);
     }
     if (type == string.Empty)
     {
         type = "Begin";
     }
     return(LoadWorkFlowList(((RmsPM.Web.User)Session["User"]).UserCode, type));
 }
Ejemplo n.º 8
0
        private void Run(WorkFlowItem obj)
        {
            var workFlow = obj.IsPackage
                ? WorkflowManager.Instance.LoadFromPackage(obj.File)
                : WorkflowManager.Instance.Load(obj.File);

            if (workFlow.Views.Count == 0)
            {
                MessageBox.Show("No view(s) are defined !");
                return;
            }
            WorkflowManager.Instance.Context.WorkFlow = workFlow;
            WorkflowViewView wnd = new WorkflowViewView();

            wnd.ShowDialog();
        }
Ejemplo n.º 9
0
        public JObject GetPossiblePath(Guid id, string libID)                     //审批用户获取下一步可能的路径
        {
            WorkFlowItem        cwfi  = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault();
            ItServiceItem       cisi  = bdb.ItServiceItems.Where(i => i.ID == cwfi.WfBusinessId).FirstOrDefault();
            WorkflowApplication wfApp = new WorkflowApplication(new ItService())
            {
                InstanceStore   = CreateInstanceStore(),
                PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
                {
                    //var ex = e.GetInstanceExtensions<CustomTrackingParticipant>();
                    // Outputs = ex.First().Outputs.ToString();
                    return(PersistableIdleAction.Unload);
                },
                Completed = delegate(WorkflowApplicationCompletedEventArgs e)
                {
                },
                Aborted = delegate(WorkflowApplicationAbortedEventArgs e)
                {
                },
                Unloaded = delegate(WorkflowApplicationEventArgs e)
                {
                },
                OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
                {
                    return(UnhandledExceptionAction.Terminate);
                },
                Idle = delegate(WorkflowApplicationIdleEventArgs e)
                {
                }
            };
            var trackerInstance = StateMachineStateTracker.LoadInstance(id, wfApp.WorkflowDefinition, ConfigurationManager.ConnectionStrings["ApacheConnection"].ConnectionString);

            //var Pt = trackerInstance.PossibleTransitions;
            var Pt = GetPossibleTransitions(libID, false, cisi.Status);

            //BookmarkResumptionResult result = wfApp.ResumeBookmark("Hello123", "ddd");
            string[] strs = Pt.Split(',');
            JObject  json = new JObject(
                new JProperty("rows",
                              new JArray(
                                  from r in strs
                                  select new JObject(
                                      new JProperty("ID", r.ToString()),
                                      new JProperty("Name", r.ToString())))));

            return(json);
        }
Ejemplo n.º 10
0
    private WorkFlowItem[] LoadWorkFlowList(string usercode, string type)
    {
        try
        {
            string     sql    = BuildWorkFlowSqlString(usercode, type);
            QueryAgent qa     = new QueryAgent();
            EntityData entity = qa.FillEntityData("WorkFlowAct", sql);
            qa.Dispose();

            DataTable      dt       = entity.CurrentTable;
            int            rowcount = dt.Rows.Count;
            WorkFlowItem[] list     = new WorkFlowItem[rowcount + 1];
            list[0] = WorkFlowItem.GetHeadName();


            for (int i = 1; i <= rowcount; i++)
            {
                DataRow dr = dt.Rows[i - 1];
                list[i]             = new WorkFlowItem();
                list[i].CaseCode    = RmsPM.BLL.WorkFlowRule.GetWorkFlowNumber(dr["CaseCode"].ToString());                      //流水号
                list[i].ProjectName = RmsPM.BLL.WorkFlowRule.GetWorkFlowCaseProjectName(dr["CaseCode"].ToString());             //项目简称
                list[i].FlowName    = dr["ProcedureName"].ToString();                                                           //流程名称
                list[i].TaskName    = dr["ToTaskName"].ToString();                                                              //任务
                list[i].Title       = RmsPM.BLL.WorkFlowRule.GetWorkFlowCaseTitle(dr["CaseCode"].ToString());                   //主题
                list[i].FromUser    = RmsPM.BLL.SystemRule.GetUserName(dr["FromUserCode"].ToString());                          //发件人
                list[i].FromDate    = RmsPM.BLL.WorkFlowRule.GetFormatExcedableDate(DateTime.Parse(dr["FromDate"].ToString())); //发件时间
                string url = dr["ApplicationPath"].ToString() + "?action=Sign";
                url        += "&CaseCode=" + list[i].CaseCode;
                url        += "&ActCode=" + dr["ActCode"].ToString();
                url        += "&ApplicationCode=" + dr["ApplicationCode"].ToString();
                list[i].Url = url;
            }

            entity.Dispose();
            return(list);
        }
        catch (Exception ex)
        {
            WorkFlowItem[] items = new WorkFlowItem[2];
            items[0]       = WorkFlowItem.GetHeadName();
            items[1]       = new WorkFlowItem();
            items[1].Title = "出现异常,不能取得流程清单";

            return(items);
        }
    }
Ejemplo n.º 11
0
 private void Revert(WorkFlowItem obj)
 {
     if (!obj.IsRevertable)
     {
         return;
     }
     try
     {
         var file = Path.GetFileName(obj.File);
         File.Copy(Path.Combine(Settings.Instance.DefaultWorkflowFolder, file), obj.File, true);
     }
     catch (Exception e)
     {
         Log.Debug("Unable to revert", e);
         MessageBox.Show("Unable to revert workflow.");
     }
     LoadWorkFlows();
 }
Ejemplo n.º 12
0
        /// <summary>
        /// 创建第一个任务
        /// </summary>
        /// <param name="task">当前任务Dto</param>
        /// <returns>业务操作结果</returns>
        protected OperationResult CreateFirstTask(FlowExecuteDto task)
        {
            OperationResult re = CheckFlow(task.FlowId, task.EntityId);

            if (re.ResultType == OperationResultType.Success)
            {
                var          firstStep  = FlowStepRepository.Entities.Where(c => c.FlowDesignId == task.FlowId && c.StepType == 0).Select(m => new { m.StepId, m.StepName }).SingleOrDefault(); //起始步骤
                var          flowItemId = CombHelper.NewComb();
                var          id         = CombHelper.NewComb();
                WorkFlowTask taskModel  = new WorkFlowTask()
                {
                    Id           = id,
                    FlowItemId   = flowItemId,
                    PrevStepId   = -1,
                    StepId       = firstStep.StepId,
                    StepName     = firstStep.StepName,
                    SenderId     = task.SenderId,
                    SenderName   = task.SenderName,
                    ReceiverId   = task.SenderId,
                    ReceiverName = task.SenderName,
                    CreatedTime  = DateTime.Now,
                    IsComment    = false,
                    IsSeal       = false,
                    IsArchive    = false,
                    Status       = 1
                };
                var model = new WorkFlowItem()
                {
                    Id              = flowItemId,
                    FlowDesignId    = task.FlowId,
                    EntityId        = task.EntityId,
                    EntityName      = task.Title,
                    CreatorUserId   = task.SenderId,
                    CreatorUserName = task.SenderName,
                    //StepDay,DelayDay,HandleDay 用触发器保证数据正确性
                    Status = 0
                };
                model.Tasks.Add(taskModel);
                FlowItemRepository.Insert(model);
                re = new OperationResult(OperationResultType.Success, "流程启动成功!");
                //re.Data = taskModel;
            }
            return(re);
        }
Ejemplo n.º 13
0
        public async Task <WorkFlowItem> GetWorkflow(string teamName, string workFlowName)
        {
            List <KeyValue> metaData     = new List <KeyValue>();
            WorkFlowItem    workFlowItem = null;
            JObject         result       =
                await
                InvokeAsync <JObject>(string.Format(Constants.GET_TEAM_WORKFLOW, teamName, workFlowName),
                                      Constants.HttpMethod.GET, metaData)
                .ConfigureAwait(false);

            if (result != null)
            {
                List <string> connectorNames = new List <string>();
                workFlowItem = new WorkFlowItem()
                {
                    Name        = result?["Name"].Value <string>(),
                    Description = result?["Description"].Value <string>(),
                    Expression  = GetExpression(result?["Expression"] as JObject, connectorNames),
                };
            }
            return(workFlowItem);
        }
        private void Run(WorkFlowItem obj)
        {
            var workFlow = obj.IsPackage
                ? WorkflowManager.Instance.LoadFromPackage(obj.File)
                : WorkflowManager.Instance.Load(obj.File);

            if (File.Exists(Path.Combine(Settings.Instance.DefaultWorkflowFolder, Path.GetFileName(obj.File))))
            {
                var defFile     = Path.Combine(Settings.Instance.DefaultWorkflowFolder, Path.GetFileName(obj.File));
                var defWorkflow = obj.IsPackage
                    ? WorkflowManager.Instance.LoadFromPackage(defFile)
                    : WorkflowManager.Instance.Load(defFile);

                if (defWorkflow.GetVersion() > workFlow.GetVersion())
                {
                    if (MessageBox.Show("New version is available do  you want update the workflow ?", "Warning",
                                        MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                    {
                        Revert(obj);
                        workFlow = obj.IsPackage
                            ? WorkflowManager.Instance.LoadFromPackage(obj.File)
                            : WorkflowManager.Instance.Load(obj.File);
                    }
                }
            }

            if (workFlow.Views.Count == 0)
            {
                MessageBox.Show("No view(s) are defined !");
                return;
            }
            ServiceProvider.Instance.DeviceManager.PhotoCaptured -= DeviceManager_PhotoCaptured;
            WorkflowManager.Instance.Context.WorkFlow             = workFlow;
            WorkflowViewView wnd = new WorkflowViewView();

            wnd.ShowDialog();
            WorkflowManager.Instance.Context.Clear();
            ServiceProvider.Instance.DeviceManager.PhotoCaptured += DeviceManager_PhotoCaptured;
        }
Ejemplo n.º 15
0
        //Add Data From Linked Tables for Display
        public void EditItemForDisplay(WorkFlowItem workFlowItem)
        {
            //Add Form INfo
            FormRepository formRepository = new FormRepository();
            Form           form           = new Form();

            form = formRepository.GetForm(workFlowItem.FormId);
            if (form != null)
            {
                workFlowItem.FormName = form.FormName;
            }

            //Add PolicyGroupName
            WorkFlowGroupRepository workFlowGroupRepository = new WorkFlowGroupRepository();
            WorkFlowGroup           workFlowGroup           = new WorkFlowGroup();

            workFlowGroup = workFlowGroupRepository.GetGroup(workFlowItem.WorkFlowGroupId);
            if (workFlowGroup != null)
            {
                workFlowItem.WorkFlowGroupName = workFlowGroup.WorkFlowGroupName;
            }
        }
Ejemplo n.º 16
0
 public static WorkFlowItemDto ToDto(this WorkFlowItem item)
 {
     try
     {
         var dto = new WorkFlowItemDto
         {
             Obj        = JsonConvert.DeserializeObject(item.Json, System.Type.GetType(item.Type + "Dto")),
             Type       = item.Type.Insert(item.Type.Length, "Dto"),
             ParentType = item.ParentType?.Insert(item.ParentType.Length, "Dto"),
             ParentId   = item.ParentId,
             API        = item.API,
             ObjId      = item.ObjId,
             ApprovalStatus
                 = (ApprovalStatusDto)Enum.Parse(typeof(ApprovalStatusDto), item.ApprovalStatus.ToString(), true)
         };
         ((IData)item).ToDto((IDataDto)dto);
         return(dto);
     }
     catch (Exception ex)
     {
         return(null);
     }
 }
 private void Revert(WorkFlowItem obj)
 {
     if (!obj.IsRevertable)
     {
         return;
     }
     if (MessageBox.Show("If you made any changes, all changes will be reverted !!!\nContinue ?", "Warning",
                         MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes)
     {
         return;
     }
     try
     {
         var file = Path.GetFileName(obj.File);
         File.Copy(Path.Combine(Settings.Instance.DefaultWorkflowFolder, file), obj.File, true);
     }
     catch (Exception e)
     {
         Log.Debug("Unable to revert", e);
         MessageBox.Show("Unable to revert workflow.");
     }
     LoadWorkFlows();
 }
Ejemplo n.º 18
0
        public ActionResult OpenWorkFlow(Guid id)         //用户处理流程
        {
            #region 判断是不是当前处理人
            WorkFlowItem    cwfi          = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault();
            string          currentUserId = User.Identity.GetUserId();
            ApplicationUser user          = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.Id == currentUserId);
            if (cwfi.WfCurrentUser.ToString().Trim() != user.UserName.ToString().Trim())
            {
                var json = new
                {
                    errorMsg = "你不是当前处理人"
                };

                return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
            }
            #endregion
            var wf  = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault();
            var bid = wf.WfBusinessId;
            ViewBag.WfWriteField = wf.WfWriteField;
            ViewBag.WfFlowChart  = wf.WfFlowChart;
            ViewBag.instanceId   = wf.WfInstanceId;
            ItServiceItem isi = bdb.ItServiceItems.Where(i => i.ID == bid).FirstOrDefault();
            return(View(isi));
        }
Ejemplo n.º 19
0
        private void ParseWFItem(XmlNode hNode)
        {
            WorkFlowItem wfi = new WorkFlowItem();

            foreach (XmlAttribute attrib in hNode.Attributes)
            {
                switch (attrib.Name)
                {
                case "name":
                    wfi.itemName = attrib.Value;
                    break;

                case "out-name":
                    wfi.outItemName = attrib.Value;
                    break;

                case "type":
                    wfi.wfiType = attrib.Value;
                    break;

                case "alt-out-name":
                    wfi.altOutItemName = attrib.Value;
                    break;

                case "comparator":
                    wfi.comparator = attrib.Value;
                    break;

                case "script-module":
                    wfi.scriptModule = attrib.Value;
                    break;

                case "throw-bind-name":
                    wfi.throwBindName = attrib.Value;
                    break;

                case "catch-name":
                    wfi.catchName = attrib.Value;
                    break;

                case "end-mode":
                    wfi.endMode = attrib.Value;
                    break;

                default:
                    Log("New WFI Attrib : {0} = {1}", attrib.Name, attrib.Value);
                    break;
                }
            }
            foreach (XmlNode node in hNode.ChildNodes)
            {
                switch (node.Name)
                {
                case "display-name":
                    wfi.displayName = node.InnerText;
                    break;

                case "script":
                    wfi.lines = node.InnerText.Split(new String[] { Environment.NewLine }, StringSplitOptions.None);
                    break;

                case "in-binding":
                    foreach (XmlNode bNode in node.ChildNodes)
                    {
                        if (bNode.Name == "bind")
                        {
                            String bindName  = "";
                            String bindType  = "";
                            String bindEName = "";
                            foreach (XmlAttribute bAttr in bNode.Attributes)
                            {
                                switch (bAttr.Name)
                                {
                                case "name":
                                    bindName = bAttr.Value;
                                    break;

                                case "type":
                                    bindType = bAttr.Value;
                                    break;

                                case "export-name":
                                    bindEName = bAttr.Value;
                                    break;
                                }
                            }
                            if (inputs.ContainsKey(bindEName))
                            {
                                wfi.inputs.Add(bindName, inputs[bindEName]);
                            }
                            else if (attribs.ContainsKey(bindEName))
                            {
                                wfi.inputs.Add(bindName, attribs[bindEName]);
                            }
                        }
                    }
                    break;

                case "out-binding":
                    foreach (XmlNode bNode in node.ChildNodes)
                    {
                        if (bNode.Name == "bind")
                        {
                            String bindName  = "";
                            String bindType  = "";
                            String bindEName = "";
                            foreach (XmlAttribute bAttr in bNode.Attributes)
                            {
                                switch (bAttr.Name)
                                {
                                case "name":
                                    bindName = bAttr.Value;
                                    break;

                                case "type":
                                    bindType = bAttr.Value;
                                    break;

                                case "export-name":
                                    bindEName = bAttr.Value;
                                    break;
                                }
                            }
                            if (inputs.ContainsKey(bindEName))
                            {
                                wfi.outputs.Add(bindName, inputs[bindEName]);
                            }
                            else if (attribs.ContainsKey(bindEName))
                            {
                                wfi.outputs.Add(bindName, attribs[bindEName]);
                            }
                        }
                    }
                    break;
                }
            }
            String keyname = wfi.displayName + ":" + wfi.itemName;

            workitems.Add(wfi.itemName, wfi);
            itemKeys.Add(keyname, wfi.itemName);
        }
        public async Task <IActionResult> UpdateWorkFlowItem([FromBody] WorkFlowItemEditModel model)
        {
            var mapping = new Func <WorkFlow, Task <WorkFlow> >(async(entity) =>
            {
                var workFlowItems = entity.WorkFlowItems != null ? entity.WorkFlowItems : new List <WorkFlowItem>();

                var destGradeIndex   = model.FlowGrade;                                                                                 //目的index
                var originGradeIndex = !string.IsNullOrWhiteSpace(model.Id) ? workFlowItems.First(x => x.Id == model.Id).FlowGrade : 0; //原index

                if (!string.IsNullOrWhiteSpace(model.Id))
                {
                    for (var idx = workFlowItems.Count - 1; idx >= 0; idx--)
                    {
                        var curItem = workFlowItems[idx];

                        if (destGradeIndex < originGradeIndex)
                        {
                            //上移

                            /*
                             * 1)自己本身变成destIndex
                             * 2)原items中,大于等于destIndex且小于自己originIndex都加1
                             */
                            if (curItem.FlowGrade >= destGradeIndex && curItem.FlowGrade < originGradeIndex)
                            {
                                curItem.FlowGrade += 1;
                            }
                        }
                        else if (destGradeIndex > originGradeIndex)
                        {
                            //下移

                            /*
                             * 1)自己本身变成destIndex
                             * 2)原items中,大于originIndex且小于等于destIndex都减1
                             */
                            if (curItem.FlowGrade > originGradeIndex && curItem.FlowGrade <= destGradeIndex)
                            {
                                curItem.FlowGrade -= 1;
                            }
                        }
                        else
                        {
                        }

                        //以上提到的自己本身index变为destIndex
                        if (curItem.Id == model.Id)
                        {
                            curItem.Name          = model.Name;
                            curItem.Description   = model.Description;
                            curItem.OperateRoles  = model.OperateRoles;
                            curItem.AutoWorkFlow  = model.AutoWorkFlow;
                            curItem.FlowGrade     = destGradeIndex;
                            curItem.SubWorkFlowId = model.SubWorkFlowId;
                            curItem.Modifier      = CurrentAccountId;
                            curItem.ModifiedTime  = DateTime.Now;
                        }
                    }
                }
                else
                {
                    var newFlowItem           = new WorkFlowItem();
                    newFlowItem.Id            = GuidGen.NewGUID();
                    newFlowItem.Name          = model.Name;
                    newFlowItem.Description   = model.Description;
                    newFlowItem.OperateRoles  = model.OperateRoles;
                    newFlowItem.AutoWorkFlow  = model.AutoWorkFlow;
                    newFlowItem.FlowGrade     = workFlowItems.Count;
                    newFlowItem.SubWorkFlowId = model.SubWorkFlowId;
                    newFlowItem.Creator       = CurrentAccountId;
                    newFlowItem.Modifier      = CurrentAccountId;
                    newFlowItem.CreatedTime   = DateTime.Now;
                    newFlowItem.ModifiedTime  = newFlowItem.CreatedTime;
                    newFlowItem.WorkFlow      = entity;
                    workFlowItems.Add(newFlowItem);
                }

                entity.WorkFlowItems = workFlowItems;
                entity.Modifier      = CurrentAccountId;
                entity.ModifiedTime  = DateTime.Now;
                return(await Task.FromResult(entity));
            });

            return(await _PutRequest(model.WorkFlowId, mapping, async (data) =>
            {
                return await Get(data.Id);
            }));
        }
Ejemplo n.º 21
0
        /// <summary>
        /// 创建第一个任务
        /// </summary>
        /// <param name="task">当前任务Dto</param>
        /// <returns>业务操作结果</returns>
        protected OperationResult CreateFirstTask(FlowExecuteDto task)
        {
            OperationResult re = CheckFlow(task.FlowId, task.EntityId);
            if (re.ResultType == OperationResultType.Success)
            {
                var firstStep = FlowStepRepository.Entities.Where(c => c.FlowDesignId == task.FlowId && c.StepType == 0).Select(m => new { m.StepId,m.StepName}).SingleOrDefault();    //起始步骤
                var flowItemId = CombHelper.NewComb();
                var id = CombHelper.NewComb();
                WorkFlowTask taskModel = new WorkFlowTask()
                {
                    Id = id,
                    FlowItemId = flowItemId,
                    PrevStepId = -1,
                    StepId = firstStep.StepId,
                    StepName = firstStep.StepName,
                    SenderId = task.SenderId,
                    SenderName=task.SenderName,
                    ReceiverId = task.SenderId,
                    ReceiverName = task.SenderName,
                    CreatedTime=DateTime.Now,
                    IsComment = false,
                    IsSeal = false,
                    IsArchive=false,
                    Status = 1
                };
                var model = new WorkFlowItem()
                {
                    Id = flowItemId,
                    FlowDesignId = task.FlowId,
                    EntityId = task.EntityId,
                    EntityName = task.Title,
                    CreatorUserId = task.SenderId,
                    CreatorUserName=task.SenderName,
                    //StepDay,DelayDay,HandleDay 用触发器保证数据正确性
                    Status = 0
                };
                model.Tasks.Add(taskModel);
                FlowItemRepository.Insert(model);
                re = new OperationResult(OperationResultType.Success, "流程启动成功!");
                //re.Data = taskModel;

            }
            return re;
        }
Ejemplo n.º 22
0
        public ActionResult DelWorkFlow(Guid id)          //删除流程及业务数据
        {
            if (id != null)
            {
                WorkFlowItem  wf  = bdb.WorkFlowItems.Where(i => i.WfInstanceId == id).FirstOrDefault();
                var           bid = wf.WfBusinessId;
                ItServiceItem isi = bdb.ItServiceItems.Where(i => i.ID == bid).FirstOrDefault();

                if (wf != null && isi != null)
                {
                    if (wf.Wfstatus != "已结束")
                    {
                        bdb.WorkFlowItems.Remove(wf);
                        bdb.ItServiceItems.Remove(isi);
                        try
                        {
                            bdb.SaveChanges();
                            var json = new
                            {
                                okMsg = "删除成功"
                            };

                            return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
                        }
                        catch
                        {
                            var json = new
                            {
                                errorMsg = "由于数据库或系统原因,删除流程失败"
                            };

                            return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
                        }
                    }
                    else
                    {
                        var json = new
                        {
                            okMsg = "已结束流程不能删除"
                        };

                        return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
                    }
                }
                else
                {
                    var json = new
                    {
                        okMsg = "未找到相关流程和业务数据"
                    };

                    return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
                }
            }
            else
            {
                var json = new
                {
                    okMsg = "数据输入有误"
                };

                return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
            }
        }
Ejemplo n.º 23
0
        public ActionResult ToNextState(ItServiceItem isi, Guid instanceId, string NextLink, string libid, string Opinion)  //审批者到下一环节,思路:保存当前流程的数据,恢复bookmark到下一环节,并保存下一环节流程信息
        {
            #region 判断是不是当前处理人
            WorkFlowItem    cwfi          = bdb.WorkFlowItems.Where(i => i.WfInstanceId == instanceId).FirstOrDefault();
            string          currentUserId = User.Identity.GetUserId();
            ApplicationUser user          = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.Id == currentUserId);
            if (cwfi.WfCurrentUser.ToString().Trim() != user.UserName.ToString().Trim())
            {
                var json = new
                {
                    errorMsg = "你不是当前处理人"
                };

                return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
            }
            #endregion
            string[]            strs       = NextLink.Trim().Split('(');
            AutoResetEvent      syncEvent  = new AutoResetEvent(false);
            int                 isComplete = 0;
            WorkflowApplication wfApp      = new WorkflowApplication(new ItService())
            {
                InstanceStore   = CreateInstanceStore(),
                PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
                {
                    //var ex = e.GetInstanceExtensions<CustomTrackingParticipant>();
                    // Outputs = ex.First().Outputs.ToString();
                    return(PersistableIdleAction.Unload);
                },
                Completed = delegate(WorkflowApplicationCompletedEventArgs e)
                {
                    isComplete = 1;
                    syncEvent.Set();
                },
                Aborted = delegate(WorkflowApplicationAbortedEventArgs e)
                {
                },
                Unloaded = delegate(WorkflowApplicationEventArgs e)
                {
                    syncEvent.Set();
                },
                OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
                {
                    return(UnhandledExceptionAction.Terminate);
                },
                Idle = delegate(WorkflowApplicationIdleEventArgs e)
                {
                }
            };
            var StateTracker = new StateMachineStateTracker(wfApp.WorkflowDefinition); //当前状态追踪
            wfApp.Extensions.Add(StateTracker);
            wfApp.Extensions.Add(new StateTrackerPersistenceProvider(StateTracker));
            var cu = new CustomTrackingParticipant();         //获取Activity内部变量
            wfApp.Extensions.Add(cu);                         //获取Activity内部变量需要的追踪器
            //Guid instanceId = wfApp.Id;
            var trackerInstance = StateMachineStateTracker.LoadInstance(instanceId, wfApp.WorkflowDefinition, ConfigurationManager.ConnectionStrings["ApacheConnection"].ConnectionString);
            wfApp.Load(instanceId);
            BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, strs[0]);
            //BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, NextLink.Trim());   //恢复当前状态,并进入下一个bookmark,注意使用Trim,开始没使用,NextLInk无法取到,调试了大半夜
            syncEvent.WaitOne();

            string CurrentUser;
            string OpinionField = "";
            string CurrentState;
            string completeStr = "";

            if (isComplete == 0)
            {
                if (strs.Count() == 1)
                {
                    CurrentUser = cu.Outputs["CurrentUser"].ToString();
                }
                else
                {
                    CurrentUser = db.LibraryApprovers.ToList().First(p => (p.LibID == libid) && (p.ApproverName == strs[1].Replace(")", ""))).Approver;
                }
                OpinionField = cu.Outputs["OpinionField"].ToString();
                CurrentState = StateTracker.CurrentState;
            }
            else
            {
                CurrentUser  = "******";
                CurrentState = "已结束";
                completeStr  = "->结束";
            }
            //string currentUserId = User.Identity.GetUserId();
            //ApplicationUser user = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.Id == currentUserId);    //获取当前用户TrueName,为增加流转信息提供数据
            WorkFlowItem  wfi  = bdb.WorkFlowItems.Where(i => i.WfInstanceId == instanceId).FirstOrDefault();   //获取当前流程信息
            ItServiceItem cisi = bdb.ItServiceItems.Where(i => i.ID == isi.ID).FirstOrDefault();                //获取当前业务数据的信息

            //业务数据更新开始
            cisi.Title          = isi.Title;
            cisi.applicant      = isi.applicant;
            cisi.applicant_dept = isi.applicant_dept;
            //cisi.description = isi.description;
            cisi.isitype     = isi.isitype;
            cisi.sub_isitype = isi.sub_isitype;
            cisi.end_isitype = isi.end_isitype;
            cisi.Object      = isi.Object;
            cisi.Topic       = isi.Topic;
            cisi.Purpose     = isi.Purpose;
            cisi.Status      = 1;
            if (NextLink == "驳回")
            {
                cisi.Status = 3;
            }
            if (isComplete == 1)
            {
                cisi.isiCompleteDate = DateTime.Now;
                if (NextLink == "撤销")
                {
                    cisi.Status = 4;
                }
                else
                {
                    cisi.Status = 2;
                }
            }

            #region 审批意见更新开始
            if (Opinion != null)
            {
                if (Convert.ToString(Opinion) != "")
                {
                    if (wfi.WfWriteField.Trim() == "FirstExamine")
                    {
                        cisi.FirstExamine = cisi.FirstExamine + "<br>" + Opinion + "     (意见填写人:" + user.TrueName + "    时间:" + DateTime.Now + ")";
                    }
                    if (wfi.WfWriteField.Trim() == "SecondExamine")
                    {
                        cisi.SecondExamine = cisi.SecondExamine + "<br>" + Opinion + "     (意见填写人:" + user.TrueName + "    时间:" + DateTime.Now + ")";
                    }
                    if (wfi.WfWriteField.Trim() == "LastExamine")
                    {
                        cisi.LastExamine = cisi.LastExamine + "<br>" + Opinion + "     (意见填写人:" + user.TrueName + "    时间:" + DateTime.Now + ")";
                    }
                }
            }
            #endregion


            if (wfi != null)
            {
                wfi.WfCurrentUser = CurrentUser;
                wfi.Wfstatus      = CurrentState;
                wfi.WfWriteField  = OpinionField;
                if (isComplete == 1)
                {
                    wfi.WfCompleteDate = DateTime.Now;
                }
                wfi.WfFlowChart = wfi.WfFlowChart + "->" + trackerInstance.CurrentState + "(" + user.TrueName + ")" + completeStr;          //增加流转信息
                try
                {
                    bdb.SaveChanges();
                    var json = new
                    {
                        okMsg = "提交成功"
                    };

                    return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
                }
                catch (Exception e)
                {
                    var json = new
                    {
                        errorMsg = "提交失败"
                    };

                    return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
                }
            }
            else
            {
                var json = new
                {
                    errorMsg = "流程不存在"
                };

                return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
            }
        }
Ejemplo n.º 24
0
        public ActionResult DrafterToNextState(ItServiceItem isi, Guid instanceId, string NextLink, string libid)  //起草者到下一环节
        {
            string[] strs = NextLink.Trim().Split('(');

            AutoResetEvent syncEvent = new AutoResetEvent(false);

            WorkflowApplication wfApp = new WorkflowApplication(new ItService())
            {
                InstanceStore   = CreateInstanceStore(),
                PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
                {
                    //var ex = e.GetInstanceExtensions<CustomTrackingParticipant>();
                    // Outputs = ex.First().Outputs.ToString();`
                    return(PersistableIdleAction.Unload);
                },
                Completed = delegate(WorkflowApplicationCompletedEventArgs e)
                {
                },
                Aborted = delegate(WorkflowApplicationAbortedEventArgs e)
                {
                },
                Unloaded = delegate(WorkflowApplicationEventArgs e)
                {
                    syncEvent.Set();
                },
                OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
                {
                    return(UnhandledExceptionAction.Terminate);
                },
                Idle = delegate(WorkflowApplicationIdleEventArgs e)
                {
                }
            };
            var StateTracker = new StateMachineStateTracker(wfApp.WorkflowDefinition); //当前状态追踪

            wfApp.Extensions.Add(StateTracker);
            wfApp.Extensions.Add(new StateTrackerPersistenceProvider(StateTracker));
            var cu = new CustomTrackingParticipant();         //获取Activity内部变量

            wfApp.Extensions.Add(cu);                         //获取Activity内部变量需要的追踪器
            //Guid instanceId = wfApp.Id;
            var trackerInstance = StateMachineStateTracker.LoadInstance(instanceId, wfApp.WorkflowDefinition, ConfigurationManager.ConnectionStrings["ApacheConnection"].ConnectionString);

            wfApp.Load(instanceId);
            //BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, NextLink.Trim());
            BookmarkResumptionResult result = wfApp.ResumeBookmark(trackerInstance.CurrentState, strs[0]);

            syncEvent.WaitOne();
            //string CurrentUser = cu.Outputs["CurrentUser"].ToString();
            string CurrentUser = db.LibraryApprovers.ToList().First(p => (p.LibID == libid) && (p.ApproverName == strs[1].Replace(")", ""))).Approver;
            //string CurrentRole = cu.Outputs["CurrentRole"].ToString();
            string OpinionField = cu.Outputs["OpinionField"].ToString();
            string Drafter      = cu.Outputs["Drafter"].ToString();
            var    CurrentState = StateTracker.CurrentState;
            //var Pt = StateTracker.PossibleTransitions;
            ApplicationUser user = db.Users.Include(i => i.Roles).FirstOrDefault(i => i.UserName == Drafter);    //获取当前用户username

            isi.drafter       = Drafter;
            isi.isiCreateDate = DateTime.Now;
            isi.Status        = 1;
            bdb.ItServiceItems.Add(isi);      //添加业务数据
            try
            {
                bdb.SaveChanges();
            }
            catch
            {
                var json = new
                {
                    errorMsg = "添加业务数据出错"
                };

                return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
            }
            WorkFlowItem wf = new WorkFlowItem();

            wf.WfInstanceId   = instanceId;
            wf.WfType         = "专病库IT服务申请";
            wf.WfCurrentUser  = CurrentUser;
            wf.WfDrafter      = Drafter;
            wf.WfWriteField   = OpinionField;
            wf.Wfstatus       = CurrentState;
            wf.WfBussinessUrl = "/ItService/OpenWorkFlow?id=" + instanceId;
            wf.WfCreateDate   = DateTime.Now;
            wf.WfBusinessId   = isi.ID; //添加业务数据关联
            wf.WfFlowChart    = trackerInstance.CurrentState + "(" + user.TrueName + ")";
            bdb.WorkFlowItems.Add(wf);
            bdb.SaveChanges();
            try
            {
                bdb.SaveChanges();
                var json = new
                {
                    okMsg = "流程保存成功"
                };

                return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
            }
            catch
            {
                var json = new
                {
                    errorMsg = "流程保存出错"
                };

                return(Json(json, "text/html", JsonRequestBehavior.AllowGet));
            }
        }