二次开发工作

ProjectService类

ProjectService类是用来处理从数据库加载和保存项目的。里面有两个重要方法:LoadProject和SaveProject。

开发者往往需要改造这个类,修改项目加载和保存的实现方式,以满足开发的需要。

PlusProject并不关心和限制开发者如何加载和保存项目数据,只需要在创建和使用PlusProject时,提供好符合数据格式的JSON数据即可。所以开发者可以使用任意的数据库,以及数据库操作方式,灵活性和可控性非常高。

加载数据

在ProjectService的LoadProject方法中,根据项目UID,加载项目数据和任务数据,并进行数据格式转换工作,最后得到一个Hashtable对象返回。开发者可以参考LoadProject方法的代码,使用自己熟悉的数据库操作方式,比如IBatis、Hibernate等第三方类库,查询数据后,按项目数据结构进行格式转换工作。

需要注意的是,TaskDal内的ModelMapper方法,负责数据库字段和后端字段的对应转换。。从数据库查询出任务列表后,需要进行一个for循环遍历操作,一一将任务属性转换为标准任务字段。

另外,获得任务列表后,需要生成树形结构数据。这个可以使用TreeHelper的标准方法来实现:

//任务列表
ArrayList tasks = SelectTasks(projectUID);
//列表转树形
tasks = TreeHelper.List2Tree(tasks, "children", "UID", "ParentTaskUID");
project["Tasks"] = tasks;

最后,需要获取项目的“部门”和“负责人”信息。这两个方法开发者可以重写实现。(示例是生成静态的数据)

//部门, 负责人获取
project["Departments"] = GetDepartments(projectUID);
project["Principals"] = GetPrincipals(projectUID);

保存数据(全部)

在ProjectService有一个SaveProject方法。其原理是:删除所有旧任务,新增所有新任务,达到更新任务的目的。

//删除任务
taskDal.DeleteAllByProjectId(id,trans);
//树形转列表        
ArrayList tasks =TreeHelper.Tree2List((ArrayList)dataProject["Tasks"],"-1", "children", "UID", "ParentTaskUID");
//保存任务表
taskDal.Insert(task,trans);

保存数据(局部)

在ProjectService有一个SaveProject方法。(和上个方法参数不同)其原理是:遍历所有任务(包括被删除的),判断任务的"_state"属性状态,分别做"增/删/改"数据库操作。

//树形转列表
ArrayList tasks = TreeUtil.ToList((ArrayList)dataProject["Tasks"],"-1", "children", "UID", "ParentTaskUID");
//把被删除的任务,加入遍历的集合中
ArrayList removedTasks = (ArrayList)dataProject["RemovedTasks"];
if (removedTasks != null)
{
    tasks.AddRange(removedTasks);
}
//获取变动的任务, 分别保存
foreach (Hashtable task in tasks)
{
    string state = Convert.ToString(task["_state"]);
if (state == "") continue;  
//如果任务没有变动,则不更新

    task["ProjectUID"] = projectUID;                
    switch (state)
    {
        case "added":       //新增
            ......
            break;
        case "modified":    //修改
            ......
            break;
        case "removed":     //删除                       
	    ......
            break;
    }
}

PlusProject提供了保存全部和保存局部两种方式的完整代码。开发者可以参考,并使用自己的方式实现。