• ProjectServer如何让系统管理员模拟普通用户创建自己的时间表


    public bool ProcessTimesheet(Guid siteGuid, Guid tsGuid, string lcid, string userName, bool submitStatus, string sspName)
            {
                #region Local Variables
                string exceptionMsg = null;
                string tsInfo = string.Empty;
                Stopwatch timeToProcessAll = new Stopwatch();
                Stopwatch timeToProcessStatus = new Stopwatch();
                timeToProcessAll.Start();
                //SPSite spSite = new SPSite("http://win-9dubqmslff7/pwa/");
                bool result = false;
                #endregion
    
                try
                {
                    if (appLog == null) appLog = new AppLog(LoggingPrefix, LoggingFolder, LogFileEveryHour);
    
                    #region STEP 1 - Initialize Web Service urls
    
                    statusing.Url = "http://win-9dubqmslff7/PWA/_vti_bin/psi/statusing.asmx";//WSUrl( HostName, sspName, "statusing", true);
                    resource.Url = WSUrl(HostName, sspName, "resource", false);
                    timesheet.Url = WSUrl(HostName, sspName, "timesheet", false);
    
                    if (logEvents) 
                        appLog.WriteLine(string.Format("STEP 1 - Initialize Web Service urls"));
    
                    #endregion
    
                    #region STEP 2 - Retrieve Timesheet DataSet
    
                    TimesheetWS.TimesheetDataSet timesheetDS = timesheet.ReadTimesheet(tsGuid);
                    TimesheetPSI tsHeader = new TimesheetPSI(timesheetDS);
                    Guid tspUID = tsHeader.PeriodUID;
                    Guid tresUID = tsHeader.ResUID;
    
                    if (logEvents)
                    {
                        appLog.WriteLine(string.Format("STEP 2 - Start event override for timesheet UID: {0}", tsGuid.ToString()));
                        tsInfo = string.Format("Timesheet: {0}; Resource: {1}; Creator: {2}, Period: {3}",
                                tsHeader.Name, tsHeader.ResName, tsHeader.CreatorResName, tspUID.ToString());
                    }
                    #endregion
    
                    ResourceWS.ResourceDataSet resourceDS = resource.ReadResource(tresUID);
                    ResourcePSI resourcePSI = new ResourcePSI(resourceDS);
    
                                        bool isWindowsUser = userName.StartsWith("AspNetSqlMembershipProvider") ? false : true;
                        statusing.SetImpersonationContext(isWindowsUser, userName, tresUID, Guid.Empty, siteGuid, lcid);
                        timesheet.SetImpersonationContext(isWindowsUser, userName, tresUID, Guid.Empty, siteGuid, lcid);
                    
                    if (logEvents) appLog.WriteLine(string.Format("STEP 3 - Statusing Impersonation for RES_UID: {0}", tresUID.ToString()));
    
                    #endregion
    
                                
                 
                    TimesheetWS.TimesheetDataSet timeSheetDs = new TimesheetWS.TimesheetDataSet();
                    TimesheetWS.TimesheetDataSet.HeadersRow headersRow = timeSheetDs.Headers.NewHeadersRow();
                    headersRow.RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");
                    headersRow.TS_UID = Guid.NewGuid();
                    headersRow.WPRD_UID = new Guid("EE8C2B3E-556B-4FAC-9CE1-537A51B4CCF6");
                    headersRow.TS_CREATOR_RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");
                    headersRow.TS_NAME = "我的时间表";
                    headersRow.TS_COMMENTS = "Create By PSI";
                    headersRow.TS_ENTRY_MODE_ENUM = (byte)PSLibrary.TimesheetEnum.EntryMode.Weekly;
                    timeSheetDs.Headers.AddHeadersRow(headersRow);
    
    
                    timesheet.CreateTimesheet(timeSheetDs, TimesheetWS.PreloadType.Default);
    
    
                    
                               }
    
    
    
    using System;
    using System.Collections.Generic;
    using System.Net;
    using System.Text;
    
    // Project Server 2007 References
    using Microsoft.Office.Project.Server.Library;
    
    namespace Microsoft.EPM.TSAutoStatus
    {
        /// <summary>
        /// Timesheet Helper Methods
        /// </summary>
        class TimesheetPSI
        {
            #region Properties
    
            private string  name;
            private string  resName;
            private string  creatorResName;
            private Guid    creatorResUID;
            private Guid    resUID;
            private Guid    periodUID;
            private decimal totalActValue;
            /// <summary>
            /// Timesheet Name
            /// </summary>
            public string Name
            {
                get { return name; }
            }
            /// <summary>
            /// Resource Name
            /// </summary>
            public string ResName
            {
                get { return resName; }
            }
            /// <summary>
            /// Timesheet creator resource name
            /// </summary>
            public string CreatorResName
            {
                get { return creatorResName; }
            }
            /// <summary>
            /// Timesheet creator resource UID 
            /// </summary>
            public Guid CreatorResUID
            {
                get { return creatorResUID; }
            }
            /// <summary>
            /// Resource UID
            /// </summary>
            public Guid ResUID
            {
                get { return resUID; }
            }
            /// <summary>
            /// Period UID
            /// </summary>
            public Guid PeriodUID
            {
                get { return periodUID; }
            }
            /// <summary>
            /// Total actual value in hours
            /// </summary>
            public decimal TotalActValue
            {
                get { return totalActValue; }
            }
            #endregion
    
            #region Constructor
    
            /// <summary>
            /// Timesheet header information
            /// </summary>
            /// <param name="timesheetDS">Timesheet DataSet</param>
            public TimesheetPSI(TimesheetWS.TimesheetDataSet timesheetDS)
            {
                name            = timesheetDS.Headers[0].TS_NAME;
                resName         = timesheetDS.Headers[0].TS_CACHED_RES_NAME;
                creatorResName  = timesheetDS.Headers[0].TS_CACHED_CREATOR_RES_NAME;
                creatorResUID   = timesheetDS.Headers[0].TS_CREATOR_RES_UID != Guid.Empty ? timesheetDS.Headers[0].TS_CREATOR_RES_UID : Guid.NewGuid();
                resUID          = timesheetDS.Headers[0].RES_UID != Guid.Empty ? timesheetDS.Headers[0].RES_UID : Guid.NewGuid();
                periodUID       = timesheetDS.Headers[0].WPRD_UID != Guid.Empty ? timesheetDS.Headers[0].WPRD_UID : Guid.NewGuid();
                totalActValue   = timesheetDS.Headers[0].TS_TOTAL_ACT_VALUE/60000;
            }
    
            #endregion
        }
    
        /// <summary>
        /// Perform WS impersonation
        /// </summary>
        class TimesheetDerived : TimesheetWS.TimeSheet
        {
            private String contextString = String.Empty;
    
            protected override WebRequest GetWebRequest(Uri uri)
            {
                WebRequest webRequest = base.GetWebRequest(uri);
                if (contextString != String.Empty)
                {
                    webRequest.UseDefaultCredentials = true;
                    webRequest.Credentials = CredentialCache.DefaultCredentials;
                    webRequest.Headers.Add("PjAuth", contextString);
                    webRequest.Headers.Add("ForwardFrom", "/_vti_bin/psi/timesheet.asmx");
                    webRequest.PreAuthenticate = true;
                }
                return webRequest;
            }
    
            public void SetImpersonationContext(bool isWindowsUser, String userNTAccount, Guid userGuid, Guid trackingGuid, Guid siteId, String lcid)
            {
                contextString = GetImpersonationContext(isWindowsUser, userNTAccount, userGuid, trackingGuid, siteId, lcid);
            }
    
            private String GetImpersonationContext(bool isWindowsUser, String userNTAccount, Guid userGuid, Guid trackingGuid, Guid siteId, String lcid)
            {
                PSContextInfo contextInfo = new PSContextInfo(isWindowsUser, userNTAccount, userGuid, trackingGuid, siteId, lcid);
                return PSContextInfo.SerializeToString(contextInfo);
            }
        }
    }
    

      调用的时候:

    UpdateStatus update = new UpdateStatus("http://win-9dubqmslff7/pwa");
                Guid siteGuid = new Guid("4E925E19-93AC-4275-9FD6-336D7E874377");
                Guid tsGuid = new Guid("C06F9A45-F19F-404A-A1D6-DF3ACDBA05BE");
                string lcid = "1033";
                string userName = @"HNxxxx";
                bool submitStatus = true;
                string sspName = "pwa";
                update.ProcessTimesheet( siteGuid,  tsGuid,  lcid,  userName,  submitStatus,  sspName);
    

      这里详细介绍下参数:

    siteGuid就是我们网站集的GUID,一般指PWA的网站集

    tsGuid就是我们的时间表的GUID,这里我们创建时间表的时候无需用到,如果是读取时间表的数据,在[ProjectServer_Published].[dbo].[MSP_TIMESHEETS]下的TS_UID字段

    lcid指中英文版本,中文1033

    userName指被模拟的账户,如果我想模拟X账户,只需填写X的用户名即可

    headersRow.RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");指的是被模拟账户的RESOURCE GUID

    headersRow.TS_CREATOR_RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");指的是创建时间表用户的RESOURCE GUID,一般指本人

    headersRow.WPRD_UID = new Guid("EE8C2B3E-556B-4FAC-9CE1-537A51B4CCF6");指的是时间表的日期GUID,从[ProjectServer_Reporting].[dbo].[MSP_TimesheetPeriod]表里面查找,找到指定日期的GUID即可。

     同理,根据模拟账户还可以做很多事情,比如有些用户保存了时间表的工时,但是忘记提交,系统可以自动模拟用户将未提交的工时提交上去。

  • 相关阅读:
    Python -- Redis List
    Python --Redis Hash操作
    Python使用redis介绍
    缓存服务器
    linux python3获取ip地址
    Rabbitmq -- rpc
    Rabbitmq--topic
    Rabbitmq -- direct
    删除rabbitmq中持久化的队列和数据
    Exchange-fanout 广播模式
  • 原文地址:https://www.cnblogs.com/olay/p/3643776.html
Copyright © 2020-2023  润新知