/** * Created by Zhong on 2017/10/30. */ //测试数据 let deleteInfo = {deleteBy: 76075, deleteDateTime: '2017-10-31', deleted: true}; let temp_gc_datas = [ {ID: 1, ParentID: -1, NextSiblingID: 7, name: 'testTreeA', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, unitPriceFiles: [{name: 'uA', id: 100, root_project_id: 1, user_id: 76075, deleteInfo: deleteInfo}, {name: 'uB', id: 101, root_project_id: 1, user_id: 76075, deleteInfo: deleteInfo}], feeRateFiles: [{name: 'fA', ID: 'fr-1', rootProjectID: 1, userID: 76075, deleteInfo: deleteInfo}, {name: 'fB', ID: 'fr-2', rootProjectID: 1, userID: 76075, deleteInfo: deleteInfo}]}, {ID: 2, ParentID: 1, NextSiblingID: 3, name: 'enA', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo}, {ID: 3, ParentID: 1, NextSiblingID: -1, name: 'enB', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo}, {ID: 4, ParentID: 3, NextSiblingID: 5, name: 'tenderA', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-1', name: 'fA'}, unitPriceFile: {id: 100, name: 'uA'}}}, {ID: 5, ParentID: 3, NextSiblingID: 6, name: 'tenderB', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'unD-1', name: 'unDF'}, unitPriceFile: {id: 100, name: 'uA'}}}, {ID: 6, ParentID: 3, NextSiblingID: -1, name: 'tenderC', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-2', name: 'fB'}, unitPriceFile: {id: 101, name: 'uB'}}}, {ID: 7, ParentID: -1, NextSiblingID: 10, name: 'testTreeB', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, unitPriceFiles: [{name: 'uC', id: 102, root_project_id: 7, user_id: 76075, deleteInfo: deleteInfo}, {name: 'uD', id: 103, root_project_id: 7, user_id: 76075, deleteInfo: deleteInfo}], feeRateFiles: [{name: 'fC', ID: 'fr-3', rootProjectID: 7, userID: 76075, deleteInfo: deleteInfo}]}, {ID: 8, ParentID: 7, NextSiblingID: -1, name: 'enC', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo}, {ID: 9, ParentID: 8, NextSiblingID: -1, name: 'tenderD', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-3', name: 'fC'}, unitPriceFile: {id: 102, name: 'uC'}}}, {ID: 10, ParentID: -1, NextSiblingID: -1, name: 'testTreeC', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', unitPriceFiles: [], feeRateFiles: [{name: 'fC', ID: 'fr-3', rootProjectID: 7, userID: 76075, deleteInfo: deleteInfo}]}, {ID: 11, ParentID: 10, NextSiblingID: -1, name: 'enD', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30'}, {ID: 12, ParentID: 11, NextSiblingID: -1, name: 'tenderE', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-3', name: 'fC'}, unitPriceFile: {id: 103, name: 'uD'}}}, {ID: 13, ParentID: 2, NextSiblingID: 14, name: 'tenderF', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'unD-2', name: 'unDF2'}, unitPriceFile: {id: 102, name: 'uC'}}}, {ID: 14, ParentID: 2, NextSiblingID: 15, name: 'tenderG', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-3', name: 'fC'}, unitPriceFile: {id: 102, name: 'uC'}}}, {ID: 15, ParentID: 2, NextSiblingID: -1, name: 'tenderH', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'qwqw', name: 'qweq'}, unitPriceFile: {id: 300, name: 'u30'}}} ]; /*function getTestDatas(){ let rst = []; for(let i = 0; i < 1000; i ++){ let nid = i + 1 < 1000 ? i + 1 : -1; let obj = {ID: i, ParentID: -1, NextSiblingID: nid, name : 'test' + i, projType: 'Project', userID: 76075, createDateTime: '2017-11-3', deleteInfo: deleteInfo, unitPriceFiles: [{name: 'up' + i, id: i + 10000, deleteInfo: deleteInfo}], feeRateFiles: [{name: 'ff' + i, id: 'fr-' + i, deleteInfo: deleteInfo}]}; rst.push(obj); } return rst; }*/ let gcTree = null; let decDate = null;//恢复后的名称后缀(时间+恢复) /*let projectType = { folder: 'Folder', tender: 'Tender', project: 'Project', engineering: 'Engineering' };*/ let fileType = { unitPriceFile: 'UnitPriceFile', feeRateFile: 'FeeRateFile' }; //恢复路径t = tender, e = engineering, p = project let recPath = {t: 'T', t_e: 'T_E', t_e_p: 'T_E_P', e: 'E', e_p: 'E_P', p: 'P'}; let gcTreeSetting = { tree: { id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', btnColumn: 1, nullId: -1 }, columns: [ { head: '', data: '', width: '40', event: {} }, { head: '工程列表', data: 'name', width: '50%', 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(icon, ' ', text); }, getIcon: function (html, node) { if (node.data.projType === projectType.tender) { html.push(''); } } } }, { head: '删除日期', data: 'deleteDateTime', width: '10%', event: { getText: function (html, node, text) { if (node.data.projType === projectType.tender) { html.push(deleted(node) ? node.data.deleteInfo.deleteDateTime : ''); // 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 ? text : ''); } } } }, { head: '恢复', data: 'recovery', width: '10%', event: { getText: function (html, node, text) { if(node.data.projType === projectType.project && deleted(node)){ html.push('恢复'); } else if(node.data.projType === projectType.engineering && deleted(node)){ html.push('恢复'); } else if(node.data.projType === projectType.tender && deleted(node)){ html.push('恢复'); } else { html.push(''); } }, tdBindEvent: function(td, node){ $('a:eq(0)' ,td).bind('click', function () { let tenderNodes = m_getTenders(node); $('#rePoj .modal-header').empty(); $('p', '#rePoj .modal-body').remove(); $('#rePoj .modal-header').html(v_getTitle(node)); $('#rePoj .modal-body').html(v_getMoBody(node, tenderNodes)); console.log(node); console.log(node.preSibling()); //test 获取更新的数据 /*let updateDatas = m_getRecDatas(node); console.log(updateDatas);*/ }); } } }, { head: '单价文件', data: 'unitPriceFiles', width: '10%', event: { getText: function (html, node, text) { if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){ html.push('恢复'); } }, tdBindEvent: function (td, node) { $('a:eq(0)', td).bind('click', function () { let unitPriceFiles = node.data.unitPriceFiles; $('#reFile h5').text('恢复单价文件'); $('tr', '#reFile tbody').remove(); $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles)); }); } } }, { head: '费率文件', data: 'feeRateFiles', width: '10%', event: { getText: function (html, node, text) { if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){ html.push('恢复'); } }, tdBindEvent: function (td, node) { $('a:eq(0)', td).bind('click', function () { let feeRateFiles = node.data.feeRateFiles; $('#reFile h5').text('恢复费率文件'); $('tr', '#reFile tbody').remove(); $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles)); }); } } } ] }; $(document).ready(function () { $('#tab_pm_gc').on('show.bs.tab', function () { gc_init(); Tree = null; }); e_recFiles($('#reFileBtn')); e_recProj($('#rePojBtn')); }); function gc_init(){ let table = $('#gcTree'); $('thead', table).remove(); $('tbody', table).remove(); m_buildVirtualTree(temp_gc_datas); gcTree = $.fn.treeTable.init(table, gcTreeSetting, temp_gc_datas); //gcTree = $.fn.treeTable.init(table, gcTreeSetting, getTestDatas()); } //项目恢复模态框标题 function v_getTitle(node){ let html = ''; html += ''; } else if(node.data.projType === projectType.engineering){ html += '单项工程'; } else if(node.data.projType === projectType.tender){ html += '单位工程'; } html += ''; return html; } //项目恢复模态框主体 function v_getMoBody(oprNode, nodes){ let html = ''; if(oprNode.data.projType === projectType.tender){ decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)'; let recName = oprNode.data.name + decDate; html += '

