Project Server的Psi汇总
根据模板创建一个项目,返回的ProjectUid就是该项目的唯一标示号。另外由于受项目本身各种状态属性的影响,调用PSI方法时都要用try catch.
try { Guid ProjectUid = projectSvc.CreateProjectFromTemplate(TemplateGuid,ProjectName); } catch (Exception ex) { message = "Create project failed. <br />" + ex.Message; }
//如果需要添加项目其他属性,如项目经理
ProjectWebSvc.ProjectDataSet projectDs = new ProjectWebSvc.ProjectDataSet(); projectDs = projectSvc.ReadProject(ProjectUid, ProjectWebSvc.DataStoreEnum.WorkingStore); private Guid sessionUid = Guid.NewGuid();//迁出项目和迁入都需要这个Guid,必须一致。队列作业用于提交的Session的UID private string session_desc = "";//对上面字段的描述 try { //迁出项目 projectSvc.CheckOutProject(ProjectUid, sessionUid, session_desc); } catch (Exception ex) { message = "Create project success,but check out failed. <br />" + ex.Message; return; } //获取刚新建的项目对象 ProjectWebSvc.ProjectDataSet.ProjectRow project = projectDs. Project. FindByPROJ_UID(ProjectUid); // ProjectOwnerID属性就是项目经理,这个人必须拥有创建项目的全局权限。 project.ProjectOwnerID = new Guid(ProjectOwnerID);
然后再checkin项目即可。
//为另外一个自定义域赋值(如:项目状态),这个自定义域在查阅表格中进行了定义,为字符串类型 ProjectWebSvc.ProjectDataSet.ProjectCustomFieldsRow cfRowPStatusText = projectDs.ProjectCustomFields.NewProjectCustomFieldsRow(); cfRowPStatusText.PROJ_UID = DraftProjectUid; cfRowPStatusText.CUSTOM_FIELD_UID = Guid.NewGuid(); cfRowPStatusText.MD_PROP_UID = new Guid(PStatus);// PStatus是从ProjectServer_Published.dbo.MSP_CUSTOM_FIELDS中找到MD_PROP_NAME为“项目状态”的MD_PROP_UID的值。 cfRowPStatusText.FIELD_TYPE_ENUM = 21; //21 是文本类型 if (NewCreateUID != Guid.Empty)// NewCreateUID { cfRowPStatusText.CODE_VALUE = ProjectStatusItemGuid;// ProjectStatusItemGuid是从ProjectServer_Published.dbo.MSP_LOOKUP_TABLE_VALUES_PUBLISHED_VIEW中找到的LT_VALUE_TEXT='项目状态A'的LT_STRUCT_UID projectDs.ProjectCustomFields.AddProjectCustomFieldsRow(cfRowPStatusText); }
//更新项目 Guid jobId = Guid.NewGuid(); projectSvc.QueueUpdateProject(jobId, sessionUid, projectDs, false); this.psiWaitForQueue(queueSystemSvc, jobId); ////Check in the project bool isForceCheckIn = true; Guid jobId1 = Guid.NewGuid(); projectSvc.QueueCheckInProject(jobId1, ProjectUid, isForceCheckIn, sessionUid, session_desc); this.psiWaitForQueue(queueSystemSvc, jobId1); //发布项目 Guid jobId2 = Guid.NewGuid(); projectSvc.QueuePublish(jobId2, ProjectUid, false, String.Empty); this.psiWaitForQueue(queueSystemSvc, jobId2);
//接下来做一个更新资源属性(时间表审批者)的例子 ResourceWebSvc.ResourceDataSet resourceDs = new ResourceWebSvc.ResourceDataSet(); resourceDs = resourceSvc.ReadResource(item.resource); try { resourceSvc.CheckOutResources(uids); } Catch(exception ex) { message = "check out resource failed. <br />" + ex.Message; } ResourceWebSvc.ResourceDataSet.ResourcesRow resource1 = resourceDs.Resources.FindByRES_UID(ResourceUID); resource1.RES_TIMESHEET_MGR_UID =ResourceTimeSheetManagerUID;//为时间表审批者赋值,这个人需要有接受时间表的全局权限 //更新成功会自动迁入 try { resourceSvc.UpdateResources(resourceDs, false, true); //auto check in } Catch(exception ex) { item.message = "update resource property failed.<br>"+ex.Message; resourceSvc.CheckInResources(uids, true); }
//在已有项目中插入一条任务 projectDs = projectSvc.ReadProject(new Guid(ProjectUid), ProjectWebSvc.DataStoreEnum.WorkingStore); //check out the project data try { projectSvc.CheckOutProject(new Guid(ProjectUid), sessionUid, session_desc); } catch (Exception ex) { message = "Check out project failed. <br />" + ex.Message; return; } //添加新任务行 ProjectWebSvc.ProjectDataSet.TaskRow taskRow = projectDs.Task.NewTaskRow(); taskRow.PROJ_UID = new Guid(ProjectUid); taskRow.TASK_UID = TaskUID; //任务UID taskRow.TASK_NAME = TaskName;//项目名称 taskRow.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;//任务工期的格式化类型(分钟、小时、天 ,等等…) //限制类型4表示开始时间不得早于(如果TASK_CONSTRAINT_TYPE大于2,则TASK_CONSTRAINT_TYPE 与 TASK_CONSTRAINT_DATE 必须同时指定,修改时也是必须同时修改,例如将TASK_CONSTRAINT_TYPE从4变为3,但是TASK_CONSTRAINT_DATE不变,那么这两个属性也必须同时修改,不过修改后有可能会带来整个项目工期的改变) taskRow.TASK_CONSTRAINT_TYPE = 4; //限制日期 taskRow.TASK_CONSTRAINT_DATE = DateTime.Now; //任务的工期 taskRow.TASK_DUR = 0; //表示添加任务行是在中间添加,而不是为某个任务添加子级 taskRow.AddPosition = (int)PSLibrary.Task.AddPositionType.Middle; if (taskRow.AddPosition == (int)PSLibrary.Task.AddPositionType.Middle) { //taskRow.AddAfterTaskUID表示前边任务的Uid,taskRow .TASK_PARENT_UID表示父级UID;两者不是同一概念 taskRow.AddAfterTaskUID = new Guid(BeforeTaskUid);// BeforeTaskUid是同级任务中前一个任务的UID taskRow.TASK_OUTLINE_LEVEL = 3;//WBS的层级 } projectDs.Task.AddTaskRow(taskRow); bool isForceCheckIn = true; Guid jobId3 = Guid.NewGuid(); projectSvc.QueueCheckInProject(jobId3, new Guid(ProjectUid), isForceCheckIn, sessionUid, session_desc); this.psiWaitForQueue(queueSystemSvc, jobId3);
/// <summary> /// 监控整个队列作业的执行(通用方法) /// </summary> /// <param name="queueSystemSvc">queueSystem Web Service</param> /// <param name="jobId">job guid</param> public void psiWaitForQueue(QueueSystemWebSvc.QueueSystem queueSystemSvc, Guid jobId) { QueueSystemWebSvc.JobState jobState; const int QUEUE_WAIT_TIME = 4; // one second bool jobDone = false; string xmlError = string.Empty; int wait = 0; //Wait for the project to get through the queue. // - Get the estimated wait time in seconds. wait = queueSystemSvc.GetJobWaitTime(jobId); // - Wait for it. //logger.Info("Waiting on queue. Estimate: {0} seconds.\r\n " + wait); // - Wait until it is done. do { // - Get the job state. jobState = queueSystemSvc.GetJobCompletionState(jobId, out xmlError); if (jobState == QueueSystemWebSvc.JobState.Success) { jobDone = true; } else { if (jobState == QueueSystemWebSvc.JobState.Unknown || jobState == QueueSystemWebSvc.JobState.Failed || jobState == QueueSystemWebSvc.JobState.FailedNotBlocking || jobState == QueueSystemWebSvc.JobState.CorrelationBlocked || jobState == QueueSystemWebSvc.JobState.Canceled) { // If the job failed, error out. throw (new ApplicationException("Queue request " + jobState + " for Job ID " + jobId + ".\r\n" + xmlError)); //logger.Error("Queue request " + jobState + " for Job ID " + jobId + ".\r\n" + xmlError); } else { //Console.WriteLine("Job State: " + jobState + " for Job ID: " + jobId); //Console.Write("~"); Thread.Sleep(QUEUE_WAIT_TIME * 1000); } } } while (!jobDone); //Console.Write("\r\n"); }
研究ProjectServer的可以加我QQ 411033149,大家一起探讨!