Forráskód Böngészése

回收站更换spreadjs及更新相关功能

zhongzewei 7 éve
szülő
commit
352cfa8f7c

+ 4 - 17
web/building_saas/pm/html/project-management-Recycle.html

@@ -2,25 +2,12 @@
     <legend class="m-0 pb-1">全部</legend>
 </div>
 <div class="top-content">
-    <div class="main-data-top" id="gc_waiting">
+  <!--  <div class="main-data-top" id="gc_waiting">
         <p style="text-align: center; margin-top: 30px;">正在加载数据...</p>
-    </div>
+    </div>-->
 </div>
-<div class="poj-list">
-    <table class="table table-hover table-sm mb-5" id="gcTree">
-        <thead>
-        <tr>
-            <th width="50%">工程列表</th>
-            <th width="10%">删除日期</th>
-            <th width="10%">创建日期</th>
-            <th width="10%">恢复</th>
-            <th width="10%">单价文件</th>
-            <th width="10%">费率文件</th>
-        </tr>
-        </thead>
-        <tbody>
-        </tbody>
-    </table>
+<div class="poj-list" id="gcSpread">
+
 </div>
 <!--弹出恢复项目-->
 <div class="modal fade" id="rePoj" data-backdrop="static">

+ 456 - 14
web/building_saas/pm/js/pm_gc.js

@@ -159,29 +159,471 @@ let gcTreeSetting = {
         }
     ]
 };
