/** * 项目管理相关js * * @author CaiAoLin * @date 2017/8/22 * @version */ let Tree = null; let movetoZTree = null; let copytoZTree = null; let engineering = []; let feeRateData = []; let projectType = { folder: 'Folder', tender: 'Tender', project: 'Project', engineering: 'Engineering' }; let ProjTreeSetting = { tree: { id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', btnColumn: 1, nullId: -1 }, columns: [ { head: '', data: '', width: '40', event: {} }, { head: '工程列表', data: 'name', width: '78%', event: { getText: function (html, node, text) { let className = ''; switch (node.data.projType) { case projectType.folder: className = "fa fa-folder-open-o"; break; case projectType.tender: className = "fa fa-sticky-note-o"; break; case projectType.project: className = "fa fa-cubes"; break; case projectType.engineering: className = "fa fa-cube"; break; } let icon = ''; html.push((node && node.data && node.data.projType === projectType.folder) ? ' ' : ''); html.push('', icon, ' ', text, ''); }, getIcon: function (html, node) { if (node.data.projType === projectType.tender) { html.push(''); } }, tdBindEvent: function (td, node) { if (node.data.projType === projectType.tender) { $('a:eq(1)', td).bind('click', function () { BeforeOpenProject(node.id(), {'fullFolder': GetFullFolder(node.parent)}, function () { window.location.href = '/main?project=' + node.id(); }); return false; }); } } } }, { head: '最近使用', data: 'lastDateTime', width: '10%', event: { getText: function (html, node, text) { if (node.data.projType === projectType.tender) { html.push(text ? new Date(text).Format('yyyy-MM-dd') : ''); } } } }, { head: '创建日期', data: 'createDateTime', width: '10%', event: { getText: function (html, node, text) { if (node.data.projType === projectType.tender) { html.push(text ? new Date(text).Format('yyyy-MM-dd') : ''); } } } } ], viewEvent: { beforeSelect: function (node) { if (node && node.row) { $('td:eq(0)', node.row).children().remove(); } }, onSelectNode: function (node) { $(".tools-btn > a").not(".disabled").addClass("disabled"); switch(node.data.projType) { case projectType.project: $("#add-engineering-btn").removeClass("disabled"); $("#add-project-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"); $("#add-engineering-btn").removeClass("disabled"); break; case projectType.tender: $("#add-tender-btn").removeClass("disabled"); $("#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($('')); } } }; $(document).ready(function() { init(); // 新增建设项目点击 $('#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 && selectedType !== projectType.project) { throw '建设项目只能添加到最外层或文件夹中'; } $('#add-project-dialog').modal('show'); } catch (error) { alert(error); } }); // 新增建设项目操作 $('#addProjOk').click(function () { AddProject(); }); // 选择计价方式 $("input[name='valuation_type']").click(function() { let type = $(this).val(); let targetData = type === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation); let html = ''; for(let valuation of targetData) { if (valuation === null) { continue; } html += ''; } $("#valuation").html(html); }); // 新增单项项目点击 $("#add-engineering-btn").click(function() { let selectedItem = Tree.selected(); try { if (selectedItem === null) { throw '请选择要添加到的项目工程'; } let selectedType = selectedItem.data !== undefined ? selectedItem.data.projType : ''; if (selectedType !== projectType.project && selectedType !== projectType.engineering) { throw '单项项目只能添加到建设项目中'; } $("#add-engineering-dialog").modal("show"); } catch (error) { alert(error); } }); // 新增单项工程操作 $("#add-engineering-confirm").click(function() { AddEngineering(); }); // 新增单位工程点击 $("#add-tender-btn").click(function() { let selectedItem = Tree.selected(); try { if (selectedItem === null) { throw '请选择要添加到的单项工程'; } let selectedType = selectedItem.data !== undefined ? selectedItem.data.projType : ''; if (selectedType !== projectType.engineering && selectedType !== projectType.tender) { throw '单项项目只能添加到单项工程中'; } $("#add-tender-dialog").modal("show"); } catch (error) { alert(error); } }); // 新增单位工程弹层改变 $('#add-tender-dialog').on('show.bs.modal', function() { // 当前选中的建设项目 let selectedItem = Tree.selected(); let projectInfo = null; if (selectedItem.data.projType === projectType.tender) { projectInfo = selectedItem !== null && selectedItem.parent !== undefined && selectedItem.parent.parent !== undefined ? selectedItem.parent.parent : null; } else { projectInfo = selectedItem !== null && selectedItem.parent !== undefined ? selectedItem.parent : null; } if (projectInfo !== null) { let savedProjectData = localStorage.getItem(projectInfo.data.name); console.log(savedProjectData); savedProjectData = JSON.parse(savedProjectData); // 填入计价规则 let valuationHtml = ''; $("#tender-valuation").html(valuationHtml); // 填入工程专业 let engineeringHtml = getEngineeringHtml(savedProjectData.engineeringList); $("#tender-engineering").html(engineeringHtml); $("input[name='tender_valuation_type']").attr('disabled', 'disabled').removeAttr('checked', 'checked'); $("input[name='tender_valuation_type'][value='"+ savedProjectData.valuationType +"']") .attr("checked", "checked").removeAttr('disabled', 'disabled'); // 填入费率文件 let feeHtml = ''; // for (let fee of savedProjectData.feeLib) { // feeHtml += ''; // } $("#tender-fee-rate").html(feeHtml); } }); // 新增单位工程 $("#add-tender-confirm").click(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'); }); }); } }); }); /** * 初始化数据 * * @return {void} */ function init() { let table = $('#ProjTree'); $('thead', table).remove(); $('tbody', table).remove(); 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"); engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : []; } /** * 新增建设项目 * * @return {boolean} */ function AddProject() { let name = $('#project-name').val(); if (name === '') { alert('请填写工程'); return false; } let valuation = $("#valuation").val(); if (valuation === '') { alert("请选择计价规则"); return false; } let valuationName = $("#valuation").children("option:selected").text(); let valuationType = $("input[name='valuation_type']:checked").val(); let engineeringList = []; let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation); for(let tmp of valuationData) { if (tmp._id === valuation) { engineeringList = tmp.engineering_list; break; } } let callback = function() { $("#add-project-dialog").modal("hide"); // 记录选择后的信息 let projectInfo = { valuation: valuation, valuationType: valuationType, valuationName: valuationName, engineeringList: engineeringList, }; localStorage.setItem(name, JSON.stringify(projectInfo)); }; let selectedItem = Tree.selected(); // 如果选择的是建设项目则新增同级数据 if (selectedItem !== null && selectedItem.data.projType === projectType.project) { AddSiblingsItem(name, projectType.project, callback); } else { AddChildrenItem(name, projectType.project, callback); } } /** * 新增子元素 * * @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: type }; let updateData = GetUpdateData(parent, next, name, IDs.lowID, typeInfo); Tree.maxNodeId(IDs.lowID - 1); UpdateProjectData(updateData, function(datas){ datas.forEach(function (data) { if (data.updateType === 'new') { Tree.addNodeData(data.updateData, parent, next); } }); callback(); }); }); } /** * 新增同级元素 * * @param {String} name * @param {String} type * @param {function} callback * @return {void} */ function AddSiblingsItem(name, type, callback) { 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', projectType: type }; let updateData = GetUpdateData(parent, next, name, IDs.lowID, typeInfo); Tree.maxNodeId(IDs.lowID - 1); UpdateProjectData(updateData, function(datas){ datas.forEach(function (data) { if (data.updateType === 'new') { Tree.addNodeData(data.updateData, parent, next); } }); callback(); }); }); } /** * 新增单项工程 * * @return {boolean} */ function AddEngineering() { let name = $('#engineering-name').val(); if (name === '') { alert('请填写单项工程名称'); return false; } let callback = function() { $("#add-engineering-dialog").modal("hide"); }; let selectedItem = Tree.selected(); // 如果选择的是单项工程则新增同级数据 if (selectedItem !== null && selectedItem.data.projType === projectType.engineering) { AddSiblingsItem(name, projectType.engineering, callback); } else { AddChildrenItem(name, projectType.engineering, callback); } } /** * 新增单位工程 * * @return {boolean} */ function AddTender() { let name = $('#tender-name').val(); if (name === '') { alert('请填写单位工程名称'); return false; } let callback = function() { $("#add-tender-dialog").modal("hide"); }; let selectedItem = Tree.selected(); // 如果选择的是单项工程则新增同级数据 if (selectedItem !== null && selectedItem.data.projType === projectType.tender) { AddSiblingsItem(name, projectType.tender, callback); } else { AddChildrenItem(name, projectType.tender, callback); } } /** * 新增文件夹 * * @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"); }); } } /** * 组织更新数据 * * @param {Object} parent * @param {Object} next * @param {String} name * @param {Object} type * @return {Object} */ function GetUpdateData(parent, next, name, newId, type) { let data = []; let updateData = {}; updateData['updateType'] = type.updateType === undefined ? 'new' : type.updateType; updateData['updateData'] = {}; 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; 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; } /** * 获取需要更新的前节点 * * @param {Object} parent * @param {Object} next * @return {Object} */ function GetNeedUpdatePreNode(parent, next) { if (next) { return next.preSibling(); } else if (parent) { return parent.firstChild(); } else { return null; } } /** * 获取最新id * * @param {function} callback * @return {void} */ 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; } /** * 根据指定id获取对应的工程专业 * * @param {Array} engineeringList * @return {String} */ function getEngineeringHtml(engineeringList) { let result = ''; if (engineeringList.length <= 0) { return result; } let engineeringObject = {}; for(let tmp of engineering) { engineeringObject[tmp.value] = tmp.name; } for(let tmp of engineeringList) { if (engineeringObject[tmp.engineering] !== undefined) { result += ''; } } return result; }