|  | @@ -1,55 +1,10 @@
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 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'};
 | 
	
		
			
				|  |  | +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',
 | 
	
	
		
			
				|  | @@ -103,9 +58,13 @@ let gcTreeSetting = {
 | 
	
		
			
				|  |  |              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') : '');
 | 
	
		
			
				|  |  | +                        if(deleted(node)){
 | 
	
		
			
				|  |  | +                            let localDateTime = new Date(node.data.deleteInfo.deleteDateTime).toLocaleDateString();
 | 
	
		
			
				|  |  | +                            html.push(new Date(localDateTime).Format('yyyy-MM-dd'));
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        else{
 | 
	
		
			
				|  |  | +                            html.push('');
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -117,7 +76,13 @@ let gcTreeSetting = {
 | 
	
		
			
				|  |  |              event: {
 | 
	
		
			
				|  |  |                  getText: function (html, node, text) {
 | 
	
		
			
				|  |  |                      if (node.data.projType === projectType.tender) {
 | 
	
		
			
				|  |  | -                      html.push(text ? text : '');
 | 
	
		
			
				|  |  | +                        if(deleted(node)){
 | 
	
		
			
				|  |  | +                            let localDateTime = new Date(text).toLocaleDateString();
 | 
	
		
			
				|  |  | +                            html.push(new Date(localDateTime).Format('yyyy-MM-dd'));
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        else{
 | 
	
		
			
				|  |  | +                            html.push('');
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -148,11 +113,6 @@ let gcTreeSetting = {
 | 
	
		
			
				|  |  |                          $('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);*/
 | 
	
		
			
				|  |  |                      });
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -202,6 +162,7 @@ let gcTreeSetting = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  $(document).ready(function () {
 | 
	
		
			
				|  |  |      $('#tab_pm_gc').on('show.bs.tab', function () {
 | 
	
		
			
				|  |  | +        $('#gc_waiting').show();
 | 
	
		
			
				|  |  |          gc_init();
 | 
	
		
			
				|  |  |          Tree = null;
 | 
	
		
			
				|  |  |      });
 | 
	
	
		
			
				|  | @@ -213,9 +174,12 @@ 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());
 | 
	
		
			
				|  |  | +    a_getGC(function (datas) {
 | 
	
		
			
				|  |  | +        m_buildVirtualTree(datas);
 | 
	
		
			
				|  |  | +        let normalDatas = m_VTreeToDatas(datas);
 | 
	
		
			
				|  |  | +        gcTree = $.fn.treeTable.init(table, gcTreeSetting, normalDatas);
 | 
	
		
			
				|  |  | +        $('#gc_waiting').hide();
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //项目恢复模态框标题
 | 
	
	
		
			
				|  | @@ -294,6 +258,7 @@ function v_recFiles(project, fileIds, type){
 | 
	
		
			
				|  |  |                  let id = projFiles[i].id || projFiles[i].ID || null;
 | 
	
		
			
				|  |  |                  if(id && id === fileIds[j]){
 | 
	
		
			
				|  |  |                      isExist = true;
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              if(!isExist){
 | 
	
	
		
			
				|  | @@ -313,7 +278,12 @@ function v_removeNode(node){
 | 
	
		
			
				|  |  |      gcTree.removeNode(node);
 | 
	
		
			
				|  |  |      let parent = node.parent || null;
 | 
	
		
			
				|  |  |      if(parent && parent.children.length === 0 && parent.data !== undefined){
 | 
	
		
			
				|  |  | -        v_removeNode(parent);
 | 
	
		
			
				|  |  | +        if(parent.data.projType === projectType.project && fileEmpty(parent)){
 | 
	
		
			
				|  |  | +            v_removeNode(parent);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if(parent.data.projType !== projectType.project){
 | 
	
		
			
				|  |  | +            v_removeNode(parent);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -331,6 +301,9 @@ function v_refreshNode(node){
 | 
	
		
			
				|  |  |  //将获取的回收站中的数据建虚拟树
 | 
	
		
			
				|  |  |  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);
 | 
	
	
		
			
				|  | @@ -345,6 +318,25 @@ function m_buildVirtualTree(datas){
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +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];
 | 
	
	
		
			
				|  | @@ -412,6 +404,7 @@ function m_getRecDatas(oprNode){
 | 
	
		
			
				|  |  |              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));
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -427,42 +420,54 @@ function m_getRecDatas(oprNode){
 | 
	
		
			
				|  |  |          path = recPath.p;
 | 
	
		
			
				|  |  |          let engineerings = oprNode.children;
 | 
	
		
			
				|  |  |          if(engineerings.length > 0){
 | 
	
		
			
				|  |  | -            let allTenders = [];
 | 
	
		
			
				|  |  | +            let allTenders = [], rstEngs = [];
 | 
	
		
			
				|  |  |              for(let i = 0, len = engineerings.length; i < len; i++){
 | 
	
		
			
				|  |  |                  //恢复单项工程
 | 
	
		
			
				|  |  | -                rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineerings[i], false, false));
 | 
	
		
			
				|  |  | +                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++){
 | 
	
		
			
				|  |  |                      //恢复单位工程
 | 
	
		
			
				|  |  | -                    rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[j], false, false));
 | 
	
		
			
				|  |  | +                    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));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    console.log(path);
 | 
	
		
			
				|  |  |      rst.proj = rstProj;
 | 
	
		
			
				|  |  |      rst.file = rstFile;
 | 
	
		
			
				|  |  |      return rst;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //获得勾选的单价、费率文件的id
 | 
	
		
			
				|  |  | -function m_getFilesIds(nodes){
 | 
	
		
			
				|  |  | -    let rstSet = new Set();
 | 
	
		
			
				|  |  | +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);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            rstSet.add(fileId);
 | 
	
		
			
				|  |  | +            let obj = Object.create(null);
 | 
	
		
			
				|  |  | +            obj.id = fileId;
 | 
	
		
			
				|  |  | +            obj.name = name;
 | 
	
		
			
				|  |  | +            rst.push(obj);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    return Array.from(rstSet);
 | 
	
		
			
				|  |  | +    return rst;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function m_project(node){
 | 
	
	
		
			
				|  | @@ -481,21 +486,40 @@ function m_project(node){
 | 
	
		
			
				|  |  |  //点击单价文件、费率文件下的恢复操作(确认)
 | 
	
		
			
				|  |  |  function e_recFiles(btn){
 | 
	
		
			
				|  |  |      btn.bind('click', function () {
 | 
	
		
			
				|  |  | -        let recIds = m_getFilesIds($('[name = "fileItems"]:checked'));
 | 
	
		
			
				|  |  | -        let fileType = $('[name = "fileItems"]:checked').attr('fileType');
 | 
	
		
			
				|  |  | +        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 = 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;
 | 
	
		
			
				|  |  | +        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]);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            gcTree.refreshNodesDom([selected]);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -508,20 +532,21 @@ function e_recProj(btn){
 | 
	
		
			
				|  |  |          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);
 | 
	
		
			
				|  |  | +        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);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        v_removeNode(selected);
 | 
	
		
			
				|  |  | -        v_refreshNode(selected);
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -529,6 +554,7 @@ function a_getGC(callback){
 | 
	
		
			
				|  |  |      $.ajax({
 | 
	
		
			
				|  |  |          type: 'post',
 | 
	
		
			
				|  |  |          url: '/pm/api/getGCDatas',
 | 
	
		
			
				|  |  | +        data: {data: JSON.stringify({user_id: userID})},
 | 
	
		
			
				|  |  |          dataType: 'json',
 | 
	
		
			
				|  |  |          timeout: 5000,
 | 
	
		
			
				|  |  |          success: function (result) {
 | 
	
	
		
			
				|  | @@ -538,14 +564,14 @@ function a_getGC(callback){
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -    })
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function a_rec(nodes, callback){
 | 
	
		
			
				|  |  |      $.ajax({
 | 
	
		
			
				|  |  |          type: 'post',
 | 
	
		
			
				|  |  |          url: '/pm/api/recGC',
 | 
	
		
			
				|  |  | -        data: {nodes: JSON.stringify(nodes)},
 | 
	
		
			
				|  |  | +        data: {data: JSON.stringify({user_id: userID, nodes: nodes})},
 | 
	
		
			
				|  |  |          dataType: 'json',
 | 
	
		
			
				|  |  |          timeout: 5000,
 | 
	
		
			
				|  |  |          success: function (result) {
 | 
	
	
		
			
				|  | @@ -558,14 +584,67 @@ function a_rec(nodes, 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.deleted;
 | 
	
		
			
				|  |  | +    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 === id) || (type === fileType.feeRateFile && files[i].ID === id)){
 | 
	
		
			
				|  |  | +        if((type === fileType.unitPriceFile && files[i].id === parseInt(id)) || (type === fileType.feeRateFile && files[i].ID === id)){
 | 
	
		
			
				|  |  |              isExist = true;
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -577,12 +656,12 @@ 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){
 | 
	
		
			
				|  |  | +        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){
 | 
	
		
			
				|  |  | -                rst_FF.push(files[i].findData.id);
 | 
	
		
			
				|  |  | +            else if(files[i].updateType === fileType.feeRateFile && files[i].findData.ID !== undefined){
 | 
	
		
			
				|  |  | +                rst_FF.push(files[i].findData.ID);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -601,56 +680,67 @@ function getUpdateObj(updateType, findData, updateData){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function getUpdateDatas(updateType, node, mtNID, mtPM){
 | 
	
		
			
				|  |  |      let rst = [];
 | 
	
		
			
				|  |  | -    if(!decDate){
 | 
	
		
			
				|  |  | -        decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +    decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
 | 
	
		
			
				|  |  | +    let newName = delPostFix(node.data.name) + decDate;
 | 
	
		
			
				|  |  |      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}));
 | 
	
		
			
				|  |  | +            rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {name: newName, deleteInfo: null, NextSiblingID: -1}));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          else {
 | 
	
		
			
				|  |  | -            rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null}));
 | 
	
		
			
				|  |  | +            rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {name: newName, 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,后端处理
 | 
	
		
			
				|  |  | +        rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {deleteInfo: null, name: newName}));//NextSibling为undefined,后端处理
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      return rst;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  //unitPriceFile or feeRateFile
 | 
	
		
			
				|  |  |  function getUpdateFiles(tenders, project){
 | 
	
		
			
				|  |  | -    let unitFiles = [], feeFiles = [], rst = [];
 | 
	
		
			
				|  |  | +    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);
 | 
	
		
			
				|  |  | +            //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);
 | 
	
		
			
				|  |  | +            //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;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    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 uf in _unitFiles){
 | 
	
		
			
				|  |  | +        rstUF.push(getUpdateObj(fileType.unitPriceFile, {id: _unitFiles[uf].id}, {deleteInfo: null, name: delPostFix(_unitFiles[uf].name) + decDate}));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    for(let i = 0, len = ffIds.length; i < len; i++){
 | 
	
		
			
				|  |  | -        rst.push(getUpdateObj(fileType.feeRateFile, {id: ffIds[i]}, {deleteInfo: null}));
 | 
	
		
			
				|  |  | +    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;
 | 
	
		
			
				|  |  |  }
 |