+const gcTreeObj = {
+    tree: null,
+    workBook: null,
+    setting: {
+        tree: {
+            id: 'ID',
+            pid: 'ParentID',
+            nid: 'NextSiblingID',
+            rootId: -1,
+            autoUpdate: false
+        },
+        header: [
+            {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'}
+        ],
+        options: {
+            tabStripVisible:  false,
+            allowCopyPasteExcelStyle : false,
+            allowExtendPasteRange: false,
+            allowUserDragDrop : false,
+            allowUserDragFill: false,
+            scrollbarMaxAlign : true
+        }
+    },
+    renderSheetFuc: function (sheet, fuc) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        fuc();
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+    setOptions: function (workbook, opts) {
+        for(let opt in opts){
+            workbook.options[opt] = opts[opt];
+        }
+    },
+    bindEvent: function (workBook) {
+        const _events = GC.Spread.Sheets.Events;
+        let sheet = workBook.getActiveSheet();
+        //改变选中节点set selected
+        sheet.bind(_events.SelectionChanging, this.onSelectionChanging);
+    },
+    buildHeader: function (sheet, headers) {
+        let me = this;
+        let fuc = function () {
+            sheet.options.isProtected = true;
+            sheet.options.protectionOptions = {
+                allowResizeRows: true,
+                allowResizeColumns: true
+            };
+            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);
+            }
+        };
+        me.renderSheetFuc(sheet, fuc);
+    },
+    buildSheet: function () {
+        if(!this.workBook){
+            this.workBook = new GC.Spread.Sheets.Workbook($('#gcSpread')[0], {sheetCount: 1});
+            this.setOptions(this.workBook, this.setting.options);
+            this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
+            this.bindEvent(this.workBook);
+        }
+    },
+    initSelection: function (row) {
+        let me = this;
+        let node = me.tree.items[row];
+        me.tree.selected = node;
+        $(".tools-btn > a").not(".disabled").addClass("disabled");
+        $("#add-engineering-btn").addClass("disabled");
+        $('#add-tender-btn').removeClass('disabled');
+        if(node){
+            switch(node.data.projType) {
+                case projectType.project:
+                    $("#del-btn").removeClass("disabled");
+                    $("#add-engineering-btn").removeClass("disabled");
+                    break;
+                case projectType.folder:
+                    if(!node.children || node.children.length === 0){
+                        $("#del-btn").removeClass("disabled");
+                    }
+                    break;
+                case projectType.engineering:
+                    $("#del-btn").removeClass("disabled");
+                    $("#add-engineering-btn").removeClass("disabled");
+                    break;
+                case projectType.tender:
+                    $("#add-engineering-btn").removeClass("disabled");
+                    $("#move-to-btn").removeClass("disabled");
+                    $("#copy-to-btn").removeClass("disabled");
+                    $("#share-btn").removeClass("disabled");
+                    $("#cooperate-btn").removeClass("disabled");
+                    $("#del-btn").removeClass("disabled");
+                    break;
+            }
+            $("#rename-btn").removeClass("disabled");
+        }
+    },
+    onSelectionChanging: function (sender, args) {
+        let me = gcTreeObj;
+        me.initSelection(args.newSelections[0].row);
+    },
+    //点击恢复列,弹出恢复项目窗口
+    recoveryProj: function (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');
+    },
+    //点击单价文件恢复,弹出恢复单价文件窗口
+    recoveryUnitPrc: function (node) {
+        let unitPriceFiles = node.data.unitPriceFiles;
+        $('#reFile h5').text('恢复单价文件');
+        $('tr', '#reFile tbody').remove();
+        $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles));
+        $('#reFile').modal('show');
+    },
+    recoveryFeeRate: function (node) {
+        let feeRateFiles = node.data.feeRateFiles;
+        $('#reFile h5').text('恢复费率文件');
+        $('tr', '#reFile tbody').remove();
+        $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles));
+        $('#reFile').modal('show');
+    },
+    getTreeNodeCell: function (tree) {
+        let indent = 20;
+        let levelIndent = -5;
+        let halfBoxLength = 5;
+        let halfExpandLength = 3;
+        let imgWidth = 18;
+        let imgHeight = 14;
+        let TreeNodeCellType = function () {
+        };
+        TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
+        TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
+            if (style.backColor) {
+                ctx.save();
+                ctx.fillStyle = style.backColor;
+                ctx.fillRect(x, y, w, h);
+                ctx.restore();
+            } else {
+                ctx.clearRect(x, y, w, h);
+            }
+            let drawLine = function (canvas, x1, y1, x2, y2, color) {
+                ctx.save();
+                ctx.translate(0.5, 0.5);
+                ctx.beginPath();
+                ctx.moveTo(x1, y1);
+                ctx.lineTo(x2, y2);
+                ctx.strokeStyle = color;
+                ctx.stroke();
+                ctx.restore();
+            };
+            let drawExpandBox = function (ctx, x, y, w, h, centerX, centerY, expanded) {
+                let rect = {}, h1, h2, offset = 1;
+                rect.top = centerY - halfBoxLength;
+                rect.bottom = centerY + halfBoxLength;
+                rect.left = centerX - halfBoxLength;
+                rect.right = centerX + halfBoxLength;
 
+                if (rect.left < x + w) {
+                    rect.right = Math.min(rect.right, x + w);
+
+                    ctx.save();
+                    ctx.translate(0.5, 0.5);
+                    ctx.strokeStyle = 'black';
+                    ctx.beginPath();
+                    ctx.moveTo(rect.left, rect.top);
+                    ctx.lineTo(rect.left, rect.bottom);
+                    ctx.lineTo(rect.right, rect.bottom);
+                    ctx.lineTo(rect.right, rect.top);
+                    ctx.lineTo(rect.left, rect.top);
+                    ctx.stroke();
+                    ctx.fillStyle = 'white';
+                    ctx.fill();
+                    ctx.restore();
+
+                    // Draw Horizontal Line
+                    h1 = centerX - halfExpandLength;
+                    h2 = Math.min(centerX + halfExpandLength, x + w);
+                    if (h2 > h1) {
+                        drawLine(ctx, h1, centerY, h2, centerY, 'black');
+                    }
+                    // Draw Vertical Line
+                    if (!expanded && (centerX < x + w)) {
+                        drawLine(ctx, centerX, centerY - halfExpandLength, centerX, centerY + halfExpandLength, 'black');
+                    }
+                }
+
+            }
+            let node = tree.items[options.row];
+            let showTreeLine = true;
+            if (!node) { return; }
+
+            let centerX = Math.floor(x) + node.depth() * indent + node.depth() * levelIndent + indent / 2;
+            let x1 = centerX + indent / 2;
+            let centerY = Math.floor((y + (y + h)) / 2);
+            let y1;
+            // Draw Sibling Line
+            if (showTreeLine) {
+                // Draw Horizontal Line
+                if (centerX < x + w) {
+                    drawLine(ctx, centerX, centerY, Math.min(x1, x + w), centerY, 'gray');
+                    let img;
+                    if(node.data.projType === projectType.folder){
+                        img = document.getElementById('folder_open_pic');
+                        imgWidth = 15;
+                    }
+                    else if(node.data.projType === projectType.project){
+                        img = document.getElementById('proj_pic');
+                        imgWidth = 18;
+                    }
+                    else if(node.data.projType === projectType.engineering){
+                        img = document.getElementById('eng_pic');
+                        imgWidth = 14;
+                    }
+                    else if(node.data.projType === projectType.tender){
+                        img = document.getElementById('tender_pic');
+                        imgWidth = 14;
+                    }
+                    ctx.drawImage(img, centerX+indent/2+3, centerY - 7, imgWidth,imgHeight);
+                }
+                // Draw Vertical Line
+                if (centerX < x + w) {
+                    y1 = node.isLast() ? centerY : y + h;
+                    if (node.isFirst() && !node.parent.parent) {
+                        drawLine(ctx, centerX, centerY, centerX, y1, 'gray');
+                    } else {
+                        drawLine(ctx, centerX, y, centerX, y1, 'gray');
+                    }
+                }
+            }
+            // Draw Expand Box
+            if (node.children.length > 0) {
+                drawExpandBox(ctx, x, y, w, h, centerX, centerY, node.expanded);
+            }
+            // Draw Parent Line
+            if (showTreeLine) {
+                var parent = node.parent, parentCenterX = centerX - indent - levelIndent;
+                while (parent.parent) {
+                    if (!parent.isLast()) {
+                        if (parentCenterX < x + w) {
+                            drawLine(ctx, parentCenterX, y, parentCenterX, y + h, 'gray');
+                        }
+                    }
+                    parent = parent.parent;
+                    parentCenterX -= (indent + levelIndent);
+                }
+            };
+            // Draw Text
+            //x = x + (node.depth() + 1) * indent +  node.depth() * levelIndent;
+            x = x + (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 3;
+            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+        };
+        TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
+            return {
+                x: x,
+                y: y,
+                row: context.row,
+                col: context.col,
+                cellStyle: cellStyle,
+                cellRect: cellRect,
+                sheetArea: context.sheetArea,
+                isReservedLocation: true
+            };
+        };
+        TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
+            let offset = -1;
+            let node = tree.items[hitinfo.row];
+            tree.selected = node;
+            let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
+            let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;;
+            if (!node || node.children.length === 0) { return; }
+
+            if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) {
+                node.setExpanded(!node.expanded);
+                TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () {
+                    let iCount = node.posterityCount(), i, child;
+                    for (i = 0; i < iCount; i++) {
+                        child = tree.items[hitinfo.row + i + 1];
+                        hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.visible, hitinfo.sheetArea);
+                    }
+                    hitinfo.sheet.invalidateLayout();
+                });
+                hitinfo.sheet.repaint();
+            }
+        };
+        return new TreeNodeCellType();
+    },
+    getBaseCell: function () {
+        let MyBaseCell = function () {
+        };
+        MyBaseCell.prototype = new GC.Spread.Sheets.CellTypes.Text();
+        MyBaseCell.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
+            return {
+                x: x,
+                y: y,
+                row: context.row,
+                col: context.col,
+                cellStyle: cellStyle,
+                cellRect: cellRect,
+                sheetArea: context.sheetArea,
+                isReservedLocation: true
+            };
+        };
+        MyBaseCell.prototype.processMouseDown = function (hitinfo) {
+            let dataCode = gcTreeObj.setting.header[hitinfo.col]['dataCode'];
+            let node = gcTreeObj.tree.items[hitinfo.row];
+            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
+            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
+            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
+                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);
+                }
+                else if(dataCode === 'unitPriceFile'){
+                    gcTreeObj.recoveryUnitPrc(node);
+                }
+                else if(dataCode === 'feeRateFile'){
+                    gcTreeObj.recoveryFeeRate(node);
+                }
+            }
+        };
+        MyBaseCell.prototype.processMouseMove = function (hitInfo) {
+            let dataCode = gcTreeObj.setting.header[hitInfo.col]['dataCode'];
+            if(dataCode === 'recovery' || dataCode === 'unitPriceFile' || dataCode === 'feeRateFile'){
+                let sheet = hitInfo.sheet;
+                let div = sheet.getParent().getHost();
+                let canvasId = div.id + "vp_vp";
+                let canvas = $(`#${canvasId}`)[0];
+                //改变鼠标图案
+                let text = hitInfo.sheet.getText(hitInfo.row, hitInfo.col);
+                let value = hitInfo.sheet.getValue(hitInfo.row, hitInfo.col);
+                let acStyle = hitInfo.sheet.getActualStyle(hitInfo.row, hitInfo.col),
+                    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 (sheet && hitInfo.x - hitInfo.cellRect.x >  0 && hitInfo.x - hitInfo.cellRect.x < textLength) {
+                    canvas.style.cursor='pointer';
+                    return true;
+                }else{
+                    canvas.style.cursor='default';
+                }
+            }
+            return false;
+        };
+        return new MyBaseCell();
+    },
+    setCellValue: function (cell, node) {
+        const sheet = this.workBook.getActiveSheet();
+        const {row, col} = cell;
+        const dataCode = this.setting.header[col]['dataCode'];
+        let value = '';
+        if(dataCode === 'deleteDateTime' || dataCode === 'createDateTime'){
+            if (node.data.projType === projectType.tender && deleted(node)) {
+                let date = dataCode === 'deleteDateTime' ? node.data.deleteInfo.deleteDateTime : node.data.createDateTime;
+                let localDateTime = new Date(date).toLocaleDateString();
+                value = new Date(localDateTime).Format('yyyy-MM-dd');
+            }
+        }
+        else if(dataCode === 'recovery'){
+            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 === 'feeRateFile'){
+            if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
+                value = '恢复';
+            }
+        }
+        else {
+            value = node.data[dataCode] ? node.data[dataCode] : '';
+        }
+        sheet.setValue(row, col, value);
+    },
+    showTreeData: function (nodes, headers) {
+        let me = this;
+        let sheet = me.workBook.getActiveSheet();
+        let fuc = function(){
+            sheet.setRowCount(nodes.length);
+            for(let i = 0; i < nodes.length; i++){
+                let treeNodeCell = me.getTreeNodeCell(me.tree);
+                sheet.getCell(i, 0).cellType(treeNodeCell);
+                for(let j = 0; j < headers.length; j++){
+                    sheet.getRange(-1, j, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[j]['hAlign']]);
+                    sheet.getRange(-1, j, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[j]['vAlign']]);
+                    if(j !== 0){
+                        sheet.getCell(i, j).cellType(me.getBaseCell());
+                    }
+                    let dataCode = headers[j].dataCode;
+                    me.setCellValue({row: i, col: j}, nodes[i]);
+                }
+            }
+        };
+        me.renderSheetFuc(sheet, fuc);
+    },
+    refreshNodeData: function (node) {
+        let me = this;
+        let sheet = me.workBook.getActiveSheet();
+        let header = me.setting.header;
+        let rIdx = me.tree.items.indexOf(node);
+        me.renderSheetFuc(sheet, function () {
+            for(let i = 0; i < header.length; i++){
+                me.setCellValue({row: rIdx, col: i}, node);
+            }
+        });
+    },
+    remove: function (node) {
+        let me = this;
+        let sheet = me.workBook.getActiveSheet();
+        //删除行号
+        let rIdx = me.tree.items.indexOf(node);
+        //删除行数
+        let count = node.posterityCount() + 1;
+        me.tree.removeNode(node);
+        me.renderSheetFuc(sheet, function () {
+            sheet.deleteRows(rIdx, count);
+            sheet.setRowCount(me.tree.items.length);
+            me.initSelection(sheet.getActiveRowIndex());
+        });
+    },
+    move: function (orgRow, newRow) {
+        this.workBook.getActiveSheet().deleteRows(orgRow, 1);
+        this.addRow(this.tree.items[newRow]);
+    }
+};
 $(document).ready(function () {
     $('#tab_pm_gc').on('show.bs.tab', function () {
         //侧滑隐藏
         $('.slide-sidebar').removeClass('open');
         $('.slide-sidebar').css('width', '0');
-        $('#gc_waiting').show();
         gc_init();
-        Tree = null;
+        projTreeObj.tree = null;
     });
     e_recFiles($('#reFileBtn'));
     e_recProj($('#rePojBtn'));
 });
 
 function gc_init(){
-    let table = $('#gcTree');
-    $('thead', table).remove();
-    $('tbody', table).remove();
+    $.bootstrapLoading.start();
     a_getGC(function (datas) {
         m_buildVirtualTree(datas);
         let normalDatas = m_VTreeToDatas(datas);
-        gcTree = $.fn.treeTable.init(table, gcTreeSetting, normalDatas);
-        $('#gc_waiting').hide();
+        gcTreeObj.tree = pmTree.createNew(gcTreeObj.setting, normalDatas);
+        gcTreeObj.tree.selected = gcTreeObj.tree.items[0];
+        gcTreeObj.buildSheet();
+        gcTreeObj.showTreeData(gcTreeObj.tree.items, gcTreeObj.setting.header);
+        //初始选择
+        gcTreeObj.initSelection(0);
+        $.bootstrapLoading.end();
     });
 }
 
