Просмотр исходного кода

计算基数、费率合并到综合单价...

zhongzewei 6 лет назад
Родитель
Сommit
e579c3041a

+ 12 - 0
modules/main/controllers/bills_controller.js

@@ -213,6 +213,7 @@ module.exports = {
         };
         const form = new multiparty.Form(uploadOption);
         let uploadFullName;
+        let parseSheetDateA = +new Date();
         form.parse(req, async function(err, fields, files) {
             try{
                 const projectID = fields.projectID !== undefined && fields.projectID.length > 0 ?
@@ -263,7 +264,10 @@ module.exports = {
                         validSheets[sheetInfo.position].push(sheet)
                     }
                 }
+                let parseSheetB = +new Date();
+                console.log(`解析表时间: ${parseSheetB - parseSheetDateA}===================================================================`);
                 //合并同类表并提取表的有效数据
+                let validSheetDataA = +new Date();
                 let toImportSheets = [];
                 for(let uploadPosition in validSheets){
                     let validExcelData = [];
@@ -274,7 +278,10 @@ module.exports = {
                         toImportSheets.push({position: uploadPosition, colMapping: validSheets[uploadPosition][0].colMapping, validExcelData: validExcelData});
                     }
                 }
+                let validSheetDataB = +new Date();
+                console.log(`获取表格有效数据时间: ${validSheetDataB - validSheetDataA}==========================================================`);
                 //匹配的清单库
+                let stdDateA = +new Date();
                 const billsLibId = fields.billsLibId !== undefined && fields.billsLibId.length > 0 && fields.billsLibId[0]? parseInt(fields.billsLibId[0]) : null;
                 let stdBills = [], stdJobs = [], stdCharacters = [];
                 if(billsLibId){
@@ -283,13 +290,18 @@ module.exports = {
                     stdCharacters = await stdBillCharacterModel.find({billsLibId: billsLibId, deleted: false});
                 }
                 let stdData = {stdBills: stdBills, stdJobs: stdJobs, stdCharacters: stdCharacters};
+                let stdDateB = +new Date();
+                console.log(`获取标准清单库数据时间: ${stdDateB - stdDateA}`);
                 //导入表
+                let importDateA = +new Date();
                 for(let importData of toImportSheets){
                     let updateFrontData = await importSheet(importData, req.session.sessionUser.id, projectID, stdData);
                     if(updateFrontData){
                         responseData.data.push(updateFrontData);
                     }
                 }
+                let importDateB = +new Date();
+                console.log(`导入时间: ${importDateB - importDateA}=========================================================================`);
                 if(responseData.data.length === 0){
                     throw 'excel无有效数据';
                 }

+ 2 - 2
server.js

@@ -34,8 +34,8 @@ app.engine('.html', require('ejs').__express);
 app.set('view engine', 'html');
 
 let bodyParser = require('body-parser');
-app.use(bodyParser.urlencoded({limit: '3mb', extended: false}));
-app.use(bodyParser.json({limit: '3mb'}));
+app.use(bodyParser.urlencoded({limit: '10mb', extended: false}));
+app.use(bodyParser.json({limit: '10mb'}));
 
 app.use(session({
     name: 'usersSession',

+ 5 - 3
web/building_saas/css/main.css

@@ -1,9 +1,11 @@
-
 /*building SAAS 0.1*/
 /*bootstrap 初始化*/
 body {
     font-size: 0.9rem;
-    overflow: hidden
+    overflow: hidden;
+}
+a{
+    outline: none
 }
 .dropdown-menu {
     font-size: 0.9rem
@@ -386,4 +388,4 @@ body {
 }
 .custom-file-input:lang(zh) ~ .custom-file-label::after {
     content: "浏览";
-}
+}

+ 91 - 5
web/building_saas/main/html/main.html

@@ -844,7 +844,7 @@
                     <input type="hidden" id="actionType">
                 </div>
                 <div class="modal-body" style="padding-left: 0; padding-right: 3px; margin-left: 0;">
-                        <div style="width: 20%; float: left;">
+                        <div style="width: 25%; float: left;">
                             <div  class="modal-auto-height" id="componentTreeDiv" style=" height: 415px; overflow: hidden;">
                                 <!--<div class="print-list">-->
                                 <div style="width: 100%; height: 100%; overflow: auto">
@@ -853,7 +853,7 @@
                                 <!--</div>-->
                             </div>
                         </div>
-                        <div style="width:80%; padding-left: 3px; float: left;">
+                        <div style="width:75%; padding-left: 3px; float: left;">
                             <div class="row">
                                 <div class="col-12" id="gljRadios">
                                     <div class="row">
@@ -914,7 +914,7 @@
         </div>
     </div>
     <!--费率选择窗口-->
-    <div class="modal fade" id="fee_rate_tree" data-backdrop="static">
+    <!--<div class="modal fade" id="fee_rate_tree" data-backdrop="static">
         <div class="modal-dialog modal-feeRate" role="document" id="fee_rate_dialog">
             <div class="modal-content" >
                 <div class="modal-header">
@@ -935,9 +935,95 @@
                 </div>
             </div>
         </div>
+    </div>-->
+    <!--弹出 清单 计算基数 和 费率(%)-->
+    <div class="modal fade" id="calcBaseFeeRate" data-backdrop="static">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">计算基数选择</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">×</span>
+                    </button>
+                    <ul class="nav nav-tabs mb-3" role="tablist">
+                        <li class="nav-item">
+                            <a class="nav-link active px-3" data-toggle="tab" href="#m-js" id="tabCalcBase" role="tab">计算基数</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link px-3" data-toggle="tab" href="#m-fl" id="tabFeeRate" role="tab">费率(%)</a>
+                        </li>
+                    </ul>
+                    <div class="tab-content">
+                        <div class="tab-pane active" id="m-js" role="tabpanel">
+                            <div class="form-group">
+                                <input class="form-control" id="calcBaseExp" value="">
+                                <p class="form-text">
+                                    <button class="btn btn-secondary btn-sm" id="addOpr">+</button>
+                                    <button class="btn btn-secondary btn-sm" id="subOpr">-</button>
+                                    <button class="btn btn-secondary btn-sm" id="mulOpr">*</button>
+                                    <button class="btn btn-secondary btn-sm" id="divOpr">/</button>
+                                    <button class="btn btn-secondary btn-sm" id="leftOpr">(</button>
+                                    <button class="btn btn-secondary btn-sm" id="rightOpr">)</button>
+                                    <span id="errorInfo" style="margin-left:15px;"></span>
+                                </p>
+                            </div>
+                            <div class="row" id="cbRowDiv">
+                                <div class="col-3" id="cbClassList">
+                                    <ul class="list-unstyled">
+                                        <li class="py-1">
+                                            <a id="cb_ALL" class="btn btn-outline-secondary btn-sm active" href="javascript:void(0)">所有</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_FBFX"  href="javascript:void(0);">分部分项</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_CSXM" href="javascript:void(0)">措施项目</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_QTXM" href="javascript:void(0)">其他项目</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_RCJ" href="javascript:void(0)">人材机</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_FBF" href="javascript:void(0)">分包费</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_GF" href="javascript:void(0)">规费</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_SJ" href="javascript:void(0)">税金</a>
+                                        </li>
+                                        <li class="py-1">
+                                            <a id="cb_SQGCZJ" href="javascript:void(0)">税前工程造价</a>
+                                        </li>
+                                    </ul>
+                                </div>
+                                <div class=" modal-auto-height col-9" style="overflow: hidden; padding: 0; margin: 0;" id="billsBaseSpread">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="tab-pane" id="m-fl" role="tabpanel">
+                            <input type="hidden" id="edit_from">
+                            <div class="modal-fixed-height" style="overflow: hidden" id="fee_rate_sheet">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <a href="javascript:void(0);" class="btn btn-primary" id="calcBaseFeeRateConf">确定</a>
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+                </div>
+            </div>
+        </div>
     </div>
     <!--弹出 清单 计算基数-->
-    <div class="modal fade" id="qd-jsjs" data-backdrop="static">
+    <!--<div class="modal fade" id="qd-jsjs" data-backdrop="static">
         <div class="modal-dialog" role="document">
             <div class="modal-content" style="width:670px;">
                 <div class="modal-header">
@@ -1002,7 +1088,7 @@
                 </div>
             </div>
         </div>
-    </div>
+    </div>-->
     <!--弹出补充定额库-->
     <div class="modal fade" id="comple-ration" data-backdrop="static">
         <div class="modal-dialog modal-lg" role="document">

+ 3 - 0
web/building_saas/main/js/models/calc_program.js

@@ -1911,6 +1911,9 @@ class CalcProgram {
     calcFormulaNodes(changedArr, tender){
         let me = this;
         let formulaNodes = cbTools.getFormulaNodes(true);
+        for(let n of formulaNodes){
+            console.log(`${n.data.name} : ${n.data.calcBase}`);
+        }
         if (formulaNodes.length == 0) return;
         for (let formulaNode of formulaNodes){
             formulaNode.data.userCalcBase = formulaNode.data.calcBase;    // 这句不该出现,projectObj.project.calcBase中要改进。

+ 57 - 12
web/building_saas/main/js/views/calc_base_view.js

@@ -7,7 +7,7 @@
 let calcBaseView = {
     //可用计算基数的清单固定列映射(与fixedFlag)
     inputExpr: $('#calcBaseExp'),
-    confirmBtn: $('#calcBaseConf'),
+    confirmBtn: $('#calcBaseFeeRateConf'),//org:calcBaseConf
     type: {bills: 'bills', ration: 'ration'},
     billsCBClass:{ALL: [], FBFX: [], CSXM: [], QTXM: [], FBF: [], RCJ: [], GF: [], SJ: [], SQGCZJ: []},
     curType: null,
@@ -15,8 +15,8 @@ let calcBaseView = {
     workBook: null,
     setting:{
         billsHeader: [
-            {name: '计算基础名称', dataCode: 'base', width: 280, vAlign: 'center', hAlign: 'left'},
-            {name: '金额', dataCode: 'price', width: 120, vAlign: 'center', hAlign: 'right'}
+            {name: '计算基础名称', dataCode: 'base', width: 220, vAlign: 'center', hAlign: 'left'},
+            {name: '金额', dataCode: 'price', width: 100, vAlign: 'center', hAlign: 'right'}
         ],
         rationHeader: [
             {name: '定额计算程序基数名称', dataCode: 'base', width: 400, vAlign: 'center', hAlign: 'left'}
@@ -54,8 +54,12 @@ let calcBaseView = {
         let fuc = function () {
             sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
             sheet.options.isProtected = true;
+            sheet.options.protectionOptions = {
+                allowResizeColumns: true
+            };
             sheet.setColumnCount(headers.length);
             sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader);
+            sheet.setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
             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);
@@ -179,7 +183,7 @@ let calcBaseView = {
             }
             //显示清单基数分类
             $('#cbClassList').show();
-            $('#qd-jsjs .modal-content').css('width', '670px');
+           // $('#qd-jsjs .modal-content').css('width', '670px');
             $('#cbRowDiv').addClass('row');
             $('#billsBaseSpread').addClass('col-9');
             //
@@ -196,7 +200,7 @@ let calcBaseView = {
         else if (type == me.type.ration) {
             //去除清单基数分类
             $('#cbClassList').hide();
-            $('#qd-jsjs .modal-content').css('width', '');
+            //$('#qd-jsjs .modal-content').css('width', '');
             $('#cbRowDiv').removeClass('row');
             $('#billsBaseSpread').removeClass('col-9');
 
@@ -218,7 +222,8 @@ let calcBaseView = {
 
         me.buildSheet();
         me.showData(showDatas);
-        $('#qd-jsjs').modal('show');
+        //$('#qd-jsjs').modal('show');
+        $('#calcBaseFeeRate').modal('show');
     },
 
     getInputExpr: function () {
@@ -281,12 +286,18 @@ let calcBaseView = {
     calcBaseConf: function () {
         let me = calcBaseView;
         me.confirmBtn.bind('click', function () {
+            //通过什么触发:计算基数、综合合价
+            let toggle = me.confirmBtn.attr('toggle');
+            if(!toggle || toggle !== 'calcBase'){
+                return;
+            }
             //bills
             if(me.curType === me.type.bills){
                 let selected = projectObj.project.mainTree.selected;
                 projectObj.updateCellValue(selected, me.getInputExpr(), {data: {field: 'calcBase'}});
                 if(projectObj.project.calcBase.success){
-                    $('#qd-jsjs').modal('hide');
+                    //$('#qd-jsjs').modal('hide');
+                    $('#calcBaseFeeRate').modal('hide');
                 }
             }
             else if (me.curType === me.type.ration) {
@@ -318,7 +329,8 @@ let calcBaseView = {
                                 let relationNodes = calcTools.getNodesByProgramID(template.ID);
                                 cp.calcNodesAndSave(relationNodes);
                                 calcProgramManage.refreshDetailSheet();
-                                $('#qd-jsjs').modal('hide');
+                                //$('#qd-jsjs').modal('hide');
+                                $('#calcBaseFeeRate').modal('hide');
                                 $.bootstrapLoading.end();
                             }
                         });
@@ -327,8 +339,10 @@ let calcBaseView = {
                         $('#errorInfo').html(analyzer.error);
                     };
                 }
-                else
-                    $('#qd-jsjs').modal('hide');
+                else{
+                    //$('#qd-jsjs').modal('hide');
+                    $('#calcBaseFeeRate').modal('hide');
+                }
             }
         });
     },
@@ -398,6 +412,9 @@ let calcBaseView = {
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
                     if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
+                        calcBaseView.confirmBtn.attr('toggle', 'calcBase');
+                        changeCalcBaseFeeRate('calcBase');
+                        $('#tabCalcBase').tab('show');
                         calcBaseView.initCalctor(type);
                     }
                 }
@@ -416,11 +433,25 @@ let calcBaseView = {
 };
 
 $(document).ready(function () {
-    $('#qd-jsjs').on('shown.bs.modal', function () {
+ /*   $('#qd-jsjs').on('shown.bs.modal', function () {
         calcBaseView.workBook.refresh();
+    });*/
+    $('#calcBaseFeeRate').on('shown.bs.modal', function () {
+        let toggle = calcBaseView.confirmBtn.attr('toggle');
+        if(toggle === 'calcBase'){
+            $('#tabCalcBase').tab('show');
+        }
+        if(calcBaseView.workBook){
+            calcBaseView.workBook.refresh();
+        }
+    });
+    $('#tabCalcBase').on('shown.bs.tab', function () {
+        if(calcBaseView.workBook){
+            calcBaseView.workBook.refresh();
+        }
     });
 
-    $('#qd-jsjs').on('hidden.bs.modal', function () {
+    /*$('#qd-jsjs').on('hidden.bs.modal', function () {
         $('#errorInfo').text('');
         //清空输入框
         calcBaseView.inputExpr.val('');
@@ -430,6 +461,20 @@ $(document).ready(function () {
         for(let attr in calcBaseView.billsCBClass){
             calcBaseView.billsCBClass[attr] = [];
         }
+    });*/
+
+    $('#calcBaseFeeRate').on('hidden.bs.modal', function () {
+        $('#errorInfo').text('');
+        //清空输入框
+        calcBaseView.inputExpr.val('');
+        if(calcBaseView.workBook){
+            calcBaseView.workBook.destroy();
+            calcBaseView.workBook = null;
+        }
+        //清空清单分类数据
+        for(let attr in calcBaseView.billsCBClass){
+            calcBaseView.billsCBClass[attr] = [];
+        }
     });
 
     //bind operator click function

+ 40 - 7
web/building_saas/main/js/views/fee_rate_view.js

@@ -360,6 +360,9 @@ var feeRateObject={
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
                     if(!projectReadOnly && me.ifFeeRateEdit(hitinfo.row)){
+                        $('#calcBaseFeeRateConf').attr('toggle', 'feeRate');
+                        changeCalcBaseFeeRate('feeRate');
+                        $('#tabFeeRate').tab('show');
                         me.showSelectModal(hitinfo);
                     }
                 }
@@ -381,7 +384,8 @@ var feeRateObject={
         if(project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected)){
             return;
         }
-        $("#fee_rate_tree").modal({show:true});
+        //$("#fee_rate_tree").modal({show:true});
+        $("#calcBaseFeeRate").modal({show:true});
         $('#edit_from').val(hitinfo.sheet.name());
     },
     setSheetGroup:function (rate,data,groups,row) {
@@ -873,7 +877,8 @@ var feeRateObject={
             selected.changed = true;
             projectObj.project.calcProgram.calcAndSave(selected);
             //projectObj.mainController.refreshTreeNode([selected]);
-            $("#fee_rate_tree").modal('hide');
+            //$("#fee_rate_tree").modal('hide');
+            $("#calcBaseFeeRate").modal('hide');
             $.bootstrapLoading.end();
         });
     },
@@ -889,7 +894,8 @@ var feeRateObject={
             projectObj.project.calcProgram.compileAllTemps();
             projectObj.project.calcProgram.calcAllNodesAndSave();
             calcProgramManage.refreshDetailSheet();
-            $("#fee_rate_tree").modal('hide');
+            //$("#fee_rate_tree").modal('hide');
+            $("#calcBaseFeeRate").modal('hide');
             $.bootstrapLoading.end();
         });
         console.log(calInfo);
@@ -1060,16 +1066,39 @@ $(function(){
         socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
     })
 
-    $('#fee_rate_tree').on('shown.bs.modal', function (e) {
+   /* $('#fee_rate_tree').on('shown.bs.modal', function (e) {
+        if(feeRateObject.feeRateSpreads==null){
+            feeRateObject.createSheet();
+        }
+        feeRateObject.feeRateSelection=null;
+        feeRateObject.showSelectTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
+        feeRateObject.locate();
+    });*/
+    $('#calcBaseFeeRate').on('shown.bs.modal', function (e) {
+        let toggle = $('#calcBaseFeeRateConf').attr('toggle');
         if(feeRateObject.feeRateSpreads==null){
             feeRateObject.createSheet();
         }
         feeRateObject.feeRateSelection=null;
         feeRateObject.showSelectTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
         feeRateObject.locate();
+        feeRateObject.feeRateSpreads.refresh();
+    });
+    $('#tabFeeRate').on('shown.bs.tab', function () {
+        if(feeRateObject.feeRateSpreads){
+            feeRateObject.feeRateSpreads.refresh();
+        }
     });
 
-    $('#fee_rate_tree').on('hidden.bs.modal', function (e) {
+    /*$('#fee_rate_tree').on('hidden.bs.modal', function (e) {
+        if(feeRateObject.feeRateSpreads){
+            feeRateObject.feeRateSpreads.destroy();
+            feeRateObject.feeRateSpreads=null;
+            $('#edit_from').val('');
+            $('#edit_row').val('');
+        }
+    });*/
+    $('#calcBaseFeeRate').on('hidden.bs.modal', function (e) {
         if(feeRateObject.feeRateSpreads){
             feeRateObject.feeRateSpreads.destroy();
             feeRateObject.feeRateSpreads=null;
@@ -1077,8 +1106,12 @@ $(function(){
             $('#edit_row').val('');
         }
     });
-
-    $('#fee_selected_conf').bind('click',function (){
+    //fee_selected_conf
+    $('#calcBaseFeeRateConf').bind('click',function (){
+        let toggle = $(this).attr('toggle');
+        if(!toggle || toggle !== 'feeRate'){
+            return;
+        }
         feeRateObject.submitFeeRateBySelect();
     })
 })

+ 2 - 2
web/building_saas/main/js/views/glj_view.js

@@ -82,8 +82,8 @@ var gljOprObj = {
         header: [
             {headerName: "选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center", cellType: "checkBox"},
             {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName: "名称", headerWidth: 240, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName: "规格型号", headerWidth: 190, dataCode: "specs", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName: "名称", headerWidth: 220, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName: "规格型号", headerWidth: 185, dataCode: "specs", dataType: "String", hAlign: "left", vAlign: "center"},
             {headerName: "单位", headerWidth: 40, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName: "单价", headerWidth: 55, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
             {headerName: "类型", headerWidth: 60, dataCode: "gljType", dataType: "String", hAlign: "center", vAlign: "center"},

+ 3 - 0
web/building_saas/main/js/views/main_tree_col.js

@@ -293,6 +293,9 @@ let MainTreeCol = {
             if(MainTreeCol.readOnly.glj(node)||(calcTools.isGljRation(node)&&projectObj.project.projectGLJ.isEstimateType(node.data.subType))||(MainTreeCol.readOnly.bills(node)&&(node.data.type == billType.BX||node.data.type == billType.FX))){
                 return new GC.Spread.Sheets.CellTypes.CheckBox();
             }
+        },
+        commonTotalFee: function () {
+            return projectObj.getCommonTotalFeeCellType();
         }
     },
     editChecking:function(node){

+ 136 - 1
web/building_saas/main/js/views/project_view.js

@@ -453,6 +453,9 @@ var projectObj = {
                     if(value === undefined ||value === null || value.toString().trim() === ''){
                         value = '';
                     }
+                    if(value === node.data.calcBase){
+                        return;
+                    }
                     node.data.userCalcBase = value;
                     project.calcBase.calculate(node);
                     if(!project.calcBase.success){
@@ -1642,6 +1645,92 @@ var projectObj = {
         })
         return !col.visible;
     },
+    //综合合价cellType
+    getCommonTotalFeeCellType:function () {
+        let type = 'bills';
+        var ns = GC.Spread.Sheets;
+        function CommonTotalFeeCellType() {
+            var init=false;
+        }
+        CommonTotalFeeCellType.prototype = new ns.CellTypes.Text();
+        CommonTotalFeeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
+            //  if(value!=null){
+            // ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3);
+            // ctx.fillText(value,x+w-3,y+h-3);
+            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+            // }
+            if(calcBaseView.editingCell && !projectReadOnly && calcBaseView.ifEdit(type, options.row)){
+                if(calcBaseView.editingCell.row==options.row&&calcBaseView.editingCell.col==options.col){
+                    var image = document.getElementById('f_btn'),imageMagin = 3;
+                    var imageHeight = h-2*imageMagin;
+                    var imageWidth = w*2/(type=='bills'?7:20);
+                    var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
+                    ctx.save();
+                    ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
+                    ctx.beginPath();
+                    ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
+                    ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false);
+                    ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false);
+                    ctx.fillStyle="black";//填充颜色,默认是黑色
+                    ctx.fill();//画实心圆
+                    ctx.closePath();
+                    ctx.restore();
+                }
+            }
+        };
+        CommonTotalFeeCellType.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
+            };
+        };
+        CommonTotalFeeCellType.prototype.processMouseDown = function (hitinfo) {
+            let me=calcBaseView;
+            me.pmLeave = false;
+            if(me.editingCell==null){
+                var showSelectBtn = true;
+                if(hitinfo.sheet.name()!='calc_detail'){
+                    showSelectBtn=me.ifEdit(type, hitinfo.row);
+                }
+                if(showSelectBtn){
+                    me.editingCell={
+                        row:hitinfo.row,
+                        col:hitinfo.col
+                    }
+                    hitinfo.sheet.invalidateLayout();
+                    hitinfo.sheet.repaint();
+                }
+            }else if(hitinfo.row==me.editingCell.row){
+                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
+                var imageMagin=3;
+                var imageHeight = hitinfo.cellRect.height-2*imageMagin;
+                var imageWidth = hitinfo.cellRect.width*2/7;
+                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
+                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
+                        calcBaseView.confirmBtn.attr('toggle', 'commonTotalFee');
+                        changeCalcBaseFeeRate('commonTotalFee');
+                        $('#tabCalcBase').tab('show');
+                        calcBaseView.initCalctor(type);
+                        feeRateObject.showSelectModal(hitinfo);
+                    }
+                }
+            }
+        };
+        CommonTotalFeeCellType.prototype.processMouseLeave = function (hitinfo) {
+            if(!calcBaseView.pmLeave){
+                calcBaseView.editingCell=null;
+                hitinfo.sheet.invalidateLayout();
+                hitinfo.sheet.repaint();
+                calcBaseView.pmLeave = true;
+            }
+        }
+        return new CommonTotalFeeCellType();
+    },
 
 };
 
@@ -2329,6 +2418,7 @@ $('#customFile').change(function () {
         $('.custom-file-label').text(`请选择上传文件`);
     }
 });
+//线上nginx请求体最大设置为100m
 //从excel导入清单
 $('#uploadConfirm').click(function () {
     let me = this;
@@ -2639,4 +2729,49 @@ function disableSpread(spread){
         sheet.resumePaint();
         sheet.resumeEvent();
     }
-}
+}
+//根据触发改变计算基数、费率弹出框
+function changeCalcBaseFeeRate(toggle) {
+    if(toggle === 'calcBase'){
+        $('#calcBaseFeeRate').find('.modal-header').show();
+        $('#calcBaseFeeRate').find('.modal-title').text('计算基数选择').show();
+        $('#calcBaseFeeRate').find('.modal-body').find('button:first').hide();
+        $('#calcBaseFeeRate').find('.modal-body').find('ul:first').hide();
+    }
+    else if(toggle === 'feeRate'){
+        $('#calcBaseFeeRate').find('.modal-header').show();
+        $('#calcBaseFeeRate').find('.modal-title').text('费率选择').show();
+        $('#calcBaseFeeRate').find('.modal-body').find('button:first').hide();
+        $('#calcBaseFeeRate').find('.modal-body').find('ul:first').hide();
+    }
+    else if(toggle === 'commonTotalFee') {
+        $('#calcBaseFeeRate').find('.modal-header').hide();
+        $('#calcBaseFeeRate').find('.modal-body').find('button:first').show();
+        $('#calcBaseFeeRate').find('.modal-body').find('ul:first').show();
+    }
+}
+//综合合价弹出计算基数费率确认
+$('#calcBaseFeeRateConf').click(function () {
+    let toggle = $(this).attr('toggle');
+    if(!toggle || toggle !== 'commonTotalFee'){
+        return
+    }
+    let needToSave = false;
+    let validateFeeRate = feeRateObject.checkSelectedFeeRate();
+    let calcBaseValue = calcBaseView.getInputExpr() ? calcBaseView.getInputExpr() : '';
+    let selected = projectObj.project.mainTree.selected;
+    if(calcBaseValue !== selected.data.calcBase){
+        needToSave = true;
+        selected.data.userCalcBase = calcBaseValue;
+        projectObj.project.calcBase.calculate(selected);
+    }
+    if(!projectObj.project.calcBase.success){
+        return;
+    }
+    if(validateFeeRate){
+        feeRateObject.submitFeeRateFromBill();
+    }
+    else if(!validateFeeRate && needToSave) {
+        projectObj.project.calcProgram.calcAndSave(selected);
+    }
+});

+ 2 - 2
web/building_saas/pm/js/pm_newMain.js

@@ -55,9 +55,9 @@ const projTreeObj = {
             {name: '分部分项合计', dataCode: 'subEngineering', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '措施项目合计', dataCode: 'measure', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '其他项目合计', dataCode: 'other', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-           /* {name: '安全文明施工费', dataCode: 'safetyConstruction', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+            //{name: '安全文明施工费', dataCode: 'safetyConstruction', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '规费', dataCode: 'charge', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '税金', dataCode: 'tax', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},*/
+            {name: '税金', dataCode: 'tax', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '占造价比例(%)', dataCode: 'rate', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '建筑面积', dataCode: 'buildingArea', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '单方造价', dataCode: 'perCost', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},