public IHttpActionResult EditMultipleProjects(PostEditProjects postEditProjects) { if (postEditProjects.EditProjects.Count > 0) { using (TransactionScope tranScope = new TransactionScope()) { var projectId = postEditProjects.ProjectId; var parentCode = postEditProjects.EditProjects[0].ParentCode; var projects = ProjectInfo.Search(pi => pi.ProjectId == projectId).ToList(); var usCode = projects[0].USCode; var store = StoreBasicInfo.GetStorInfo(usCode); var minExecuteSequence = postEditProjects.EditProjects.Min(p => p.ExecuteSequence); var maxExecuteSequance = postEditProjects.EditProjects.Max(p => p.ExecuteSequence); foreach (TopNavigator nav in postEditProjects.EditProjects) { var workflow = BaseWFEntity.GetWorkflowEntity(postEditProjects.ProjectId, nav.Code); workflow.Edit(); } string[] cancelWorkflowCodes = FlowInfo.Search(f => f.ParentCode == parentCode && f.ExecuteSequence <= maxExecuteSequance + 1).Select(f => f.Code).ToArray(); TaskWork.Cancel(t => cancelWorkflowCodes.Contains(t.TypeCode) && t.RefID == postEditProjects.ProjectId && t.Status != TaskWorkStatus.Finished); postEditProjects.EditProjects.Where(n => n.ExecuteSequence == minExecuteSequence).ToList().ForEach(n => { var project = projects.FirstOrDefault(pi => pi.FlowCode == n.Code); var originator = Employee.GetSimpleEmployeeByCode(project.CreateUserAccount); var source = FlowInfo.Get(n.ParentCode); var taskType = FlowInfo.Get(n.Code); TaskWork task = new TaskWork(); task.Id = Guid.NewGuid(); task.SourceCode = source.Code; task.SourceNameENUS = source.NameENUS; task.SourceNameZHCN = source.NameZHCN; task.Status = TaskWorkStatus.UnFinish; task.StatusNameZHCN = "任务"; task.StatusNameENUS = "任务"; task.Title = TaskWork.BuildTitle(postEditProjects.ProjectId, store.NameZHCN, store.NameENUS); task.RefID = postEditProjects.ProjectId; task.StoreCode = usCode; task.ReceiverAccount = originator.Code; task.ReceiverNameENUS = originator.NameENUS; task.ReceiverNameZHCN = originator.NameZHCN; task.TypeCode = taskType.Code; task.TypeNameENUS = taskType.NameENUS; task.TypeNameZHCN = taskType.NameZHCN; task.Url = TaskWork.BuildUrl(n.Code, projectId, ""); task.CreateTime = DateTime.Now; task.CreateUserAccount = ClientCookie.UserCode; task.Sequence = 0; task.ActivityName = "Start"; task.Add(); }); tranScope.Complete(); } return(Ok()); } else { return(BadRequest("you must select projects to be edited!")); } }
public IHttpActionResult GetNodes(string projectId, string flowCode) { var tasks = TaskWork.Search(t => t.ReceiverAccount == ClientCookie.UserCode && t.RefID == projectId && t.Status == 0).ToList(); var isActor = ProjectUsers.IsRole(projectId, ClientCookie.UserCode, ProjectUserRoleCode.AssetActor); var projects = ProjectInfo.Search(p => p.ProjectId == projectId); var flows = FlowInfo.Search(f => f.ParentCode == flowCode).OrderBy(f => f.LayoutSequence).ToList(); var editApproverableCodes = new string[] { FlowCode.Closure_ClosurePackage, FlowCode.TempClosure_ClosurePackage, FlowCode.MajorLease_Package, FlowCode.Reimage_Package, FlowCode.Rebuild_Package, FlowCode.Renewal_Package }; var navs = flows.Select(f => { var task = tasks.FirstOrDefault(t => t.TypeCode == f.Code); var project = projects.FirstOrDefault(p => p.FlowCode == f.Code); var node = NodeInfo.FirstOrDefault(n => n.Code == project.NodeCode); var nextFlow = flows.FirstOrDefault(nf => nf.ExecuteSequence == f.ExecuteSequence + 1); var isOriginator = ProjectInfo.IsOriginator(projectId, f.Code, ClientCookie.UserCode); var canEdit = project.Status == ProjectStatus.Finished || project.Status == ProjectStatus.Rejected; var flowStarted = node.Code != NodeCode.Start; var lastStartTask = TaskWork.Search(t => t.RefID == projectId && t.TypeCode == f.Code && (t.ActivityName == "Start" || t.ActivityName == "Originator")).OrderByDescending(t => t.CreateTime).FirstOrDefault(); var nextFlowStarted = nextFlow != null && projects.Any(p => p.FlowCode == nextFlow.Code && p.NodeCode != NodeCode.Start); var nav = new TopNavigator(); nav.Code = f.Code; nav.ParentCode = f.ParentCode; nav.NameENUS = f.NameENUS; nav.NameZHCN = f.NameZHCN; nav.ExecuteSequence = f.ExecuteSequence; nav.Percentage = f.Percentage; nav.IsFinished = project.Status == ProjectStatus.Finished; nav.Status = project.Status; nav.IsRejected = project.Status == ProjectStatus.Rejected; nav.ProgressRate = node.ProgressRate; if (task != null) { if (task.Url.IndexOf(task.RefID, StringComparison.OrdinalIgnoreCase) < 0) { if (task.Url.IndexOf("?") >= 0) { task.Url += "&"; } else { task.Url += "?"; } task.Url += "projectId=" + task.RefID; } nav.Url = task.Url; } else if (f.NoTaskEditable && isActor) { nav.Url = string.Format("/{0}/Main#/{1}?projectId={2}", flowCode, f.Code.Split('_')[1], projectId); } else { var tmpCode = f.Code.Split('_')[1]; if (flowCode == "Rebuild" && tmpCode == "Package") { tmpCode = "RebuildPackage"; } nav.Url = string.Format("/{0}/Main#/{1}/Process/View?projectId={2}", flowCode, tmpCode, projectId); } if (projectId.ToLower().IndexOf("renewal") != -1) { nav.Editable = f.Editable && canEdit && !nextFlowStarted && ProjectInfo.IsFlowEditable(projectId, f.Code); } else { nav.Editable = f.Editable && canEdit && ProjectInfo.IsFlowEditable(projectId, f.Code); } nav.Recallable = f.Recallable && !canEdit && isOriginator && ((lastStartTask == null && TaskWork.Any(t => t.RefID == projectId && t.TypeCode == f.Code && t.ActivityName != "Start")) || (lastStartTask != null && TaskWork.Any(t => t.CreateTime >= lastStartTask.CreateTime && t.RefID == projectId && t.TypeCode == f.Code && t.ActivityName != "Start"))) && project.NodeCode != NodeCode.Start; nav.EditApproverable = !canEdit && isOriginator && editApproverableCodes.Contains(nav.Code) && ((lastStartTask == null && TaskWork.Any(t => t.RefID == projectId && t.TypeCode == f.Code && (t.ActivityName != "Start" && t.ActivityName != "Originator"))) || (lastStartTask != null && TaskWork.Any(t => t.CreateTime >= lastStartTask.CreateTime && t.RefID == projectId && t.TypeCode == f.Code && (t.ActivityName != "Start" && t.ActivityName != "Originator")))); return(nav); }).ToList(); return(Ok(navs)); }
public IHttpActionResult TopNav(string projectId, string flowCode, string subCode) { var tasks = TaskWork.Search(t => t.ReceiverAccount == ClientCookie.UserCode && t.RefID == projectId && t.Status == 0).ToList(); var projects = ProjectInfo.Search(p => p.ProjectId == projectId); var navs = FlowInfo.Search(f => f.ParentCode == flowCode).OrderBy(f => f.LayoutSequence).ToList().Select(f => { var task = tasks.FirstOrDefault(t => t.TypeCode == f.Code); var project = projects.FirstOrDefault(p => p.FlowCode == f.Code) ?? new ProjectInfo(); var nav = new TopNavigator(); if (f.Code == subCode) { nav.IsSelected = true; } else { nav.IsSelected = false; } nav.Code = f.Code; nav.ParentCode = f.ParentCode; nav.NameENUS = f.NameENUS; nav.NameZHCN = f.NameZHCN; nav.ExecuteSequence = f.ExecuteSequence; nav.Percentage = f.Percentage; nav.IsFinished = project.Status == ProjectStatus.Finished; nav.Status = project.Status; nav.IsRejected = project.Status == ProjectStatus.Rejected; if (task != null) { if (task.Url.IndexOf(task.RefID, StringComparison.OrdinalIgnoreCase) < 0) { if (task.Url.IndexOf("?") >= 0) { task.Url += "&"; } else { task.Url += "?"; } task.Url += "projectId=" + task.RefID; } nav.Url = task.Url; } else if (f.NoTaskEditable && project.CreateUserAccount == ClientCookie.UserCode) { nav.Url = string.Format("/{0}/Main#/{1}?projectId={2}", flowCode, f.Code.Split('_')[1], projectId); } else { var tmpCode = f.Code.Split('_')[1]; if (flowCode == "Rebuild" && tmpCode == "Package") { tmpCode = "RebuildPackage"; } nav.Url = string.Format("/{0}/Main#/{1}/Process/View?projectId={2}", flowCode, tmpCode, projectId); } return(nav); }).ToList(); navs.Insert(0, new TopNavigator { NameENUS = "Project Detail", NameZHCN = "Project Detail", Code = "Detail", Url = "/Home/Main#/project/detail/" + projectId + "?flowCode=" + flowCode, IsSelected = subCode == "Detail" }); return(Ok(navs)); }
public List <NavigateInfo> GetCurrentByProjectId(string projectId, string flowCode, string subFlowCode, string userAccount) { var flowList = FlowInfo.Search(e => e.ParentCode == FlowCode.Closure).OrderBy(e => e.LayoutSequence); //获取当前用户的项目任务 var sql = string.Format(@"SELECT tb_users.*,tb_work.Status AS TaskStatus,tb_work.TypeCode,tb_work.Url, tb_work.ProcInstID,tb_users.ProjectId FROM dbo.ProjectUsers tb_users RIGHT JOIN dbo.TaskWork tb_work ON tb_users.UserAccount = tb_work.ReceiverAccount AND tb_work.RefID = tb_users.ProjectId WHERE tb_work.RefID = '{0}' AND tb_work.ReceiverAccount ='{1}' AND ISNULL(RoleCode,'')!='View' AND tb_work.Status = 0 ", projectId, userAccount); var navigateList = new List <NavigateInfo>(); var result = ProjectUsers.SqlQuery <ProjectUsersEntity>(sql, null); var list = result.ToList(); //获取已完成的项目列表 var finishedProjectList = ProjectInfo.Search(e => e.ProjectId == projectId && e.Status == ProjectStatus.Finished).ToList(); NavigateInfo navigateItem = null; var viewPageStuff = "/View/param?projectId=" + projectId; var editPageStuff = "/" + projectId; //是否是编辑页 foreach (var flowItem in flowList) { var isEditPage = false; navigateItem = new NavigateInfo(); navigateItem.NameZHCN = flowItem.NameZHCN; navigateItem.Linked = true; navigateItem.Code = flowItem.Code; navigateItem.Href = string.Empty; //设置当前的子流程的为选中状态 if (flowItem.Code == subFlowCode) { navigateItem.IsSelected = true; } //设置流程的完成状态 foreach (var project in finishedProjectList) { if (flowItem.Code == project.FlowCode) { navigateItem.IsFinished = true; } } //默认的链接 主流程Code+/+子流程Code string defaultUrl = "#/" + flowItem.FlowCodePrefix + "/" + flowItem.Code.Split('_')[1]; //判断当前用户是否有待办任务 foreach (var item in list) { if (item.TypeCode == flowItem.Code) { if (item.TaskStatus == TaskWorkStatus.UnFinish) { //如果有待办任务导航tab的链接为待办任务的链接 navigateItem.Href = item.Url; if (item.ProcInstID.HasValue && !string.IsNullOrEmpty(item.ProjectId)) { navigateItem.Href += "&projectId=" + item.ProjectId; } } //如果任务已结束设置为只读页面的链接 else if (item.TaskStatus == TaskWorkStatus.Finished || item.TaskStatus == TaskWorkStatus.K2ProcessApproved || navigateItem.IsFinished) { navigateItem.Href = defaultUrl + viewPageStuff; } } } //获取当前用户的项目组头衔 var projectUser = ProjectUsers.Get(ClientCookie.UserCode, projectId); if (string.IsNullOrEmpty(navigateItem.Href)) { if (projectUser != null) { if (!string.IsNullOrEmpty(flowItem.RoleCode) && flowItem.RoleCode.Split('_').Contains(projectUser.RoleCode) && !navigateItem.IsFinished) { isEditPage = true; } if (isEditPage) { navigateItem.Href = defaultUrl + editPageStuff; } else { navigateItem.Href = defaultUrl + viewPageStuff; } } else { navigateItem.Href = defaultUrl + viewPageStuff; } } navigateList.Add(navigateItem); } return(navigateList); }