@@ -277,7 +719,7 @@ function v_recFiles(project, fileIds, type){
 }
 
 function v_removeNode(node){
-    gcTree.removeNode(node);
+    gcTreeObj.remove(node);
     let parent = node.parent || null;
     if(parent && parent.children.length === 0 && parent.data !== undefined){
         if(parent.data.projType === projectType.project && fileEmpty(parent)){
@@ -293,7 +735,7 @@ function v_refreshNode(node){
     if(deleted(node)){
         delete node.data.deleteInfo;
     }
-    gcTree.refreshNodesDom([node]);
+    gcTreeObj.refreshNodeData(node);
     let parent = node.parent || null;
     if(parent && parent.data !== undefined){
         v_refreshNode(parent);
@@ -495,7 +937,7 @@ function e_recFiles(btn){
             recIds.push(i.id);
         }
         let type = $('[name = "fileItems"]:checked').attr('fileType');
-        let selected = gcTree.selected();
+        let selected = gcTreeObj.tree.selected;
         //backend
         let updateDatas = [];
         for(let i = 0, len = recObjs.length; i < len; i++){
@@ -516,20 +958,20 @@ function e_recFiles(btn){
                     delete selected.data.deleteInfo;
                 }
                 if(fileEmpty(selected) && selected.children.length === 0){
-                    gcTree.removeNode(selected);
+                    gcTreeObj.remove(selected);
                 }
                 else {
-                    gcTree.refreshNodesDom([selected]);
+                    gcTreeObj.refreshNodeData(selected);
                 }
             }
         }
     });
 }
 
-//点击项目下的恢复操作(确认
+//点击项目下的恢复操作(确认
 function e_recProj(btn){
     btn.bind('click', function () {
-        let selected = gcTree.selected();
+        let selected = gcTreeObj.tree.selected;
         //backend
         let updateObj = m_getRecDatas(selected);
         let updateDatas = updateObj.proj.concat(updateObj.file);

+ 80 - 24
web/building_saas/pm/js/pm_newMain.js

@@ -377,6 +377,34 @@ const projTreeObj = {
         };
         return new TreeNodeCellType();
     },
+    setCellValue: function (cell, node) {
+        const sheet = this.workBook.getActiveSheet();
+        const {row, col} = cell;
+        let dataCode = this.setting.header[col]['dataCode'];
+        let value = '';
+        if(dataCode === 'engineeringCost'){
+            if(node.data.projType === projectType.tender){
+                value =  node.data.engineeringCost ? node.data.engineeringCost : 0;
+            }
+        }
+        else if(dataCode === 'unitPriceFile'){
+            if(node.data.projType === projectType.tender){
+                value = node.data.property && node.data.property.unitPriceFile && node.data.property.unitPriceFile.name ? node.data.property.unitPriceFile.name : '';
+            }
+        }
+        else if(dataCode === 'feeRateFile'){
+            if(node.data.projType === projectType.tender){
+                value = node.data.property && node.data.property.feeFile && node.data.property.feeFile.name ? node.data.property.feeFile.name : '';
+            }
+        }
+        else if(dataCode === 'createDateTime'){
+            value = node.data.createDateTime ? new Date(node.data.createDateTime).Format('yyyy-MM-dd') : '';
+        }
+        else {
+            value = node.data[dataCode] ? node.data[dataCode] : '';
+        }
+        sheet.setValue(row, col, value);
+    },
     showTreeData: function (nodes, headers) {
         let me = this;
         let sheet = me.workBook.getActiveSheet();
@@ -388,33 +416,24 @@ const projTreeObj = {
                 for(let j = 0; j < headers.length; j++){
                     sheet.getRange(-1, j, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[j]['hAlign']]);
                     sheet.getRange(-1, j, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[j]['vAlign']]);
+                    me.setCellValue({row: i, col: j}, nodes[i]);
                     let dataCode = headers[j].dataCode;
-                    sheet.setValue(i, j, nodes[i]['data'][dataCode]);
+                    //sheet.setValue(i, j, nodes[i]['data'][dataCode]);
                 }
             }
         };
         me.renderSheetFuc(sheet, fuc);
     },
