数据结构

EdoProject提供的一个跟微软Project类似的完整数据结构,是微软Project数据格式的一个主要部分,可以很方便与MS PROJECT导出、导出。
其中定义了项目基本属性、日历Calenars、任务Tasks、任务相关性PredecessorLink、比较基准Baseline、资源Resources、资源分配关系Assignments等数据。

开发者也可以自定义扩展任务属性和项目属性。对于这一部分,我们有专门的教程和示例来说明。

XML数据格式

EdoProject可以直接读取从微软Project导出的XML文件,能正常显示和操作,并保存到数据库。
EdoProject不支持完整的微软Project项目数据格式,只支持如下最主要的数据内容:

<?xml version="1.0" encoding="utf-8" ?>
<!--
  本XML是EdoProject ( http://www.edogantt.com )所能正常工作需要的最精简XML.
  是微软的projext xml标签的一部分
-->
<Project xmlns="http://schemas.microsoft.com/project">  
  <UID>100</UID>                                  <!--项目唯一标识符-->  
  <Name>ProjectName</Name>                      <!--项目名称-->   
  <CreationDate>2009-06-12T22:08:00</CreationDate><!--创建日期-->
  <LastSaved>2009-06-12T23:38:00</LastSaved>      <!--最后一次保存日期-->  
  <StartDate>2007-01-01T08:00:00</StartDate>      <!--项目开始日期-->
  <FinishDate>2007-05-14T15:00:00</FinishDate>    <!--项目完成日期-->
  <CalendarUID>1</CalendarUID>                    <!--项目日历UID-->
  <DefaultStartTime>08:00:00</DefaultStartTime>   <!--默认工作开始时间-->
  <DefaultFinishTime>17:00:00</DefaultFinishTime> <!--默认工作截止时间-->
  <MinutesPerDay>480</MinutesPerDay>              <!--每天工时-->
  <MinutesPerWeek>2400</MinutesPerWeek>           <!--每周工时-->
  <DaysPerMonth>20</DaysPerMonth>                 <!--每月工作日-->
  <WeekStartDay>2</WeekStartDay>                  <!--每周开始工作日-->
  <Calendars>                                              
    <Calendar>                                    <!--日历-->
      <UID>1</UID>                                <!--日历UID-->
      <Name>CalendarName</Name>                   <!--日历名称-->
      <IsBaseCalendar>1</IsBaseCalendar>          <!--是否基准日历-->
      <BaseCalendarUID>-1</BaseCalendarUID>       <!--基准日历UID-->
      <WeekDays>          
        <WeekDay>                                 <!--工作天-->
          <DayType>1</DayType>                    <!--1(星期日),...7(星期六),0例外日期-->
          <DayWorking>0</DayWorking>              <!--非工作日0,工作日1-->
        </WeekDay>
        <WeekDay>
          <DayType>2</DayType>
          <DayWorking>1</DayWorking>
          <WorkingTimes>                          <!--工作时间:当为工作日具备-->
            <WorkingTime>
              <FromTime>08:00:00</FromTime>       <!--工作时间开始-->
              <ToTime>12:00:00</ToTime>           <!--工作时间结束-->
            </WorkingTime>
            <WorkingTime>
              <FromTime>13:00:00</FromTime>
              <ToTime>17:00:00</ToTime>
            </WorkingTime>
          </WorkingTimes>
        </WeekDay>
        <!-- ...省略其他WeekDay -->
        <WeekDay>
          <DayType>7</DayType>
          <DayWorking>0</DayWorking>
        </WeekDay>
        <WeekDay>
          <DayType>0</DayType>                      <!--例外日期-->
          <DayWorking>0</DayWorking>
          <TimePeriod>
            <FromDate>2009-11-04T00:00:00</FromDate><!--例外日期开始日期-->
            <ToDate>2009-11-04T23:59:00</ToDate>    <!--例外日期截止日期-->
          </TimePeriod>
        </WeekDay>       
      </WeekDays>
    </Calendar>
  </Calendars>
  <Tasks>
    <Task>      
      <UID>1</UID>                                      <!--任务唯一ID-->      
      <ID>1</ID>                                        <!--大纲ID:任务序号-->
      <Name>TaskName1</Name>                            <!--大纲ID(其实是一种序号)-->      
      <Type>1</Type>                                    <!--任务类型:0固定单位,1固定工期,2固定工时-->      
      <CreateDate>2009-06-13T09:33:00</CreateDate>      <!--创建日期-->      
      <OutlineNumber>1.2.1</OutlineNumber>              <!--大纲字段:任务层次以及顺序-->
      <OutlineLevel>1</OutlineLevel>                    <!--大纲层级-->      
      <Start>2009-06-15T08:00:00</Start>                <!--任务开始日期-->
      <Finish>2009-06-15T17:00:00</Finish>              <!--任务完成日期-->      
      <Duration>PT8H0M0S</Duration>                     <!--工时-->      
      <PercentComplete>10</PercentComplete>             <!--进度-->                        
      <ConstraintType>0</ConstraintType>                <!--限制类型-->      
      <ConstraintDate>2009-06-29T08:00:00</ConstraintDate><!--限制日期-->                  
      <Notes>11111111111111111111111111111</Notes>      <!--备注-->
      <Milestone>0</Milestone>                          <!--里程碑-->
      <Summary>0</Summary>                              <!--摘要任务-->
      <Critical>1</Critical>                            <!--关键路径-->
      <Priority>500</Priority>                          <!--重要级别-->      
      <PredecessorLink>                                 <!--前置任务-->
        <PredecessorUID>71</PredecessorUID>             <!--前置任务UID-->
        <Type>1</Type>                                  <!--任务相关性类型-->        
        <LinkLag>0</LinkLag>                            <!--延隔时间-->
        <LagFormat>7</LagFormat>                        <!--时间类型-->
      </PredecessorLink>
      <Baseline>                                        <!--比较基准-->
        <Start>2009-06-15T08:00:00</Start>
        <Finish>2009-06-15T17:00:00</Finish>
        <Duration>1</Duration>
      </Baseline>
    </Task>
  </Tasks>  
  <Resources>
    <Resource>                                          <!--资源-->
      <UID>1</UID>                                      <!--资源UID-->
      <Name>ResourceName1</Name>                        <!--资源名称-->
      <Type>1</Type>                                    <!--资源类型-->
      <MaxUnits>1</MaxUnits>                            <!--资源单位-->
    </Resource>
  </Resources>  
  <Assignments>
    <Assignment>                                        <!--任务与资源分配关系-->      
      <TaskUID>7</TaskUID>                              <!--任务UID-->
      <ResourceUID>1</ResourceUID>                      <!--资源UID-->
      <Units>1</Units>                                  <!--资源占用单位-->
    </Assignment>
  </Assignments>  
</Project>

JSON数据格式

EdoProject的JSON数据格式如下:

{
    UID: 100,
    Name: 'ProjectName',
    CreationDate: new Date(),
    LastSaved: new Date(),
    StartDate: new Date(),
    FinishDate: new Date(),
    CalendarUID: 1,
    DefaultStartTime: '08:00:00',
    DefaultFinishTime: '17:00:00',
    MinutesPerDay: 480,
    MinutesPerWeek: 2400,
    DaysPerMonth: 20,
    WeekStartDay: 2,
    Calendars: [        //日历集合
        {
            UID: 1,
            Name: 'CalendarName',
            IsBaseCalendar: -1,
            BaseCalendarUID: -1,
            WeekDays: [    
                {
                    DayType: 1,
                    DayWroking: 1,          //如果是工作日
                    WorkingTimes: [
                        {
                            FromTime: '08:00:00',
                            ToTime: '12:00:00'
                        }
                        //...
                    ]
                },
                {
                    Name: '例外日期名称',
                    DayType: 0,
                    DayWroking: 0,
                    TimePeriod: {    
                        FromDate: '2009-11-04T00:00:00',
                        ToDate: '2009-11-04T23:59:00'
                    }
                }
                //...
            ]
        }
    ],
    Tasks: [        //任务集合
        {
            UID: 1,    //任务UID
            //... 省略任务其他属性,请参考XML
            PredecessorLink: [    //前置任务
                {
                    PredecessorUID: 2,
                    Type: 1,
                    LinkLag: 0,
                    LagFormat: 7
                }
                //...
            ],
            Baseline: [ //比较基准
                {        
                    Start: new Date(),
                    Finish: new Date(),
                    Duration: 1
                }
            }
        }
        //...
    ],
    Resources: [        //资源集合
        {
            UID: 1,
            Name: 'ResourceName1',
            Type: 1,
            MaxUnits: 1
        },
        //...
    ],
    Assignments: [    //资源与任务的分配关系集合
        {
            TaskUID: 1
            ResourceUID: 1,
            Units: 1
        },
        //...
    ]    
}

在实际使用中,我们往往会组织成这样的格式:

{
    error: 0,
    result: ... //result是上门的EdoProject标准JSON格式
}

数据库表结构

当我们在加载XML或JSON项目数据,进行显示和操作之后,需要将项目数据保存进数据库。
下面就是数据库的表结构图,这里提供的是 MSSQL2000的表结构图,官方提供了三种数据库表:Oracle、MySql、MSSql。
当然,如果您是其他类型的数据库,只需要参考下表字段就可以顺利一致EdoProject的数据库表:

开发者也可以参考EdoProject提供数据库设计,实现自己的表结构,只要能正确存储项目数据就可以。

无论用户的服务端是什么,数据库是什么,只要提供以上符合微软Project数据结构定义的XML或JSON字符串数据,即可使用EdoProject显示、操作并保存。

需要注意的是,EdoProject提供的服务端,数据交互格式是JSON。因为JSON比XML体积要小很多,减少网络流量,提升数据传输速度,在页面加载显示的速度也比XML要快。

更多内容,请看数据库表分析教程