恢复后将重命名为 ' + recName + '

'; } else { if(oprNode.data.projType === projectType.project){ html += '

' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为

'; } else if(oprNode.data.projType === projectType.engineering){ html += '

' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为

'; } html += ('

'); for(let i = 0, len = nodes.length; i < len; i++){ let recName = nodes[i].data.name + '(' + new Date().Format('MM-dd hh:mm:ss') +'恢复)'; html += '' + recName + '、'; } html = html.slice(0, html.length - 1); html += ('

'); } html += ('

点“确定”按钮,确认从回收站中恢复

'); return html; } //单价、费率文件恢复弹出框数据 function v_getFiles(type, files){ let html = ''; for(let i = 0, len = files.length; i < len; i ++){ let recName = type === fileType.unitPriceFile ? files[i].name + '单价文件' : files[i].name + '费率文件'; let fileId = type === fileType.unitPriceFile ? files[i].id : files[i].ID; let recTime = new Date(); let recTimeA = recTime.Format('yyyy-MM-dd'); let recTimeB = recTime.Format('hh:mm:ss'); html += ''+ recName +'' + recTimeA + '
' + recTimeB + ''; } return html; } //恢复单价、费率文件后前端显示变化 function v_recFiles(project, fileIds, type){ let projFiles; if(type === fileType.unitPriceFile){ projFiles = project.data.unitPriceFiles; } else if(type === fileType.feeRateFile){ projFiles = project.data.feeRateFiles; } if(projFiles && projFiles.length > 0){ let tempFiles = []; for(let i = 0, len = projFiles.length; i < len; i++){ let isExist = false; for(let j = 0, jLen = fileIds.length; j < jLen; j++){ let id = projFiles[i].id || projFiles[i].ID || null; if(id && id === fileIds[j]){ isExist = true; } } if(!isExist){ tempFiles.push(projFiles[i]); } } if(type === fileType.unitPriceFile){ project.data.unitPriceFiles = tempFiles; } else if(type === fileType.feeRateFile){ project.data.feeRateFiles = tempFiles; } } } function v_removeNode(node){ gcTree.removeNode(node); let parent = node.parent || null; if(parent && parent.children.length === 0 && parent.data !== undefined){ v_removeNode(parent); } } function v_refreshNode(node){ if(deleted(node)){ delete node.data.deleteInfo; } gcTree.refreshNodesDom([node]); let parent = node.parent || null; if(parent && parent.data !== undefined){ v_refreshNode(parent); } } //将获取的回收站中的数据建虚拟树 function m_buildVirtualTree(datas){ for(let i = 0, len = datas.length; i < len; i++){ let children = datas[i].children || null; if(children){ m_buildVirtualTree(children); } let next = datas[i+1] || null; if(next){ datas[i].NextSiblingID = next.ID; } else { datas[i].NextSiblingID = -1; } } } //获得当前节点的tenders数据,模态提示框用 function m_getTenders(node){ if(node.data.projType === projectType.tender) return [node]; else { let rst = []; if(node.children.length > 0){ node.children.forEach(function (cNode) { if(cNode.children.length > 0){ cNode.children.forEach(function (ccNode) { if(ccNode.data.projType === projectType.tender) rst.push(ccNode); }); } else if(cNode.children.length === 0 && cNode.data.projType === projectType.tender){ rst.push(cNode); } }); } return rst; } } //获得要更新的数据(包含恢复的数据,维护项目管理树的数据) function m_getRecDatas(oprNode){ let rst = Object.create(null); let rstProj = [], rstFile = []; let path; if(oprNode.data.projType === projectType.tender){ path = recPath.t; let engineering = oprNode.parent || null; if(!engineering) return null; let project = engineering.parent || null; if(!project) return null; if(engineering && deleted(engineering)){ path = recPath.t_e; } //恢复建设项目 if(project && deleted(project)){ path = recPath.t_e_p; } //恢复单价、费率文件 rstFile = rstFile.concat(getUpdateFiles([oprNode], project)); if(path === recPath.t){ rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, true)); } else if(path === recPath.t_e){ rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false)); rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, true)); } else if(path === recPath.t_e_p){ rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false)); rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, false)); rstProj = rstProj.concat(getUpdateDatas(projectType.project, project, true, false)); } } else if(oprNode.data.projType === projectType.engineering){ path = recPath.e; let project = oprNode.parent || null; if(!project) return null; //恢复建设项目 if(project && deleted(project)){ path = recPath.e_p; } let tenders = oprNode.children; if(tenders.length > 0){ for(let i = 0, len = tenders.length; i < len; i++){ rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[i], true, false)); } //恢复单价、费率文件 rstFile = rstFile.concat(getUpdateFiles(tenders, project)); } if(path === recPath.e){ rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, true)); } else if(path === recPath.e_p){ rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, false)); rstProj= rstProj.concat(getUpdateDatas(projectType.project, project, true, false)); } } else if(oprNode.data.projType === projectType.project){ path = recPath.p; let engineerings = oprNode.children; if(engineerings.length > 0){ let allTenders = []; for(let i = 0, len = engineerings.length; i < len; i++){ //恢复单项工程 rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineerings[i], false, false)); let tenders = engineerings[i].children; allTenders = allTenders.concat(tenders); for(let j = 0, jLen = tenders.length; j < jLen; j++){ //恢复单位工程 rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[j], false, false)); } } //恢复单价、费率文件 rstFile = rstFile.concat(getUpdateFiles(allTenders, oprNode)); } //恢复建设项目 rstProj = rstProj.concat(getUpdateDatas(projectType.project, oprNode, false, false)); } console.log(path); rst.proj = rstProj; rst.file = rstFile; return rst; } //获得勾选的单价、费率文件的id function m_getFilesIds(nodes){ let rstSet = new Set(); for(let i = 0, len = nodes.length; i < len; i++){ let fileId = $(nodes[i]).attr('fileId') || null; if(fileId){ if($(nodes[i]).attr('fileType') === fileType.unitPriceFile){ fileId = parseInt(fileId); } rstSet.add(fileId); } } return Array.from(rstSet); } function m_project(node){ if(node && node.data.projType === projectType.project) return node; if(!node) return null; let parent = node.parent || null; if(!parent) return null; if(parent && parent.data.projType === projectType.project) return parent; let gParent = parent.parent || null; if(!gParent) return null; if(gParent && gParent.data.projType === projectType.project) return gParent; return null; } //点击单价文件、费率文件下的恢复操作(确认) function e_recFiles(btn){ btn.bind('click', function () { let recIds = m_getFilesIds($('[name = "fileItems"]:checked')); let fileType = $('[name = "fileItems"]:checked').attr('fileType'); let selected = gcTree.selected(); //backend let updateDatas = []; for(let i = 0, len = recIds.length; i < len; i++){ updateDatas.push(getUpdateObj(fileType, {id: recIds[i]}, {deleteInfo: null})); } //front if(recIds.length > 0){ v_recFiles(selected, recIds, fileType); if(deleted(selected)){ delete selected.data.deleteInfo; } gcTree.refreshNodesDom([selected]); } }); } //点击项目下的恢复操作(确认 function e_recProj(btn){ btn.bind('click', function () { let selected = gcTree.selected(); //backend let updateObj = m_getRecDatas(selected); let updateDatas = updateObj.proj.concat(updateObj.file); let fileObj = getRecFileObj(updateObj.file); console.log(updateObj); //保存成功后回调front //front let project = m_project(selected); if(project){ if(fileObj[fileType.unitPriceFile].length > 0){ v_recFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile); } if(fileObj[fileType.feeRateFile].length > 0){ v_recFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile); } } v_removeNode(selected); v_refreshNode(selected); }); } function a_getGC(callback){ $.ajax({ type: 'post', url: '/pm/api/getGCDatas', dataType: 'json', timeout: 5000, success: function (result) { if(!result.error){ if(callback){ callback(result.data); } } } }) } function a_rec(nodes, callback){ $.ajax({ type: 'post', url: '/pm/api/recGC', data: {nodes: JSON.stringify(nodes)}, dataType: 'json', timeout: 5000, success: function (result) { if(!result.error){ if(callback){ callback(); } } } }) } function deleted(node){ return node.data.deleteInfo !== undefined && node.data.deleteInfo.deleted; } function fIsExist(files, id, type){ let isExist = false; for(let i = 0, len = files.length; i < len; i++){ if((type === fileType.unitPriceFile && files[i].id === id) || (type === fileType.feeRateFile && files[i].ID === id)){ isExist = true; break; } } return isExist; } function getRecFileObj(files){ let rst = Object.create(null); let rst_UF = [], rst_FF = []; for(let i = 0, len = files.length; i < len; i++){ if(files[i].findData !== undefined && files[i].findData.id !== undefined){ if(files[i].updateType === fileType.unitPriceFile){ rst_UF.push(files[i].findData.id); } else if(files[i].updateType === fileType.feeRateFile){ rst_FF.push(files[i].findData.id); } } } rst[fileType.unitPriceFile] = rst_UF; rst[fileType.feeRateFile] = rst_FF; return rst; } function getUpdateObj(updateType, findData, updateData){ let obj = Object.create(null); obj.updateType = updateType; obj.findData = findData; obj.updateData = updateData; return obj; } function getUpdateDatas(updateType, node, mtNID, mtPM){ let rst = []; if(!decDate){ decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)'; } if(updateType === projectType.tender || updateType === projectType.engineering){ //维护回收站树 /* if(mtGC){ rst.push(getUpdateObj(updateType, {NextSiblingID: node.data.ID, 'deleteInfo.deleted': true}, {NextSiblingID: node.data.NextSiblingID})); }*/ //维护项目管理树 if(mtPM){ rst.push(getUpdateObj(updateType, {ParentID: node.data.ParentID, NextSiblingID: -1, deleteInfo: null}, {NextSiblingID: node.data.ID})); } //恢复 if(mtNID){ rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null, NextSiblingID: -1})); } else { rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null})); } } else if(updateType === projectType.project){ /* //维护回收站树 if(mtGC){ rst.push(getUpdateObj(updateType, {NextSiblingID: node.data.ID, 'deleteInfo.deleted': true}, {NextSiblingID: node.data.NextSiblingID})); }*/ //恢复 rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null}));//NextSibling为undefined,后端处理 } return rst; } //unitPriceFile or feeRateFile function getUpdateFiles(tenders, project){ let unitFiles = [], feeFiles = [], rst = []; for(let i = 0, len = tenders.length; i < len; i++){ //恢复单价文件 if(project && project.data.unitPriceFiles.length > 0 && fIsExist(project.data.unitPriceFiles, tenders[i].data.property.unitPriceFile.id, fileType.unitPriceFile)){ unitFiles.push(tenders[i].data.property.unitPriceFile.id); } //恢复费率文件 if(project && project.data.feeRateFiles.length > 0 && fIsExist(project.data.feeRateFiles, tenders[i].data.property.feeFile.id, fileType.feeRateFile)){ feeFiles.push(tenders[i].data.property.feeFile.id); } } let ufIds = Array.from(new Set(unitFiles)); let ffIds = Array.from(new Set(feeFiles)); for(let i = 0, len = ufIds.length; i < len; i++){ rst.push(getUpdateObj(fileType.unitPriceFile, {id: ufIds[i]}, {deleteInfo: null})); } for(let i = 0, len = ffIds.length; i < len; i++){ rst.push(getUpdateObj(fileType.feeRateFile, {id: ffIds[i]}, {deleteInfo: null})); } return rst; }