|  | @@ -174,9 +174,12 @@ const gcTreeObj = {
 | 
	
		
			
				|  |  |              {name: '工程列表', dataCode: 'name', width: 800, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  |              {name: '删除日期', dataCode: 'deleteDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  |              {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | -            {name: '恢复', dataCode: 'recovery', width: 170, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | -            {name: '单价文件', dataCode: 'unitPriceFile', width: 170, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | -            {name: '费率文件', dataCode: 'feeRateFile', width: 170, vAlign: 'center', hAlign: 'left'}
 | 
	
		
			
				|  |  | +            {name: '恢复', dataCode: 'recovery', width: 100, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | +            {name: '清除', dataCode: 'delete', width: 100, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | +            {name: '单价文件', dataCode: 'unitPriceFile', width: 100, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | +            {name: '单价文件-清除', dataCode: 'unitPriceFile_delete', width: 100, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | +            {name: '费率文件', dataCode: 'feeRateFile', width: 100, vAlign: 'center', hAlign: 'left'},
 | 
	
		
			
				|  |  | +            {name: '费率文件-清除', dataCode: 'feeRateFile_delete', width: 100, vAlign: 'center', hAlign: 'left'}
 | 
	
		
			
				|  |  |          ],
 | 
	
		
			
				|  |  |          //选中行颜色
 | 
	
		
			
				|  |  |          style: {
 | 
	
	
		
			
				|  | @@ -221,8 +224,15 @@ const gcTreeObj = {
 | 
	
		
			
				|  |  |              sheet.setColumnCount(headers.length);
 | 
	
		
			
				|  |  |              sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader);
 | 
	
		
			
				|  |  |              for(let i = 0, len = headers.length; i < len; i++){
 | 
	
		
			
				|  |  | -                sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
 | 
	
		
			
				|  |  |                  sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
 | 
	
		
			
				|  |  | +                if(headers[i].dataCode === 'unitPriceFile' || headers[i].dataCode === 'feeRateFile'){
 | 
	
		
			
				|  |  | +                    //合并列
 | 
	
		
			
				|  |  | +                    sheet.addSpan(0, i, 1, 2, GC.Spread.Sheets.SheetArea.colHeader);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if(headers[i].dataCode === 'unitPriceFile_delete' || headers[i].dataCode === 'feeRateFile_delete'){
 | 
	
		
			
				|  |  | +                    continue;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          me.renderSheetFuc(sheet, fuc);
 | 
	
	
		
			
				|  | @@ -304,29 +314,49 @@ const gcTreeObj = {
 | 
	
		
			
				|  |  |          me.initSelection(args.newSelections[0], args.oldSelections[0]);
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      //点击恢复列,弹出恢复项目窗口
 | 
	
		
			
				|  |  | -    recoveryProj: function (node) {
 | 
	
		
			
				|  |  | +    oprProj: function (modalId, node) {
 | 
	
		
			
				|  |  |          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));
 | 
	
		
			
				|  |  | -        $('#rePoj').modal('show');
 | 
	
		
			
				|  |  | +        let type = modalId === '#rePoj' ? 'recovery' : 'delete';
 | 
	
		
			
				|  |  | +        $(`${modalId} .modal-header`).empty();
 | 
	
		
			
				|  |  | +        $('p', `${modalId} .modal-body`).remove();
 | 
	
		
			
				|  |  | +        $(`${modalId} .modal-header`).html(v_getTitle(type, node));
 | 
	
		
			
				|  |  | +        $(`${modalId} .modal-body`).html(v_getMoBody(type, node, tenderNodes));
 | 
	
		
			
				|  |  | +        $(`${modalId}`).modal('show');
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      //点击单价文件恢复,弹出恢复单价文件窗口
 | 
	
		
			
				|  |  |      recoveryUnitPrc: function (node) {
 | 
	
		
			
				|  |  |          let unitPriceFiles = node.data.unitPriceFiles;
 | 
	
		
			
				|  |  | +        let tenders = m_getTenders(node);
 | 
	
		
			
				|  |  |          $('#reFile h5').text('恢复单价文件');
 | 
	
		
			
				|  |  |          $('tr', '#reFile tbody').remove();
 | 
	
		
			
				|  |  | -        $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles));
 | 
	
		
			
				|  |  | +        $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles, tenders, 'recovery'));
 | 
	
		
			
				|  |  |          $('#reFile').modal('show');
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      recoveryFeeRate: function (node) {
 | 
	
		
			
				|  |  |          let feeRateFiles = node.data.feeRateFiles;
 | 
	
		
			
				|  |  | +        let tenders = m_getTenders(node);
 | 
	
		
			
				|  |  |          $('#reFile h5').text('恢复费率文件');
 | 
	
		
			
				|  |  |          $('tr', '#reFile tbody').remove();
 | 
	
		
			
				|  |  | -        $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles));
 | 
	
		
			
				|  |  | +        $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles, tenders, 'recovery'));
 | 
	
		
			
				|  |  |          $('#reFile').modal('show');
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    //点击单价文件清除,弹出清除单价文件窗口
 | 
	
		
			
				|  |  | +    deleteUnitPrc: function (node) {
 | 
	
		
			
				|  |  | +        let unitPriceFiles = node.data.unitPriceFiles;
 | 
	
		
			
				|  |  | +        let tenders = m_getTenders(node);
 | 
	
		
			
				|  |  | +        $('#delFile h5').text('清除单价文件');
 | 
	
		
			
				|  |  | +        $('tr', '#delFile tbody').remove();
 | 
	
		
			
				|  |  | +        $('#delFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles, tenders, 'delete'));
 | 
	
		
			
				|  |  | +        $('#delFile').modal('show');
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    deleteFeeRate: function (node) {
 | 
	
		
			
				|  |  | +        let feeRateFiles = node.data.feeRateFiles;
 | 
	
		
			
				|  |  | +        let tenders = m_getTenders(node);
 | 
	
		
			
				|  |  | +        $('#delFile h5').text('清除费率文件');
 | 
	
		
			
				|  |  | +        $('tr', '#delFile tbody').remove();
 | 
	
		
			
				|  |  | +        $('#delFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles, tenders, 'delete'));
 | 
	
		
			
				|  |  | +        $('#delFile').modal('show');
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      getTreeNodeCell: function (tree) {
 | 
	
		
			
				|  |  |          let indent = 20;
 | 
	
		
			
				|  |  |          let levelIndent = -5;
 | 
	
	
		
			
				|  | @@ -517,20 +547,35 @@ const gcTreeObj = {
 | 
	
		
			
				|  |  |                  zoom = hitinfo.sheet.zoom();
 | 
	
		
			
				|  |  |              let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
 | 
	
		
			
				|  |  |              if(hitinfo.x - hitinfo.cellRect.x > 0 && hitinfo.x - hitinfo.cellRect.x < textLength){
 | 
	
		
			
				|  |  | +                //恢复
 | 
	
		
			
				|  |  |                  if(dataCode === 'recovery'){
 | 
	
		
			
				|  |  | -                    gcTreeObj.recoveryProj(node);
 | 
	
		
			
				|  |  | +                    gcTreeObj.oprProj('#rePoj', node);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                //清除
 | 
	
		
			
				|  |  | +                else if(dataCode === 'delete'){
 | 
	
		
			
				|  |  | +                    gcTreeObj.oprProj('#delPoj', node)
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                //恢复单价文件
 | 
	
		
			
				|  |  |                  else if(dataCode === 'unitPriceFile'){
 | 
	
		
			
				|  |  |                      gcTreeObj.recoveryUnitPrc(node);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                //清除单价文件
 | 
	
		
			
				|  |  | +                else if(dataCode === 'unitPriceFile_delete'){
 | 
	
		
			
				|  |  | +                    gcTreeObj.deleteUnitPrc(node);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                //恢复费率文件
 | 
	
		
			
				|  |  |                  else if(dataCode === 'feeRateFile'){
 | 
	
		
			
				|  |  |                      gcTreeObj.recoveryFeeRate(node);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                //清除费率文件
 | 
	
		
			
				|  |  | +                else if(dataCode === 'feeRateFile_delete'){
 | 
	
		
			
				|  |  | +                    gcTreeObj.deleteFeeRate(node);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          MyBaseCell.prototype.processMouseMove = function (hitInfo) {
 | 
	
		
			
				|  |  |              let dataCode = gcTreeObj.setting.header[hitInfo.col]['dataCode'];
 | 
	
		
			
				|  |  | -            if(dataCode === 'recovery' || dataCode === 'unitPriceFile' || dataCode === 'feeRateFile'){
 | 
	
		
			
				|  |  | +            if(dataCode === 'recovery' || dataCode === 'delete' || dataCode === 'unitPriceFile' || dataCode === 'unitPriceFile_delete' || dataCode === 'feeRateFile' || dataCode === 'feeRateFile_delete'){
 | 
	
		
			
				|  |  |                  let sheet = hitInfo.sheet;
 | 
	
		
			
				|  |  |                  let div = sheet.getParent().getHost();
 | 
	
		
			
				|  |  |                  let canvasId = div.id + "vp_vp";
 | 
	
	
		
			
				|  | @@ -569,16 +614,31 @@ const gcTreeObj = {
 | 
	
		
			
				|  |  |                  value = '恢复';
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        else if(dataCode === 'delete'){
 | 
	
		
			
				|  |  | +            if(deleted(node)){
 | 
	
		
			
				|  |  | +                value = '清除';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          else if(dataCode === 'unitPriceFile'){
 | 
	
		
			
				|  |  |              if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){
 | 
	
		
			
				|  |  |                  value = '恢复';
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        else if(dataCode === 'unitPriceFile_delete'){
 | 
	
		
			
				|  |  | +            if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){
 | 
	
		
			
				|  |  | +                value = '清除';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          else if(dataCode === 'feeRateFile'){
 | 
	
		
			
				|  |  |              if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
 | 
	
		
			
				|  |  |                  value = '恢复';
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        else if(dataCode === 'feeRateFile_delete'){
 | 
	
		
			
				|  |  | +            if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
 | 
	
		
			
				|  |  | +                value = '清除';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          else {
 | 
	
		
			
				|  |  |              value = node.data[dataCode] ? node.data[dataCode] : '';
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -644,7 +704,9 @@ $(document).ready(function () {
 | 
	
		
			
				|  |  |          projTreeObj.tree = null;
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |      e_recFiles($('#reFileBtn'));
 | 
	
		
			
				|  |  | +    e_delFiles($('#delFileBtn'));
 | 
	
		
			
				|  |  |      e_recProj($('#rePojBtn'));
 | 
	
		
			
				|  |  | +    e_delProj($('#delPojBtn'));
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function gc_init(){
 | 
	
	
		
			
				|  | @@ -664,9 +726,9 @@ function gc_init(){
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //项目恢复模态框标题
 | 
	
		
			
				|  |  | -function v_getTitle(node){
 | 
	
		
			
				|  |  | +function v_getTitle(type, node){
 | 
	
		
			
				|  |  |      let html = '';
 | 
	
		
			
				|  |  | -    html += '<h5 class="modal-title">恢复 ';
 | 
	
		
			
				|  |  | +    html += type === 'recovery' ? '<h5 class="modal-title">恢复 ' : '<h5 class="modal-title">清除 ';
 | 
	
		
			
				|  |  |      if(node.data.projType === projectType.project){
 | 
	
		
			
				|  |  |          html += '<i class="fa fa-cubes"></i>建设项目</h5>';
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -681,48 +743,73 @@ function v_getTitle(node){
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //项目恢复模态框主体
 | 
	
		
			
				|  |  | -function v_getMoBody(oprNode, nodes){
 | 
	
		
			
				|  |  | +function v_getMoBody(type, 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>';
 | 
	
		
			
				|  |  | +    if(type === 'recovery'){
 | 
	
		
			
				|  |  | +        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>';
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        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>、';
 | 
	
		
			
				|  |  | +        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 = html.slice(0, html.length - 1);
 | 
	
		
			
				|  |  | -        html += ('</p>');
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
 | 
	
		
			
				|  |  | +        html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else{
 | 
	
		
			
				|  |  | +        html += ('<p>点“确定”按钮,确认清除数据</p>');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      return html;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //单价、费率文件恢复弹出框数据
 | 
	
		
			
				|  |  | -function v_getFiles(type, files){
 | 
	
		
			
				|  |  | +function v_getFiles(type, files, tenders, opr = null){
 | 
	
		
			
				|  |  |      let html = '';
 | 
	
		
			
				|  |  | +    function hasTheFile(tenders, fileId, fileType){
 | 
	
		
			
				|  |  | +        for(let tender of tenders){
 | 
	
		
			
				|  |  | +            let fileAttr = fileType === 'UnitPriceFile' ? 'unitPriceFile' : 'feeFile';
 | 
	
		
			
				|  |  | +            if(tender.data.property[fileAttr]['id'] == fileId){
 | 
	
		
			
				|  |  | +                return true;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      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 recTimeA = formatDate(new Date(files[i].deleteInfo.deleteDateTime), 'yyyy-MM-dd');
 | 
	
		
			
				|  |  |          let recTimeB = formatDate(new Date(files[i].deleteInfo.deleteDateTime), '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>';
 | 
	
		
			
				|  |  | +        if(opr && opr === 'delete'){
 | 
	
		
			
				|  |  | +            //还被引用,不可删除
 | 
	
		
			
				|  |  | +            if(hasTheFile(tenders, fileId, type)){
 | 
	
		
			
				|  |  | +                html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input disabled name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else {
 | 
	
		
			
				|  |  | +                html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else{
 | 
	
		
			
				|  |  | +            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){
 | 
	
		
			
				|  |  | +//恢复或清除单价、费率文件后前端显示变化
 | 
	
		
			
				|  |  | +function v_refreshFiles(project, fileIds, type){
 | 
	
		
			
				|  |  |      let projFiles;
 | 
	
		
			
				|  |  |      if(type === fileType.unitPriceFile){
 | 
	
		
			
				|  |  |          projFiles = project.data.unitPriceFiles;
 | 
	
	
		
			
				|  | @@ -767,14 +854,16 @@ function v_removeNode(node){
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -function v_refreshNode(node){
 | 
	
		
			
				|  |  | -    if(deleted(node)){
 | 
	
		
			
				|  |  | -        delete node.data.deleteInfo;
 | 
	
		
			
				|  |  | +function v_refreshNode(node, recovery = true){
 | 
	
		
			
				|  |  | +    if(recovery){
 | 
	
		
			
				|  |  | +        if(deleted(node)){
 | 
	
		
			
				|  |  | +            delete node.data.deleteInfo;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      gcTreeObj.refreshNodeData(node);
 | 
	
		
			
				|  |  |      let parent = node.parent || null;
 | 
	
		
			
				|  |  |      if(parent && parent.data !== undefined){
 | 
	
		
			
				|  |  | -        v_refreshNode(parent);
 | 
	
		
			
				|  |  | +        v_refreshNode(parent, recovery);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -930,6 +1019,49 @@ function m_getRecDatas(oprNode){
 | 
	
		
			
				|  |  |      return rst;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +//获取清除的额数据
 | 
	
		
			
				|  |  | +function m_getDelDatas(oprNode){
 | 
	
		
			
				|  |  | +    let rst = [];
 | 
	
		
			
				|  |  | +    if(!oprNode){
 | 
	
		
			
				|  |  | +        return rst;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    function getChild(node){
 | 
	
		
			
				|  |  | +        rst.push({updateType: 'Project', ID: node.data.ID});
 | 
	
		
			
				|  |  | +        if(node.children.length > 0){
 | 
	
		
			
				|  |  | +            for(let child of node.children){
 | 
	
		
			
				|  |  | +                getChild(child);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    getChild(oprNode);
 | 
	
		
			
				|  |  | +    //父节点只有一个单位工程,则清除此单位工程的时候,父节点也清除,(建设项目单价、费率文件存在时不清除)
 | 
	
		
			
				|  |  | +    if(oprNode.data.projType === projectType.tender){
 | 
	
		
			
				|  |  | +        let eng = oprNode.parent, proj = null;
 | 
	
		
			
				|  |  | +        if(eng && deleted(eng)){
 | 
	
		
			
				|  |  | +            proj = eng.parent;
 | 
	
		
			
				|  |  | +            rst.push({updateType: 'Project', ID: eng.data.ID});
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if(proj && deleted(proj) && fileEmpty(proj)){
 | 
	
		
			
				|  |  | +            rst.push({updateType: 'Project', ID: proj.data.ID})
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else if(oprNode.data.projType === projectType.engineering){
 | 
	
		
			
				|  |  | +        let proj = oprNode.parent;
 | 
	
		
			
				|  |  | +        if(proj && deleted(proj) && fileEmpty(proj)){
 | 
	
		
			
				|  |  | +            rst.push({updateType: 'Project', ID: proj.data.ID});
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else if(oprNode.data.projType === projectType.project){
 | 
	
		
			
				|  |  | +        for(let uf of oprNode.data.unitPriceFiles){
 | 
	
		
			
				|  |  | +            rst.push({updateType: fileType.unitPriceFile, ID: uf.id});
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        for(let ff of oprNode.data.feeRateFiles){
 | 
	
		
			
				|  |  | +            rst.push({updateType: fileType.feeRateFile, ID: ff.ID});
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return rst;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  //获得勾选的单价、费率文件的id
 | 
	
		
			
				|  |  |  function m_getFilesObjs(nodes){
 | 
	
		
			
				|  |  |      let rst = [];
 | 
	
	
		
			
				|  | @@ -989,7 +1121,7 @@ function e_recFiles(btn){
 | 
	
		
			
				|  |  |          function caller(){
 | 
	
		
			
				|  |  |              //front
 | 
	
		
			
				|  |  |              if(recIds.length > 0){
 | 
	
		
			
				|  |  | -                v_recFiles(selected, recIds, type);
 | 
	
		
			
				|  |  | +                v_refreshFiles(selected, recIds, type);
 | 
	
		
			
				|  |  |                  if(deleted(selected)){
 | 
	
		
			
				|  |  |                      delete selected.data.deleteInfo;
 | 
	
		
			
				|  |  |                  }
 | 
	
	
		
			
				|  | @@ -1004,6 +1136,39 @@ function e_recFiles(btn){
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +//点击单价、费率文件的清除操作(确认)
 | 
	
		
			
				|  |  | +function e_delFiles(btn){
 | 
	
		
			
				|  |  | +    btn.bind('click', function () {
 | 
	
		
			
				|  |  | +        let selected = gcTreeObj.tree.selected;//project
 | 
	
		
			
				|  |  | +        let delObjs = m_getFilesObjs($('[name = "fileItems"]:checked'));
 | 
	
		
			
				|  |  | +        let type = $('[name = "fileItems"]:checked').attr('fileType');
 | 
	
		
			
				|  |  | +        let delDatas = [];
 | 
	
		
			
				|  |  | +        let delIds = [];
 | 
	
		
			
				|  |  | +        for(let delObj of delObjs){
 | 
	
		
			
				|  |  | +            delIds.push(delObj.id);
 | 
	
		
			
				|  |  | +            delDatas.push({updateType: type, ID: delObj.id});
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //此操作造成了建设项目的文件为空,则清除建设项目
 | 
	
		
			
				|  |  | +        if(fileWillEmpty(selected, delIds, type)){
 | 
	
		
			
				|  |  | +            delDatas.push({updateType: 'Project', ID: selected.data.ID});
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if(delDatas.length > 0){
 | 
	
		
			
				|  |  | +            //backend
 | 
	
		
			
				|  |  | +            a_delGC(delDatas, caller);
 | 
	
		
			
				|  |  | +            //front
 | 
	
		
			
				|  |  | +            function caller(){
 | 
	
		
			
				|  |  | +                v_refreshFiles(selected, delIds, type);
 | 
	
		
			
				|  |  | +                if(fileEmpty(selected) && selected.children.length === 0){
 | 
	
		
			
				|  |  | +                    gcTreeObj.remove(selected);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else {
 | 
	
		
			
				|  |  | +                    gcTreeObj.refreshNodeData(selected);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  //点击项目下的恢复操作(确认)
 | 
	
		
			
				|  |  |  function e_recProj(btn){
 | 
	
		
			
				|  |  |      btn.bind('click', function () {
 | 
	
	
		
			
				|  | @@ -1018,14 +1183,30 @@ function e_recProj(btn){
 | 
	
		
			
				|  |  |              let project = m_project(selected);
 | 
	
		
			
				|  |  |              if(project){
 | 
	
		
			
				|  |  |                  if(fileObj[fileType.unitPriceFile].length > 0){
 | 
	
		
			
				|  |  | -                    v_recFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile);
 | 
	
		
			
				|  |  | +                    v_refreshFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  if(fileObj[fileType.feeRateFile].length > 0){
 | 
	
		
			
				|  |  | -                    v_recFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile);
 | 
	
		
			
				|  |  | +                    v_refreshFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              v_removeNode(selected);
 | 
	
		
			
				|  |  | -            v_refreshNode(selected);
 | 
	
		
			
				|  |  | +            v_refreshNode(selected, true);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function e_delProj(btn){
 | 
	
		
			
				|  |  | +    btn.bind('click', function () {
 | 
	
		
			
				|  |  | +        let selected  = gcTreeObj.tree.selected;
 | 
	
		
			
				|  |  | +        //backend
 | 
	
		
			
				|  |  | +        let delDatas = m_getDelDatas(selected);
 | 
	
		
			
				|  |  | +        if(delDatas.length > 0){
 | 
	
		
			
				|  |  | +            a_delGC(delDatas, caller);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //front
 | 
	
		
			
				|  |  | +        function caller() {
 | 
	
		
			
				|  |  | +            v_removeNode(selected);
 | 
	
		
			
				|  |  | +            v_refreshNode(selected, false);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -1046,6 +1227,14 @@ function a_rec(nodes, callback){
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +function a_delGC(delDatas, callback){
 | 
	
		
			
				|  |  | +    CommonAjax.post('/pm/api/delGC', {user_id: userID, delDatas: delDatas}, function(rstData){
 | 
	
		
			
				|  |  | +        if(callback){
 | 
	
		
			
				|  |  | +            callback();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  //去除重名,回收站不处理重名,只保证恢复到项目管理中不出现重名
 | 
	
		
			
				|  |  |  function deWeightName(datas){
 | 
	
		
			
				|  |  |      let rst = [];
 | 
	
	
		
			
				|  | @@ -1114,6 +1303,26 @@ function fIsExist(files, id, type){
 | 
	
		
			
				|  |  |      return isExist;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +//删除的文件是否会导致建设项目不再存有文件
 | 
	
		
			
				|  |  | +function fileWillEmpty(proj, delIds, type){
 | 
	
		
			
				|  |  | +    let ufs = proj.data.unitPriceFiles,
 | 
	
		
			
				|  |  | +        ffs = proj.data.feeRateFiles;
 | 
	
		
			
				|  |  | +    let theFiles = type === fileType.unitPriceFile ? ufs : ffs;
 | 
	
		
			
				|  |  | +        otherFiles = type === fileType.unitPriceFile ? ffs : ufs;
 | 
	
		
			
				|  |  | +    let uniqIds = Array.from(new Set(delIds));
 | 
	
		
			
				|  |  | +    if(theFiles.length === delIds.length){
 | 
	
		
			
				|  |  | +        for(let id of uniqIds){
 | 
	
		
			
				|  |  | +            if(!fIsExist(theFiles, id, type)){
 | 
	
		
			
				|  |  | +                return false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if(otherFiles.length === 0){
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return false;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  function getRecFileObj(files){
 | 
	
		
			
				|  |  |      let rst = Object.create(null);
 | 
	
		
			
				|  |  |      let rst_UF = [], rst_FF = [];
 |