-    refreshNodeData: function (sheet, node) {
+    refreshNodeData: function (node) {
         let me = this;
-        //解决字段名不同
-        if(node.data.projType !== projectType.tender){
-            node.data.engineeringCost = '';
-            node.data.unitPriceFile = '';
-            node.data.feeRateFile = '';
-            node.data.createDateTime = '';
-        }
-        else{
-            node.data.engineeringCost = node.data.engineeringCost ? node.data.engineeringCost : 0;
-            node.data.unitPriceFile = node.data.property && node.data.property.unitPriceFile && node.data.property.unitPriceFile.name ? node.data.property.unitPriceFile.name : '';
-            node.data.feeRateFile = node.data.property && node.data.property.feeFile && node.data.property.feeFile.name ? node.data.property.feeFile.name : '';
-            node.data.createDateTime = node.data.createDateTime ? new Date(node.data.createDateTime).Format('yyyy-MM-dd') : '';
-        }
+        let sheet = me.workBook.getActiveSheet();
+        let header = me.setting.header;
         let rIdx = me.tree.items.indexOf(node);
-        for(let col = 0; col < me.setting.header.length; col++){
-            let dataCode = me.setting.header[col]['dataCode'];
-            sheet.setValue(rIdx, col, node.data[dataCode]);
-        }
+        me.renderSheetFuc(sheet, function () {
+            for(let i = 0; i < header.length; i++){
+                me.setCellValue({row: rIdx, col: i}, node);
+            }
+        });
     },
     insert: function (data, parent, next) {
         let node = this.tree.addNodeData(data, parent, next);
@@ -437,7 +456,7 @@ const projTreeObj = {
                 sheet.setRowVisible(rIdx, false);
             }
             sheet.getCell(rIdx, 0).cellType(me.getTreeNodeCell(me.tree));
-            me.refreshNodeData(sheet, node);
+            me.refreshNodeData(node);
         });
     },
     remove: function (sheet, rIdx, count) {
@@ -457,7 +476,7 @@ const projTreeObj = {
 $(document).ready(function() {
     init();
     $('#tab_pm_all').on('show.bs.tab', function () {
-        gcTree = null;
+        gcTreeObj.tree = null;
         init();
     });
 
@@ -948,7 +967,7 @@ function init() {
     //init spread and pmTree
     $.bootstrapLoading.start();
     GetAllProjectData(function (datas) {
-        projTreeObj.getShowData(datas);
+       // projTreeObj.getShowData(datas);
         projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
         projTreeObj.tree.selected = projTreeObj.tree.items[0];
         projTreeObj.buildSheet();
@@ -2129,8 +2148,8 @@ function bindEvents_file_table(jqS, usedObj, targetBody, type){
     $(jqS + ' p a:eq(1)').on('click', function () {
         let fileObjs = getFileObj(targetBody, type);
         let orgDispName = $(jqS + ' div:eq(0)')[0].childNodes[0].textContent;
-        let postFix = orgDispName.slice(orgDispName.length - 4, orgDispName.length);
-        let orgName = orgDispName.slice(0, orgDispName.length - 4);
+        let postFix = '';
+        let orgName = orgDispName;
         $(jqS + ' input').val(orgName);
         $(jqS + ' div:eq(0)').hide();
         $(jqS + ' div:eq(1)').show();
@@ -2138,6 +2157,7 @@ function bindEvents_file_table(jqS, usedObj, targetBody, type){
         $(jqS + ' .btn-success').on('click', function () {
             let attrId = $(jqS).attr('id');
             let id = attrId.slice(5, attrId.length);
+            console.log(id);
             let newName = $(jqS + ' input').val().trim();
             if(newName !== orgName){
                 if(hasThisFileName(fileObjs, newName)){
@@ -2168,6 +2188,8 @@ function bindEvents_file_table(jqS, usedObj, targetBody, type){
                     $(jqS + ' div:eq(0)')[0].childNodes[0].textContent = newDispName;
                     $(jqS + ' div:eq(0)').show();
                     $(jqS + ' div:eq(1)').hide();
+                    //refresh tender
+                    refreshTenderFile(getTendersByFile(type, id, projTreeObj.tree.selected), type, newName);
                 });
             }
             let newDispName = newName + postFix;
@@ -2261,3 +2283,37 @@ function hasThisFileName(fileObjs, name){
     }
     return false;
 }
+
+//获得使用此单价、费率文件的项目节点
+function getTendersByFile(type, fileId, project){
+    let rst = [];
+    let tenders = getProjTenders(project);
+    for(let tender of tenders){
+        if(type === fileType.unitPriceFile && tender.data.property && tender.data.property.unitPriceFile){
+            if(fileId == tender.data.property.unitPriceFile.id){
+                rst.push(tender);
+            }
+        }
+        else if(type === fileType.feeRateFile && tender.data.property && tender.data.property.feeFile){
+            if(fileId == tender.data.property.feeFile.id){
+                rst.push(tender);
+            }
+        }
+    }
+    return rst;
+}
+
+//重命名单价、费率文件后,刷新使用此文件的节点
+function refreshTenderFile(tenders, type, newName){
+   projTreeObj.renderSheetFuc(projTreeObj.workBook.getActiveSheet(), function () {
+       for(let tender of tenders){
+           if(type === fileType.unitPriceFile){
+               tender.data.property.unitPriceFile.name = newName;
+           }
+           else if(type === fileType.feeRateFile){
+               tender.data.property.feeFile.name = newName;
+           }
+           projTreeObj.refreshNodeData(tender);
+       }
+   });
+}