Explorar o código

提交项目管理页面js修改

caiaolin %!s(int64=8) %!d(string=hai) anos
pai
achega
3194f31950

+ 4 - 5
modules/pm/models/project_model.js

@@ -93,6 +93,7 @@ ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
             callback(1, '提交数据出错.', null);
         }
     };
+    console.log(datas);
     if (datas) {
         for (i = 0; i < datas.length && !hasError; i++) {
             data = datas[i];
@@ -100,14 +101,12 @@ ProjectsDAO.prototype.copyUserProjects = function (userId, datas, callback) {
                 Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll)
             } else if (data.updateType === 'copy') {
                 data.updateData['userID'] = userId;
-                if (data.updateData.projType === 'Tender') {
-                    data.updateData['createDateTime'] = new Date();
-                };
-                newProject = new Projects(data.updateData);
+                data.updateData['createDateTime'] = new Date();
+                let newProject = new Projects(data.updateData);
                 newProject['srcProjectId'] = data.srcProjectId;
                 newProject.save(function (err, result) {
                     if (!err && result._doc.projType === 'Tender') {
-                        copyProjController.copyProjectData(this.newProject.srcProjectId, result._doc.ID, updateAll);
+                        copyProjController.copyProjectData(newProject.srcProjectId, result._doc.ID, updateAll);
                     } else {
                         updateAll(err);
                     }

+ 1 - 1
public/models/delete_schema.js

@@ -5,7 +5,7 @@
 var mongoose = require("mongoose");
 var Schema = mongoose.Schema;
 
-// ·ÑÓÃ×Ö¶Î
+
 var deleteSchema = new Schema({
     deleted: Boolean,
     deleteDateTime: Date,

+ 20 - 21
web/building_saas/pm/html/project-management.html

@@ -112,16 +112,16 @@
             <div class="col-lg-10">
                 <div class="toolsbar">
                     <div class="tools-btn btn-group align-top">
-                        <a href="javascript:void(0);" class="btn btn-sm" id="addProjBtn">新建 <i class="fa fa-cubes"></i> 建设项目</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="add-project-btn">新建 <i class="fa fa-cubes"></i> 建设项目</a>
                         <a href="javascript:void(0);" class="btn btn-sm" id="add-engineering-btn">新建 <i class="fa fa-cube"></i> 单项工程</a>
                         <a href="javascript:void(0);" class="btn btn-sm" id="add-tender-btn">新建 <i class="fa fa-sticky-note-o"></i> 单位工程</a>
-                        <a href="javascript:void(0);" class="btn btn-sm" id="addFolderBtn"><i class="fa fa-folder-o"></i>&nbsp;新建文件夹</a>
-                        <a href="javascript:void(0);" class="btn btn-sm" id="renameBtn">重命名</a>
-                        <a href="javascript:void(0);" class="btn btn-sm" id="delBtn">删除</a>
-                        <a href="javascript:void(0);" class="btn btn-sm" id="movetoBtn">移动到...</a>
-                        <a href="javascript:void(0);" class="btn btn-sm" id="copytoBtn">复制到...</a>
-                        <a href="" class="btn btn-sm" id="shareBtn">共享</a>
-                        <a href="" class="btn btn-sm" id="cooperateBtn">协同</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="add-folder-btn"><i class="fa fa-folder-o"></i>&nbsp;新建文件夹</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="rename-btn">重命名</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="del-btn">删除</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="move-to-btn">移动到...</a>
+                        <a href="javascript:void(0);" class="btn btn-sm" id="copy-to-btn">复制到...</a>
+                        <a href="" class="btn btn-sm" id="share-btn">共享</a>
+                        <a href="" class="btn btn-sm" id="cooperate-btn">协同</a>
                     </div>
                 </div>
                 <div class="poj-list">
@@ -363,7 +363,7 @@
     </div>
 </div>
 <!--弹出新建文件夹-->
-<div class="modal fade" id="addFolder" data-backdrop="static">
+<div class="modal fade" id="add-folder-dialog" data-backdrop="static">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
@@ -376,21 +376,20 @@
                 <form>
                     <div class="form-group">
                         <label>文件夹</label>
-                        <input type="text" class="form-control" placeholder="输入文件夹名称" id="folder-name-input">
-                        <span class="form-text text-muted">Smartcost为你提供了灵活的工程管理功能,如:</span>
-                        <span class="form-text text-muted">当你想汇总多个 <b>单位工程</b> 时,只需把它们都放在一个文件夹即可。</span>
+                        <input type="text" class="form-control" placeholder="输入文件夹名称" id="folder-name">
+                        <span class="form-text text-muted">Smartcost目前最多支持3层文件夹。</span>
                     </div>
                 </form>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="javacript:void(0);" class="btn btn-primary" id="addFolderOk">确定</a>
+                <a href="javascript:void(0);" class="btn btn-primary" id="add-folder-confirm">确定</a>
             </div>
         </div>
     </div>
 </div>
 <!--弹出重命名-->
-<div class="modal fade" id="rename" data-backdrop="static">
+<div class="modal fade" id="rename-dialog" data-backdrop="static">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
@@ -402,13 +401,13 @@
             <div class="modal-body">
                 <form>
                     <div class="form-group">
-                        <input type="text" class="form-control" placeholder="输入名称" id="newName">
+                        <input type="text" class="form-control" placeholder="输入名称" id="rename-name">
                     </div>
                 </form>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="javascript:void(0);" class="btn btn-primary" id="renameOk">确定</a>
+                <a href="javascript:void(0);" class="btn btn-primary" id="rename-confirm">确定</a>
             </div>
         </div>
     </div>
@@ -430,13 +429,13 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="javacript:void(0);" class="btn btn-danger" id="deleteProjOk">删除</a>
+                <a href="javascript:void(0);" class="btn btn-danger" id="delete-confirm">删除</a>
             </div>
         </div>
     </div>
 </div>
 <!--弹出移动到-->
-<div class="modal fade" id="moveto" data-backdrop="static">
+<div class="modal fade" id="move-to-dialog" data-backdrop="static">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
@@ -450,13 +449,13 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="javacript:void(0);" class="btn btn-primary" id="movetoOk">确定</a>
+                <a href="javacript:void(0);" class="btn btn-primary" id="move-to-confirm">确定</a>
             </div>
         </div>
     </div>
 </div>
 <!--弹出复制到-->
-<div class="modal fade" id="copyto" data-backdrop="static">
+<div class="modal fade" id="copy-to-dialog" data-backdrop="static">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
@@ -470,7 +469,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="javacript:void(0);" class="btn btn-primary" id="copytoOk">确定</a>
+                <a href="javacript:void(0);" class="btn btn-primary" id="copy-to-confirm">确定</a>
             </div>
         </div>
     </div>

+ 502 - 45
web/building_saas/pm/js/pm_main.js

@@ -60,11 +60,9 @@ let ProjTreeSetting = {
                     html.push('>', icon, '&nbsp;', text, '<a>');
                 },
                 getIcon: function (html, node) {
-
-                    // html.push('<i class ="tree-icon '+ className +'"></i>');
-                    // if (node.data.projType === 'Tender') {
-                    //     html.push('<span class="poj-icon">└</span>');
-                    // }
+                    if (node.data.projType === projectType.tender) {
+                        html.push('<span class="poj-icon">└</span>');
+                    }
                 },
                 tdBindEvent: function (td, node) {
                     if (node.data.projType === projectType.tender) {
@@ -110,28 +108,27 @@ let ProjTreeSetting = {
             }
         },
         onSelectNode: function (node) {
-            // 新建文件夹 是否可见
-            if (node.data.projType === projectType.tender) {
-                $('#addFolderBtn').hide();
-            } else {
-                $('#addFolderBtn').show();
-            }
-            // 重命名可见
-            $('#renameBtn').show();
-            // 删除可见
-            $('#delBtn').show();
-            // 移动到、复制到、共享、协同 是否可见
-            if (node.data.projType === projectType.tender) {
-                $('#movetoBtn').show();
-                $('#copytoBtn').show();
-                $('#shareBtn').show();
-                $('#cooperateBtn').show();
-            } else {
-                $('#movetoBtn').hide();
-                $('#copytoBtn').hide();
-                $('#shareBtn').hide();
-                $('#cooperateBtn').hide();
+            $(".tools-btn > a").not(".disabled").addClass("disabled");
+            switch(node.data.projType) {
+                case projectType.project:
+                    $("#add-engineering-btn").removeClass("disabled");
+                    break;
+                case projectType.folder:
+                    $("#add-folder-btn").removeClass("disabled");
+                    $("#add-project-btn").removeClass("disabled");
+                    break;
+                case projectType.engineering:
+                    $("#add-tender-btn").removeClass("disabled");
+                    break;
+                case projectType.tender:
+                    $("#move-to-btn").removeClass("disabled");
+                    $("#copy-to-btn").removeClass("disabled");
+                    $("#share-btn").removeClass("disabled");
+                    $("#cooperate-btn").removeClass("disabled");
+                    break;
             }
+            $("#del-btn").removeClass("disabled");
+            $("#rename-btn").removeClass("disabled");
             $('td:eq(0)', node.row).append($('<i class="fa fa-sort" data-toggle="tooltip" data-placement="top" title="长安拖动"></i>'));
         }
     }
@@ -141,9 +138,17 @@ $(document).ready(function() {
     init();
 
     // 新增建设项目点击
-    $('#addProjBtn').click(function () {
-        if (Tree) {
-            $('#add-add-project-dialog').modal('show');
+    $('#add-project-btn').click(function () {
+        let selectedItem = Tree.selected();
+        try {
+            let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
+                selectedItem.data.projType : projectType.folder;
+            if (selectedType !== projectType.folder) {
+                throw '建设项目只能添加到最外层或文件夹中';
+            }
+            $('#add-project-dialog').modal('show');
+        } catch (error) {
+            alert(error);
         }
     });
 
@@ -196,6 +201,237 @@ $(document).ready(function() {
         AddTender();
     });
 
+    // 新增文件夹按钮点击
+    $("#add-folder-btn").click(function() {
+        let selectedItem = Tree.selected();
+        try {
+            let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
+                    selectedItem.data.projType : projectType.folder;
+            if (selectedType !== projectType.folder) {
+                throw '文件夹只能添加在最外层或者添加在文件夹中';
+            }
+            $("#add-folder-dialog").modal("show");
+        } catch (error) {
+            alert(error);
+        }
+    });
+
+    // 新增文件夹操作
+    $("#add-folder-confirm").click(function() {
+        AddFolder();
+    });
+
+    // 删除按钮点击
+    $('#del-btn').click(function() {
+        if (Tree && Tree.selected()) {
+            $('#del').modal('show');
+        }
+    });
+
+    // 删除时文字替换
+    $('#del').on('show.bs.modal', function() {
+        let hasTenderChild = function (children) {
+            for (let i = 0; i < children.length; i++) {
+                if (children[i].children.length === 0) {
+                    if (children[i].data.projType === 'Tender') {
+                        return true;
+                    }
+                } else if (hasTenderChild(children[i].children)) {
+                    return true;
+                }
+            }
+            return false;
+        };
+        // 显示内容
+        let tenderHintElement = $('#tenderHint');
+        let folderHintElement = $('#folderHint');
+        if (Tree.selected().children.length === 0) {
+            tenderHintElement.show();
+            tenderHintElement.text('删除 "' + Tree.selected().data.name +'" ?');
+            folderHintElement.hide();
+        } else {
+            tenderHintElement.hide();
+            folderHintElement.show();
+            folderHintElement.text('删除 "'+ Tree.selected().data.name +'" 以及它包含的子项?');
+        }
+        // 显示是否可以找回
+        if (hasTenderChild([Tree.selected()])) {
+            $('#restoreHint').show();
+        } else {
+            $('#restoreHint').hide();
+        }
+    });
+
+    // 删除操作
+    $('#delete-confirm').click(function () {
+        let updateData = null;
+        let dialog = $('#del');
+        if (Tree) {
+            updateData = GetDeleteUpdateData(Tree.selected());
+            UpdateProjectData(updateData, function () {
+                dialog.modal('hide');
+                Tree.removeNode(Tree.selected());
+            });
+        }
+    });
+
+    // 重命名按钮点击
+    $('#rename-btn').click(function() {
+        if (!Tree) {
+            return false;
+        }
+        if (!Tree.selected()) {
+            alert('请选择需要重命名的数据');
+            return false;
+        }
+        $('#rename-dialog').modal('show');
+    });
+
+    // 重命名操作
+    $("#rename-confirm").click(function() {
+        let select = Tree.selected();
+        let newName = $('#rename-name').val();
+        let dialog = $('#rename-dialog');
+        if (newName === '') {
+            alert('请输入重命名的名称');
+            return false;
+        }
+
+        if (newName === select.data.name) {
+            dialog.modal('hide');
+            return false;
+        }
+
+        RenameProject(select.id(), newName, function () {
+            dialog.modal('hide');
+            select.data.name = newName;
+            Tree.refreshNodesDom([select]);
+        });
+    });
+
+    // 移动到按钮点击
+    $('#move-to-btn').click(function () {
+        if (Tree && Tree.selected()) {
+            $('#move-to-dialog').modal('show');
+        }
+    });
+
+    // 移动到窗口内容重组
+    $('#move-to-dialog').on('show.bs.modal', function () {
+        movetoZTree = ConvertTreeToZtree(Tree, $('#treeDemo'), Tree.selected());
+    });
+
+    // 移动到操作
+    $('#move-to-confirm').click(function () {
+        let updateData = null;
+        let dialog = $('#move-to-dialog');
+        let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo'));
+        let cur = Tree.selected();
+
+        if (!target) {
+            dialog.modal('hide');
+            return false;
+        }
+        if (target.data.projType !== projectType.engineering) {
+            alert("请移动到单项工程中!");
+            return false;
+        }
+
+        let parent = target;
+        let next = target.firstChild();
+        if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
+            let typeInfo = {
+                updateType: 'update',
+                projectType: null
+            };
+            updateData = GetUpdateData(parent, next, '', Tree.selected().id(), typeInfo);
+            UpdateProjectData(updateData, function (data) {
+                dialog.modal('hide');
+                Tree.move(Tree.selected(), parent, next);
+            });
+        } else {
+            dialog.modal('hide');
+        }
+    });
+
+    // 复制到按钮点击
+    $('#copy-to-btn').click(function () {
+        let selectedItem = Tree.selected();
+        try {
+            let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
+                selectedItem.data.projType : '';
+            if (selectedType !== projectType.tender) {
+                throw '请选择单位工程进行复制';
+            }
+        } catch (error) {
+            alert(error);
+            return false;
+        }
+        $('#copy-to-dialog').modal('show');
+    });
+    // 复制到弹层替换
+    $('#copy-to-dialog').on('show.bs.modal', function () {
+        copytoZTree = ConvertTreeToZtree(Tree, $('#treeDemo2'), null);
+    });
+
+    // 复制到操作
+    $("#copy-to-confirm").click(function() {
+        let dialog = $('#copy-to-dialog');
+        let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo2'));
+        let parent = null;
+        let next = null;
+        let pre = null;
+        let cur = Tree.selected();
+        if (!target) {
+            return false;
+        }
+        if (target.data.projType !== projectType.engineering) {
+            alert("请移动到单项工程中!");
+            return false;
+        }
+        if (target.data.projType !== projectType.tender && target.children.length !== 0 &&
+            target.firstChild().data.projType !== projectType.tender) {
+            dialog.modal('hide');
+        }
+
+        if (target.data.projType === projectType.tender) {
+            parent = target.parent;
+            next = target.nextSibling;
+        } else {
+            parent = target;
+            next = target.firstChild();
+        }
+
+        if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
+            CommonAjax.post('/pm/api/getNewProjectID', {count: 1, user_id: userID}, function (IDs) {
+                let typeInfo = {
+                    updateType: 'copy',
+                    projType: cur.data.projectType
+                };
+                let updateData = GetUpdateData(parent, next, cur.data.name, IDs.lowID, typeInfo);
+                updateData['srcProjectId'] = cur.id();
+                pre = GetNeedUpdatePreNode(parent, next);
+                if (pre) {
+                    updateData = {};
+                    updateData['updateType'] = 'update';
+                    updateData['updateData'] = {};
+                    updateData['updateData'][Tree.setting.tree.id] = pre.id();
+                    updateData['updateData'][Tree.setting.tree.nid] = node.tree.maxNodeId() + 1;
+                }
+                Tree.maxNodeId(IDs.lowID - 1);
+                CommonAjax.post('/pm/api/copyProjects', {updateData: updateData, user_id: userID}, function (data) {
+                    dialog.modal('hide');
+                    data.forEach(function (nodeData) {
+                        if (nodeData.updateType === 'copy') {
+                            Tree.addNodeData(nodeData.updateData, parent, next);
+                        }
+                    });
+                }, function () {
+                    dialog.modal('hide');
+                });
+            });
+        }
+    });
 });
 
 /**
@@ -210,6 +446,11 @@ function init() {
     GetAllProjectData(function (data) {
         Tree = $.fn.treeTable.init(table, ProjTreeSetting, data);
     });
+
+    // 显示默认两个可选菜单
+    $(".tools-btn > a").not(".disabled").addClass("disabled");
+    $("#add-folder-btn").removeClass("disabled");
+    $("#add-project-btn").removeClass("disabled");
 }
 
 /**
@@ -223,24 +464,36 @@ function AddProject() {
         alert('请填写工程');
         return false;
     }
+    AddChildrenItem(name, projectType.project, function() {
+        $("#add-project-dialog").modal("hide");
+    });
+}
+
+/**
+ * 新增子元素
+ *
+ * @param {String} name
+ * @param {String} type
+ * @param {function} callback
+ * @return {void}
+ */
+function AddChildrenItem(name, type, callback) {
+    let parent = Tree.selected() ? Tree.selected() : Tree._root;
+    let next = Tree.selected() ? Tree.selected().firstChild() : Tree.firstNode();
     GetNewProjectId(function(IDs) {
         let typeInfo = {
             updateType: 'new',
-            projectType: projectType.project
+            projectType: type
         };
-        let updateData = GetUpdateData(Tree._root, Tree.firstNode(), name, IDs.lowID, typeInfo);
+        let updateData = GetUpdateData(parent, next, name, IDs.lowID, typeInfo);
         Tree.maxNodeId(IDs.lowID - 1);
-        UpdateProjectData(updateData, function (datas) {
+        UpdateProjectData(updateData, function(datas){
             datas.forEach(function (data) {
-                let parent = null;
-                let next = null;
                 if (data.updateType === 'new') {
-                    parent = data.updateData.parentId === -1 ?  Tree._root : Tree.findNode(data.updateData.parentId);
-                    next = data.updateData.nextId === -1 ? null : Tree.findNode(data.updateData.nextId);
                     Tree.addNodeData(data.updateData, parent, next);
                 }
             });
-            $('#add-project-dialog').modal('hide');
+            callback();
         });
     });
 }
@@ -254,8 +507,9 @@ function AddProject() {
  * @return {void}
  */
 function AddSiblingsItem(name, type, callback) {
-    let parent = Tree.selected();
-    let next = Tree.selected().firstChild();
+    let selected = Tree.selected();
+    let parent = selected ? selected.parent : Tree._root;
+    let next = selected ? selected.nextSibling : Tree.firstNode();
     GetNewProjectId(function(IDs) {
         let typeInfo = {
             updateType: 'new',
@@ -285,7 +539,7 @@ function AddEngineering() {
         alert('请填写单项工程名称');
         return false;
     }
-    AddSiblingsItem(name, projectType.engineering, function() {
+    AddChildrenItem(name, projectType.engineering, function() {
         $("#add-engineering-dialog").modal("hide");
     });
 }
@@ -301,11 +555,40 @@ function AddTender() {
         alert('请填写单位工程名称');
         return false;
     }
-    AddSiblingsItem(name, projectType.tender, function() {
+    AddChildrenItem(name, projectType.tender, function() {
         $("#add-tender-dialog").modal("hide");
     });
 }
 
+/**
+ * 新增文件夹
+ *
+ * @return {boolean}
+ */
+function AddFolder() {
+    let name = $('#folder-name').val();
+    if (name === '') {
+        alert('请填写文件夹名称');
+        return false;
+    }
+
+    let selectedItem = Tree.selected();
+    if (selectedItem !== null) {
+        // 判断是否超过3层
+        if (selectedItem.parent !== null && selectedItem.parent.parent !== null &&
+            selectedItem.parent.parent.parent !== null) {
+            alert("文件夹不能超过3层");
+            return false;
+        }
+        AddChildrenItem(name, projectType.folder, function() {
+            $("#add-folder-dialog").modal("hide");
+        });
+    } else {
+        AddSiblingsItem(name, projectType.folder, function() {
+            $("#add-folder-dialog").modal("hide");
+        });
+    }
+}
 
 /**
  * 组织更新数据
@@ -321,14 +604,75 @@ function GetUpdateData(parent, next, name, newId, type) {
     let updateData = {};
     updateData['updateType'] = type.updateType === undefined ? 'new' : type.updateType;
     updateData['updateData'] = {};
-    updateData['updateData'][Tree.setting.tree.id] = newId;
+    if (newId !== '') {
+        updateData['updateData'][Tree.setting.tree.id] = newId;
+    }
     updateData['updateData'][Tree.setting.tree.pid] = parent ? parent.id() : -1;
     updateData['updateData'][Tree.setting.tree.nid] = next ? next.id() : -1;
-    updateData['updateData']['name'] = name;
-    updateData['updateData']['projType'] = type.projectType !== undefined ? type.projectType : 'Tender';
+    if (name !== '') {
+        updateData['updateData']['name'] = name;
+    }
+    if (type !== null && type.projectType !== null) {
+        updateData['updateData']['projType'] = type.projectType !== undefined ? type.projectType : 'Tender';
+    }
+
     data.push(updateData);
     return data;
 }
+
+/**
+ * 获取删除数据
+ *
+ * @return {Object} node
+ * @return {Object}
+ */
+function GetDeleteUpdateData(node) {
+    let datas = [], updateData,
+        pre = node.preSibling(),
+        deleteNodeData = function (node) {
+            var data = {};
+            data['updateType'] = 'delete';
+            data['updateData'] = {};
+            data['updateData'][Tree.setting.tree.id] = node.id();
+            if (node.data.projType === 'Tender') {
+                data['updateData']['FullFolder'] = GetFullFolder(node.parent);
+            }
+            return data;
+        },
+        addDeleteChildren = function (children) {
+            children.forEach(function(child){
+                datas.push(deleteNodeData(child));
+                addDeleteChildren(child.children);
+            });
+        };
+    if (pre && pre.id() !== -1) {
+        updateData = {};
+        updateData['updateType'] = 'update';
+        updateData['updateData'] = {};
+        updateData['updateData'][Tree.setting.tree.id] = pre.id();
+        updateData['updateData'][Tree.setting.tree.nid] = node ? node.nid() : -1;
+        datas.push(updateData);
+    }
+    datas.push(deleteNodeData(node));
+    addDeleteChildren(node.children);
+    return datas;
+};
+
+/**
+ * 获取父级所有名称
+ *
+ * @return {Array}
+ */
+function GetFullFolder (node) {
+    let fullFolder = [];
+    let cur = node;
+    while (cur && cur.data) {
+        fullFolder.unshift(cur.data.name);
+        cur = cur.parent;
+    }
+    return fullFolder;
+}
+
 /**
  * 获取需要更新的前节点
  *
@@ -356,4 +700,117 @@ function GetNewProjectId(callback) {
     CommonAjax.post('/pm/api/getNewProjectID', {count: 1}, function(data) {
         callback(data);
     });
-}
+}
+
+/**
+ * 重命名项目
+ *
+ * @param {Number} projectId
+ * @param {String} newName
+ * @param {function} callback
+ * @return {void}
+ */
+function RenameProject(projectId, newName, callback) {
+    $.ajax({
+        type: "POST",
+        url: '/pm/api/renameProject',
+        data: {'data': JSON.stringify({"user_id": userID, "id": projectId, "newName": newName})},
+        dataType: 'json',
+        cache: false,
+        timeout: 5000,
+        success: function(result){
+            if (result.error === 0) {
+                callback();
+            } else {
+                alert('error' + result.message);
+            }
+        },
+        error: function(iqXHR, textStatus, errorThrown){
+            alert('error ' + textStatus + " " + errorThrown)
+        }
+    });
+}
+
+/**
+ * 转换当前树结构为zTree结构
+ *
+ * @param {Object} Tree
+ * @param {Object} zTreeObj
+ * @param {Object} filterNode
+ * @return {Mixed}
+ */
+function ConvertTreeToZtree(Tree, zTreeObj, filterNode) {
+    let setting = {
+            data: {
+                simpleData: {
+                    enable:true,
+                    idKey: "id",
+                    pIdKey: "pId",
+                    rootPId: "-1"
+                }
+            }};
+        let zTreeData = [],
+        exportNodesData = function (nodes) {
+            nodes.forEach(function (node) {
+                if (node !== filterNode) {
+                    var data = {};
+                    data['id'] = node.data[Tree.setting.tree.id];
+                    data['pId'] = node.pid();
+                    data['name'] = node.data['name'];
+                    data['isParent'] = node.data.projType === 'Folder';//(node.data.projType === 'Folder' && node.children.length === 0);
+                    data['open'] = node.data.projType === 'Folder';//node.children.length !== 0;
+                    zTreeData.push(data);
+                    exportNodesData(node.children);
+                }
+            })
+        };
+    exportNodesData(Tree._root.children);
+    return $.fn.zTree.init(zTreeObj, setting, zTreeData);
+}
+
+/**
+ * 获取指定zTree节点
+ *
+ * @param {Object} zTreeObj
+ * @return {object}
+ */
+function GetTargetTreeNode(zTreeObj) {
+    if (!zTreeObj || !Tree) {
+        return null;
+    }
+
+    let ztree_selected = zTreeObj.getSelectedNodes().length === 0 ? null : zTreeObj.getSelectedNodes()[0];
+    return ztree_selected ? Tree.findNode(ztree_selected.id) : null;
+}
+
+
+var GetNextChangeUpdateData = function (datas, node, next) {
+    var data = null;
+    if (node && node.id() !== -1) {
+        data = {};
+        data['updateType'] = 'update';
+        data['updateData'] = {};
+        data['updateData'][Tree.setting.tree.id] = node.id();
+        data['updateData'][Tree.setting.tree.nid] = next ? next.id() : -1;
+        datas.push(data);
+    }
+    return data;
+}
+
+var GetMoveUpdateData = function (node, parent, next) {
+    var datas = [], updateData;
+    updateData = GetNextChangeUpdateData(datas, node.preSibling(), node.nextSibling);
+    if (next) {
+        updateData = GetNextChangeUpdateData(datas, next.preSibling(), node);
+    }
+    console.log(updateData);
+    return false;
+    updateData = {};
+    updateData['updateType'] = 'update';
+    updateData['updateData'] = {};
+    updateData['updateData'][Tree.setting.tree.id] = node.id();
+    updateData['updateData'][Tree.setting.tree.pid] = parent ? parent.id() : -1;
+    updateData['updateData'][Tree.setting.tree.nid] = next ? next.id() : -1;
+    datas.push(updateData);
+    return datas;
+};