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,大家一起探讨!

浙公网安备 33010602011771号