以下参考附图详细描述本发明的各实施例,在若干视图中,相同的标号表示相同的部分和组件。对各实施例的参考并不限制公开内容的范围,该范围仅由所附的权利要求书的范围限定。说明书中阐述的诸示例并非是限制性规定,而是仅仅阐述了许多可能的实施例中的一些。因此,以下的详细描述并非用于限制的意思。
说明性操作环境
参考图1,用于实现本发明的示例性系统包括诸如计算设备100等计算设备。在一个基本配置中,计算设备100通常包括至少一个处理单元102和系统存储器104。根据计算设备的确切配置和类型,系统存储器104可以是易失性(诸如RAM)、非易失性(诸如ROM、闪存等)或这两者的某一组合。系统存储器104通常包括操作系统105、一个或多个应用程序106,并包括程序数据107。在一个实施例中,应用程序106还包括以下将详细讨论的项目管理器108。
计算设备100还可以具有额外的特征或功能。例如,计算设备100还可包括附加的数据存储设备(可移动的和/或不可移动的),诸如磁盘、光盘或磁带。这种附加存储设备在图1中示作可移动存储109和不可移动存储110。计算机存储介质可包括以用于存储信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质,所述信息诸如计算机可读指令、数据结构、程序模块或其它数据。系统存储器104、可移动存储109和不可移动存储110都是计算机存储介质的示例。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储技术,CD-ROM、数字通用盘(DVD)或其它光存储,磁盒、磁带、磁盘存储或其它磁性存储设备,或者可用于存储所需信息并可由计算设备100存取的任何其它介质。任何这种计算存储介质可以是设备100的一部分。计算设备100还可具有输入设备112,诸如键盘、鼠标、笔、语音输入设备、触摸输入设备等。还可包括输出设备114,诸如显示器、扬声器、打印机等。所有这些设备均是本领域已知的,因而不需要在此进一步讨论。
计算设备100还包含通信连接116,它允许该设备诸如通过网络或无线网状网络与其它计算设备118通信。通信连接116是通信介质的示例。通信介质通常以已调制数据信号(诸如载波或其它传输机制)来体现计算机可读指令,数据结构、程序模块或其它数据,并包括任何信息传递介质。术语“已调制数据信号”表示按在其中编码信息的方式设定或改变其一个或多个特征的信号。作为示例而非限制,通信介质包括诸如有线网络或直线连接等有线介质,以及诸如声、RF、红外及其它无线介质等无线介质。这里使用的术语“计算机可读介质”包括存储介质和通信介质。
服务器侧项目管理器
本公开内容在诸如软件模块等在计算设备上执行的计算机可执行指令或组件的一般上下文中描述。一般来说,软件模块包括例程、程序、对象、组件、数据结构等,它们执行特定任务或实现特定抽象数据类型。虽然这里根据计算机可执行指令或组件进行描述,但本发明可同样使用除软件之外的程序化机制(诸如固件或专用逻辑电路)来实现。
图2示出了一项目数据集的框图,它定义了可用服务器侧项目API调用来更新的数据字段。该项目数据集包括项目数据表200、任务数据表210、资源数据表220和分配数据表230。项目数据表200包括项目头信息。任务数据表210包括任务信息,其中任务是要对项目执行的动作。任务可相互依赖。资源数据表220包括关于从事该项目的一个或多个人的信息。资源可以是本地或企业范围的。分配数据表230定义资源和任务之间的关系。换言之,分配标识被调度以完成相应任务的资源。
项目200还可包括专用于特定项目实现的辅助数据结构。例如,项目数据表200可与项目自定义字段数据表240相关联。项目自定义字段数据表240包括用于项目的用户定义数据。任务数据表210可与任务自定义字段数据表250相关联。任务自定义字段数据表250包括用于任务的用户定义数据。资源数据表220可与资源自定义字段数据表260相关联。资源自定义字段数据表260包括用于资源的用户定义数据。分配数据表230可与分配自定义字段数据表270相关联。分配自定义字段数据表260包括用于分配的用户定义数据。自定义字段数据表240、250、260、270提升了系统的可扩展性,因为它们允许用户输入其自己的任务、分配、资源和项目。
图3示出了用于管理服务器上的项目的系统的功能框图。该系统包括客户机300、web服务器310、服务器320和数据存储390。服务器320包括队列管理器330、事务队列340、分派器350、和处理器360、370、380。用户通过在客户机300处提交一项目更新请求来启动一项目更新进程调用。当用户在客户机300处加载的项目应用程序上创建新项目或修改现有项目时提交项目更新请求。该项目更新请求可包括改变与该项目相关联的调度信息的请求。该项目更新请求还可以包括修改数据存储390中存储的信息的请求。该项目更新请求经由web浏览器接口被提交给web服务310。可执行某一初步输入数据确认。该项目更新请求与一应用程序接口(API)相关联,该API经由web服务310调用服务器320以更新该项目并执行计算。以下详细描述示例性API。
项目更新请求被提交给队列管理器330。队列管理器330监视输入的请求并将该请求存储在事务队列340中。分派器350将该项目更新请求转发给可用的处理器(360、370或380)。多个处理器有助于负载平衡和需求平滑。
处理器根据项目更新请求和任何现有的项目定义来确定更新值。如果该项目更新请求与新创建的项目相关联,则处理器不参考现有的项目定义。这些更新值可直接从项目更新请求中或从项目更新请求与现有项目定义之间的差异中确定。利用更新值和任何现有项目定义来执行一组计算。示例计算包括节点一致性计算、调度操作、积累(roll-up)计算、以及自定义字段计算。该项目在数据存储390上基于计算结果被更新。
当用户修改一特定项目元素或字段(例如,任务或分配)时,执行节点一致性计算以更新有关数据元素和字段,从而维持一致性。例如,任务可将开始日期设为星期一并将结束日期设为星期三。任务的持续时间是三天。用户可将结束日期延长到星期四。该修改造成了数据不一致,因为现在任务的持续时间为四天。执行节点一致性计算以解决数据不一致性,以使持续时间数据字段自动被更新以反映该修改。因此,任务持续时间被更新为四天。
调度操作执行关键路径调度并确定由于时间约束而可能产生的任何调度冲突。调度操作可由服务器220上的调度引擎执行。在一个示例中,调度操作确定日历上的哪些日子是法定工作日,以使任务不会被调度到在非工作日执行。
执行积累计算以编译项目信息并生成所编译信息的概要。在一个实施例中,多个任务可与一个概要任务相关联。积累计算编译多个任务之间共享的信息,以便用概要任务来包含。例如,一个任务可被调度为星期一-星期三执行。另一个任务可被调度为星期四和星期五执行。这两个任务可在单个概要任务下被组合在一起。该概要任务具有五天的持续时间。
用户可为项目、任务、资源和分配建立自定义字段。自定义字段可被定义为执行一计算以表达关于该任务的量度。例如,名为“延迟的日子”的自定义字段被定义为执行一个将任务的实际结束日期减去预定完成日期的计算。
调用一组web服务API以创建、更新、调度和管理共享服务器上的项目。这些API包括数据检索调用、行政管理调用和数据更新调用。数据检索调用包括ReadProject(读取项目)和ReadProjectTeam(读取项目团队)。行政管理调用包括CheckOutProject(验收项目)和CheckInProject(登记项目)。数据更新调用包括CreateProject(创建项目)、CreateProjectFromTemplate(从模板创建项目)、UpdateProject(更新项目)、AddToProject(添加到项目)、DeleteFromProject(从项目中删除)、UpdateProjectTeam(更新项目团队)和Calculate(计算)。以下详细讨论这些调用中的每一个。
ReadProject被调用以读取单个项目的数据。例如,
projectDS=project.ReadProject(projected);
其中,“projectDS”(项目数据集)是从数据库中随项目数据一起返回的项目数据集。
“project”(项目)是对服务器侧项目web服务代理的引用。
“projectID”(项目ID)是从中删除任务、依赖关系、资源或分配的项目的GUID。
CheckOutProject被调用以保留一项目用于编辑或删除。如果该项目不可用于编辑,则引发一异常。在对客户机应用程序或服务器API进行任何改变前应锁定项目。该锁定是应用层逻辑锁定。当连同服务器侧项目API一起使用时,验收操作逻辑上等同于在客户机应用程序中打开一项目读写操作。验收操作是同步的,并立刻被执行。例如,
project.CheckOutProject(projected,sessionID,sessionDesc);
其中“project”是对服务器侧项目web服务代理的引用。
“projectID”是要验收的项目的GUID。
“sessionID”(会话ID)是由调用者提供的唯一标识符。项目上的逻辑锁定与sessionID GUID以及作出验收调用的用户相关联。如果用户与验收项目的用户相同且sessionID GUID随调用被提供,则仅接受针对被验收项目的后续操作。
“sessionDesc”(会话描述)是可任选的用户提供的字符串,它在项目被验收时作为项目的一部分来存储以指示与被验收项目相关联的用户。在一个实施例中,该字符串是被验收项目的客户机名。对于服务器侧项目调用,用户可提供对它们有意义的任何字符串。通常,该字符串是执行验收的进程的名称(例如,“时间表更新(Timesheet updates)”)。
CheckInProject释放项目锁定。如果对项目的改变未决(即在队列中),则登记操作被排队以在改变完成时发生。如果没有改变是未决的,则登记操作立刻发生。项目由执行验收的用户或者由具有管理员特权的用户使用“强制登记”选项来登记。登记操作迫使数据库中的任何数据的重新计算。例如,
project.CheckInProject(projectID,checkinOption,sessionID,sessionDesc);
其中,“project”是对服务器侧项目web服务代理的引用。
“projectID”是要被验收的项目的GUID。
“checkinOption”(登记选项)定义了与登记操作相关联的任何选项。示例选项包括正常的和强制的。正常的登记操作解锁该项目。后续的“打开项目应用程序中的读写”或“读取以更新”服务器侧项目调用从数据库接收项目的未公布副本。所有其它项目读取API和项目web访问持续到看到该项目的已公布版本。强制的登记操作需要管理员特权并忽略sessionID GUID。项目应用程序中的任何未保存的改变会丢失。
“sessionID”是当项目被验收时所使用的会话标识符。如果作出调用的用户或sessionID两者均与验收调用中使用的不同,则登记操作失败(除行政管理登记之外)。
“sessionDesc”是可任选的用户提供的字符串。该字符串可被服务器忽略但可用于诊断用途,即诊断该字符串是否与验收调用所提供的字符串不一致。
CreateProject被用于创建新的项目。例如,
project.CreateProject(projectDS,validateOnly);
其中,“project”是对服务器侧项目web服务代理的引用。
“projectDS”是用项目头、任务、依赖关系、资源和分配信息填充以便添加到项目的项目数据集。
“validateOnly”(仅确认)是指示调用是应创建项目还是执行数据确认的布尔值。如果生成结果“真”,则仅执行数据确认而不更新数据库。如果生成结果“假”,则执行数据确认且如果没有发现错误则创建该项目。项目数据集可包括任务、分配和资源以及项目头信息。每次调用仅可创建一个项目。如果数据集中指定了多个项目,则仅考虑第一个项目并忽略所有其它项目的数据。
CreateProjectFromTemplate基于现有的项目模板创建一新项目。例如,
newProjectID=project.CreateProjectFromTemplate(templateID,newProjectName,newProjectVersionID);
其中,“newProjectID”(新项目ID)是系统分配的GUID,它标识新创建的项目。
“project”是对服务器侧项目web服务代理的引用。
“templateID”(模板ID)是用作新项目基础的模板的GUID。
“newProjectName”(新项目名称)是给新创建项目的名称。
“newProjectVersionID”(新项目版本ID)是与新项目相关联的版本的GUID。
UpdateProject更新现有项目和/或现有任务、资源和分配。例如,
project.CreateProject(sessionID,projectDS,validateOnly);
其中,“project”是对服务器侧项目web服务代理的引用。
“sessionID”是在验收项目时使用的会话标识符。如果作出调用的用户标识符或会话标识符与验收调用中所使用的不同,则更新操作失败。
“projectDS”是包含对项目头或现有任务、依赖关系、资源和分配的改变的项目数据集。
“validateOnly”是指示调用是应创建项目还是执行数据确认的布尔值。如果生成“真”结果,则仅执行数据确认而不更新数据库。如果生成“假”结果,则执行数据确认且如果未发现错误则创建项目。项目数据集可包括任务、分配和资源以及项目头信息。数据集中的所有行涉及现有实体。每次调用创建一个项目。如果在数据集中指定多个项目,则仅考虑第一个且忽略所有其它项目的数据。
AddToProject向现有项目添加新任务、依赖关系、资源和分配。例如,
project.AddToProject(sessionID,projectDS,validateOnly);
其中,“project”是对服务器侧项目web服务代理的引用。
“sessionID”是在验收项目时使用的会话标识符。如果作出调用的用户标识符或会话标识符不同于用于验收调用的那些,则调用失败。
“projectDS”是经填充的项目数据集。使用用于任务、依赖关系、资源和分配的数据表。忽略项目数据表。
“validateOnly”是指示调用是应创建项目还是执行数据确认的布尔值。如果生成结果“真”,则仅执行数据确认而不更新数据库。如果生成结果“假”,则执行数据确认且如果没有发现错误则创建该项目。项目数据集可包括任务、分配和资源以及项目头信息。数据集中的所有行涉及现有实体。每次调用仅可创建一个项目。如果数据集中指定了多个项目,则仅考虑第一个并忽略所有其它项目的数据。
DeleteFromProject从现有项目中删除任务、依赖关系、资源和分配。例如,
project.DeleteFromProject(sessionID,projectID,deleteGUIDs[]);
其中,“project”是对服务器侧项目web服务代理的引用。
“sessionID”是在验收项目时使用的会话标识符。如果作出调用的用户标识符或会话标识符与验收调用中所使用的不同,则调用失败。
“projectID”是从其中删除任务、依赖关系、资源或分配的项目的GUID。
“deleteGUIDs”(删除GUID)数组包含要删除的任务、依赖关系、资源或分配的GUID。
每次调用仅可删除一个项目。如果删除GUID涉及不在指定项目中的实体,则出现异常且删除操作失败。如果为项目选择“经保护实物”选项,则不能删除项目上具有实际工作的分配和资源。
ReadProjectTeam返回项目上的资源的列表。该调用旨在主要由项目web访问中的队伍构建器页面使用。例如,
projectTeamDS=project.ReadProjectTeam(projectID);
其中,“projectTeamDS”(项目团队数据集)是包含项目团队数据表的数据集。
“project”是对服务器侧项目web服务代理的引用。
“projectID”是要向其添加资源的项目的GUID。
作出调用的用户具有对添加的企业资源的分配许可,否则出现安全异常且调用失败。如果指定的企业资源已存在于项目团队上,则用最新的企业资源数据来更新企业资源。
UpdateProjectTeam改变分配给项目的资源。该改变可包括:向项目团队添加新的企业资源、从项目团队中移除资源、用其它企业资源替换现有资源(并更新受影响的分配)、以及改变现有资源的预订类型。例如,
project.ReplaceResources(sessionID,projectID,projectTeamDS);
其中,“project”是对服务器侧项目web服务代理的引用。
“sessionID”是在验收项目时使用的会话标识符。如果作出调用的用户标识符或会话标识符与验收调用中使用的那些不同,则调用失败。
“projectID”是要替换其上的资源的项目的GUID.
“projectTeamDS”是包含项目团队数据表的数据集。该调用可用于改变企业或本地资源上的预订类型。用于本地资源的预订类型仅在本地项目内是可见的,因为本地资源不具有多个项目之间共享的概要资源分配。本地资源的预订类型在该项目外没有意义。
在对项目定义的一系列更新之后,计算重新调度该项目并重新计算自定义公式字段。例如,
project.Calculate(sessionID,projectID);
其中,“项目”是对服务器侧web服务代理的引用。
“sessionID”是在验收项目时使用的会话标识符。如果作出调用的用户标识符或会话标识符与验收调用中使用的那些不同,则调用失败。
“projectID”是要替换其上的资源的项目的GUID。
如上所述,API调用提供的能力包括:创建新项目;更新现有项目,包括添加、删除和更新任务、任务之间的依赖关系、项目团队资源和任务资源分配;管理项目数据上的数据争用;以及在项目web访问应用中使用的经计算调度结果和工作分配的调度和公布。
图4是示出用于管理服务器上的项目的进程的操作流程图。处理开始于开始框,其中将项目应用程序加载到客户机上。用户通过在客户机处提交项目更新请求来启动一项目更新调用。当用户创建一新项目或修改现有项目时提交项目更新请求。该项目更新请求与一API调用相关联。客户机上的web浏览器接口向可执行输入数据确认的web服务提交项目更新请求。在框400处,该web服务接收项目更新请求。
移到框410,与项目更新请求相关联的API由web服务标识并被调用。该API可以是数据检索调用、行政管理调用或数据更新调用。调用API以创建、更新、调度和管理服务器上的项目。例如,如果项目更新请求是创建新项目,则标识并调用CreateProject API。同样,如果项目更新请求是从项目中删除任务,则标识并调用DeleteFromProject API。
转到框420,将项目更新请求提交给队列管理器并存入服务器中的事务队列。继续到框430,从事务队列分派项目更新请求到服务器上的处理器。该项目更新请求可被分派给一组处理器中的一个。可以选择被分派项目更新请求的处理器,以平衡该组处理器之间的负载并平滑处理器需求。
继续到框440,当处理器标识来自项目更新请求的更新值时,确定用户提交的项目的改变。如果项目更新请求不与新创建的项目相关联,则处理器还可以标识现有的项目定义。更新值可通过比较项目更新请求和任何现有项目定义来确定。
前进到框450,使用更新值和任何现有项目定义执行计算。计算结果提供用于项目的新项目数据值。示例计算包括节点一致性计算、调度操作、积累计算和自定义字段计算。节点一致性计算用于更新与由项目更新请求直接修改的数据相关联的项目数据,以贯穿该项目维持一致性。调度操作执行关键路径调度并确定由于时间约束可能引发的任何调度冲突。通过编译共享信息为概要提供积累计算。自定义字段计算是在用户定义的数据字段上执行的计算。移到框460,该项目使用新项目数据值被更新并被存入数据存储中。随后,处理在结束框处终止。
以上描述的各种实施例仅为了说明而提供而不应被解释为限制本发明。本领域的普通技术人员可以容易地认识到,可以在在没有示例性实施例和这里示出并描述的应用的情况下对本发明作出的各种修改和变化,而不背离所附权利要求书所述本发明的真实精神和范围。