/** * Created by Zhong on 2017/10/30. */ let gcTree = null; let decDate = null;//恢复后的名称后缀(时间+恢复) //恢复路径t = tender, e = engineering, p = project const 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) { if(deleted(node)){ let localDateTime = new Date(node.data.deleteInfo.deleteDateTime).toLocaleDateString(); html.push(new Date(localDateTime).Format('yyyy-MM-dd')); } else{ html.push(''); } } } } }, { head: '创建日期', data: 'createDateTime', width: '10%', event: { getText: function (html, node, text) { if (node.data.projType === projectType.tender) { if(deleted(node)){ let localDateTime = new Date(text).toLocaleDateString(); html.push(new Date(localDateTime).Format('yyyy-MM-dd')); } else{ html.push(''); } } } } }, { 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)); }); } } }, { 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_waiting').show(); gc_init(); Tree = null; }); e_recFiles($('#reFileBtn')); e_recProj($('#rePojBtn')); }); function gc_init(){ let table = $('#gcTree'); $('thead', table).remove(); $('tbody', table).remove(); a_getGC(function (datas) { m_buildVirtualTree(datas); let normalDatas = m_VTreeToDatas(datas); gcTree = $.fn.treeTable.init(table, gcTreeSetting, normalDatas); $('#gc_waiting').hide(); }); } //项目恢复模态框标题 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; break; } } 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){ if(parent.data.projType === projectType.project && fileEmpty(parent)){ v_removeNode(parent); } else if(parent.data.projType !== projectType.project){ 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++){ if(datas[i].projType === projectType.project){ datas[i].ParentID = -1; } 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; } } } function m_VTreeToDatas(datas){ let rst = []; let projs = datas; rst = rst.concat(projs); for(let i = 0, len = projs.length; i < len; i++){ let p_engs = projs[i].children || null; if(p_engs){ rst = rst.concat(p_engs); for(let j = 0, jLen = p_engs.length; j < jLen; j ++){ let e_tenders = p_engs[j].children || null; if(e_tenders){ rst = rst.concat(e_tenders); } } } } return rst; } //获得当前节点的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)); } rstProj = deWeightName(rstProj); //恢复单价、费率文件 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 = [], rstEngs = []; for(let i = 0, len = engineerings.length; i < len; i++){ //恢复单项工程 rstEngs = rstEngs.concat(getUpdateDatas(projectType.engineering, engineerings[i], false, false)); let tenders = engineerings[i].children; allTenders = allTenders.concat(tenders); let rstTends = []; for(let j = 0, jLen = tenders.length; j < jLen; j++){ //恢复单位工程 rstTends = rstTends.concat(getUpdateDatas(projectType.tender, tenders[j], false, false)); } //去除重名 rstTends = deWeightName(rstTends); rstProj = rstProj.concat(rstTends); } //去除重名 rstEngs = deWeightName(rstEngs); rstProj = rstProj.concat(rstEngs); //恢复单价、费率文件 rstFile = rstFile.concat(getUpdateFiles(allTenders, oprNode)); } //恢复建设项目 rstProj = rstProj.concat(getUpdateDatas(projectType.project, oprNode, false, false)); } rst.proj = rstProj; rst.file = rstFile; return rst; } //获得勾选的单价、费率文件的id function m_getFilesObjs(nodes){ let rst = []; for(let i = 0, len = nodes.length; i < len; i++){ let fileId = $(nodes[i]).attr('fileId') || null; if(fileId){ let dispName = $('td:eq(0)', $(nodes[i])[0].parentNode.parentNode)[0].textContent; let name = dispName.slice(0, dispName.length - 4); if($(nodes[i]).attr('fileType') === fileType.unitPriceFile){ fileId = parseInt(fileId); } let obj = Object.create(null); obj.id = fileId; obj.name = name; rst.push(obj); } } return rst; } 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 () { decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)'; let recObjs = m_getFilesObjs($('[name = "fileItems"]:checked')); let recIds = []; for(let i of recObjs){ recIds.push(i.id); } let type = $('[name = "fileItems"]:checked').attr('fileType'); let selected = gcTree.selected(); //backend let updateDatas = []; for(let i = 0, len = recObjs.length; i < len; i++){ let findData = type === fileType.unitPriceFile ? {id: recObjs[i].id} : {ID: recObjs[i].id}; updateDatas.push(getUpdateObj(type, findData, {deleteInfo: null, name: delPostFix(recObjs[i].name) + decDate})); } //恢复建设项目 if(updateDatas.length > 0 && deleted(selected)){ updateDatas.push(getUpdateObj(projectType.project, {ID: selected.data.ID}, {deleteInfo: null, name: delPostFix(selected.data.name) + decDate})); } updateDatas = deWeightName(updateDatas); a_rec(updateDatas, caller); function caller(){ //front if(recIds.length > 0){ v_recFiles(selected, recIds, type); if(deleted(selected)){ delete selected.data.deleteInfo; } if(fileEmpty(selected) && selected.children.length === 0){ gcTree.removeNode(selected); } else { 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); //保存成功后回调front a_rec(updateDatas, caller); function caller() { 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){ CommonAjax.post('/pm/api/getGCDatas', {user_id: userID}, function (rstData) { if(callback){ callback(rstData); } }); } function a_rec(nodes, callback){ CommonAjax.post('/pm/api/recGC', {user_id: userID, nodes: nodes}, function (rstData) { if(callback){ callback(); } }); } //去除重名,回收站不处理重名,只保证恢复到项目管理中不出现重名 function deWeightName(datas){ let rst = []; let _deWeight = Object.create(null), prefix = 'name_'; //按同名分组 for(let i = 0, len = datas.length; i < len; i++){ let data = datas[i]; let _names = _deWeight[prefix + data.updateData.name] || null; if(!_names){ _names = _deWeight[prefix + data.updateData.name] = []; } if(_names){ _names.push(data); } } for(let _name in _deWeight){ let sameNameDatas = _deWeight[_name]; let count = 0; for(let i = 0, len = sameNameDatas.length; i < len; i++){ let postFix = '(' + count + ')'; if(i > 0){ sameNameDatas[i].updateData.name = sameNameDatas[i].updateData.name + postFix; } count ++; rst.push(sameNameDatas[i]); } } return rst; } //去除名称后缀(Date恢复) function delPostFix (str){ let rst = ''; rst = delPostRecFix(delPostNameFix(str)); return rst; } function delPostRecFix (str){ let rst = ''; let re = /(+[0-9]{2}-[0-9]{2}\s+[0-9]{2}:[0-9]{2}:[0-9]{2}恢复)/g; rst = str.replace(re, ''); return rst; } function delPostNameFix (str){ let rst = ''; let re = /(+[0-9][0-9]*)/g; rst = str.replace(re, ''); return rst; } function deleted(node){ return node.data.deleteInfo !== undefined && node.data.deleteInfo && node.data.deleteInfo.deleted; } function fileEmpty(node){ return node.data.unitPriceFiles.length === 0 && node.data.feeRateFiles.length === 0; } 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 === parseInt(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){ if(files[i].updateType === fileType.unitPriceFile && files[i].findData.id !== undefined){ rst_UF.push(files[i].findData.id); } else if(files[i].updateType === fileType.feeRateFile && files[i].findData.ID !== undefined){ 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 = []; decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)'; let newName = delPostFix(node.data.name) + decDate; if(updateType === projectType.tender || updateType === projectType.engineering){ //维护项目管理树 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: newName, deleteInfo: null, NextSiblingID: -1})); } else { rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {name: newName, deleteInfo: null})); } } else if(updateType === projectType.project){ //恢复 rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {deleteInfo: null, name: newName}));//NextSibling为undefined,后端处理 } return rst; } //unitPriceFile or feeRateFile function getUpdateFiles(tenders, project){ let rstUF = [], rstFF = [], rst = []; let _unitFiles = Object.create(null), _feeFiles = Object.create(null), prefix = '_id'; decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)'; 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); let propId = tenders[i].data.property.unitPriceFile.id; let propName = tenders[i].data.property.unitPriceFile.name; let _uf = _unitFiles[prefix + propId] || null; if(!_uf){ let obj = Object.create(null); obj.id = parseInt(propId); obj.name = propName; _unitFiles[prefix + propId] = obj; } } //恢复费率文件 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 propId = tenders[i].data.property.feeFile.id; let propName = tenders[i].data.property.feeFile.name; let _ff = _feeFiles[prefix + propId] || null; if(!_ff){ let obj = Object.create(null); obj.id = propId; obj.name = propName; _feeFiles[prefix + propId] = obj; } } } for(let uf in _unitFiles){ rstUF.push(getUpdateObj(fileType.unitPriceFile, {id: _unitFiles[uf].id}, {deleteInfo: null, name: delPostFix(_unitFiles[uf].name) + decDate})); } for(let ff in _feeFiles){ rstFF.push(getUpdateObj(fileType.feeRateFile, {ID: _feeFiles[ff].id}, {deleteInfo: null, name: delPostFix(_feeFiles[ff].name) + decDate})); } rst = rst.concat(deWeightName(rstUF)); rst = rst.concat(deWeightName(rstFF)); return rst; }