|
@@ -0,0 +1,656 @@
|
|
|
+/**
|
|
|
+ * 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 = '<i class ="tree-icon '+ className +'"></i>';
|
|
|
+ html.push(icon, ' ', text);
|
|
|
+ },
|
|
|
+ getIcon: function (html, node) {
|
|
|
+ if (node.data.projType === projectType.tender) {
|
|
|
+ html.push('<span class="poj-icon">└</span>');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ 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('<a href="javascript:void(0);" data-toggle="modal" data-target="#rePoj">恢复</a>');
|
|
|
+ }
|
|
|
+ else if(node.data.projType === projectType.engineering && deleted(node)){
|
|
|
+ html.push('<a href="javascript:void(0);" data-toggle="modal" data-target="#rePoj">恢复</a>');
|
|
|
+ }
|
|
|
+ else if(node.data.projType === projectType.tender && deleted(node)){
|
|
|
+ html.push('<a href="javascript:void(0);" data-toggle="modal" data-target="#rePoj">恢复</a>');
|
|
|
+ }
|
|
|
+ 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('<a href="javascript:void(0);" data-toggle="modal" data-target="#reFile">恢复</a>');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ 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('<a href="javascript:void(0);" data-toggle="modal" data-target="#reFile">恢复</a>');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ 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 += '<h5 class="modal-title">恢复 ';
|
|
|
+ if(node.data.projType === projectType.project){
|
|
|
+ html += '<i class="fa fa-cubes"></i>建设项目</h5>';
|
|
|
+ }
|
|
|
+ else if(node.data.projType === projectType.engineering){
|
|
|
+ html += '<i class="fa fa-cube"></i>单项工程</h5>';
|
|
|
+ }
|
|
|
+ else if(node.data.projType === projectType.tender){
|
|
|
+ html += '<i class="fa fa-sticky-note-o"></i>单位工程</h5>';
|
|
|
+ }
|
|
|
+ html += '<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>';
|
|
|
+ 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 += '<p>恢复后将重命名为 <b>' + recName + '</b></p>';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if(oprNode.data.projType === projectType.project){
|
|
|
+ html += '<p><i class="fa fa-cubes"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
|
|
|
+ }
|
|
|
+ else if(oprNode.data.projType === projectType.engineering){
|
|
|
+ html += '<p><i class="fa fa-cube"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
|
|
|
+ }
|
|
|
+ html += ('<p>');
|
|
|
+ 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 += '<b>' + recName + '</b>、';
|
|
|
+ }
|
|
|
+ html = html.slice(0, html.length - 1);
|
|
|
+ html += ('</p>');
|
|
|
+ }
|
|
|
+
|
|
|
+ html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
|
|
|
+ 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 += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+}
|