瀏覽代碼

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhongzewei 7 年之前
父節點
當前提交
c331fe3b30

+ 1 - 1
.gitignore

@@ -2,6 +2,6 @@ node_modules/
 .git/
 dist/
 .idea/
-tmp/
+tmp/*.xlsx
 test/unit/logs
 *.log

+ 2 - 0
modules/main/models/ration.js

@@ -38,6 +38,8 @@ let rationSchema = new Schema({
     caption: String,
     unit: String,
     quantity: String, // Decimal
+    marketUnitFee: String,
+    marketTotalFee: String,
     isFromDetail:{type: Number,default:0},  //1 true 2 false
     programID: Number,
     adjustState: String,

+ 28 - 0
modules/reports/controllers/rpt_controller.js

@@ -115,6 +115,7 @@ module.exports = {
             prj_id = params.prj_id,
             user_id = params.user_id,
             pageSize = params.pageSize;
+        // req.session.sessionUser.ssoId
         getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, function (err, pageRst) {
             callback(req, res, err, pageRst);
         });
@@ -128,6 +129,33 @@ module.exports = {
             callback(req, res, err, pageRst);
         })
     },
+    getExcel: function(req, res) {
+        let prj_id = req.params.prj_id,
+            rpt_id = req.params.rpt_id,
+            pageSize = req.params.size,
+            rptName = req.params.rptName,
+            isOneSheet = req.params.isOneSheet,
+            option = req.params.option;
+        let user_id = req.session.sessionUser.ssoId;
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, dftOption, function(err, pageRst){
+            try {
+                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
+                    res.setHeader('Content-Type', 'application/vnd.openxmlformats');
+                    res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
+                    let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
+                    filestream.on('data', function(chunk) {
+                        res.write(chunk);
+                    });
+                    filestream.on('end', function() {
+                        res.end();
+                    });
+                });
+            } catch (e) {
+                console.log(e);
+            }
+        })
+    },
     getTestExcel: function(req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,

+ 1 - 1
modules/reports/routes/report_router.js

@@ -25,7 +25,7 @@ module.exports =function (app) {
     rptRouter.get('/getTestPDF/:id/:size/:rptName', reportController.getTestPDF);
     //now is the real:
     rptRouter.post('/getReport', reportController.getReportAllPages);
-    // rptRouter.get('/getExcel/:id/:size/:rptName/:isOneSheet/:option', reportController.getExcel);
+    rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:rptName/:isOneSheet/:option', reportController.getExcel);
     // rptRouter.get('/getExcelInOneBook/:ids/:size/:rptName/:option', reportController.getExcelInOneBook);
     // rptRouter.get('/getPDF/:id/:size/:rptName', reportController.getPDF);
 

+ 2 - 1
modules/reports/rpt_component/jpc_flow_tab.js

@@ -370,7 +370,8 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         }
                     }
                     //检测是否可退出
-                    if (currentRecAmt >= ttlSegRecAmt) {
+                    if ((currentRecAmt >= ttlSegRecAmt) && (pageIdx % me.multiCols === 0)) {
+                        //备注:这里必须得考虑多栏的情况,否则会造成pageStatus出界的问题
                         break;
                     }
                     //控制阀值,超过阀值则强制退出,防止死循环

+ 15 - 6
modules/reports/util/rpt_excel_util.js

@@ -273,7 +273,13 @@ function writeSharedString(sharedStrList){
         for (let i = 0; i < sharedStrList.length; i++) {
             //rst.push('<si><t>' + sharedStrList[i] + '</t></si>');
             if (typeof sharedStrList[i] === 'string') {
-                rst.push('<si><t>' + sharedStrList[i].replace('|','\r\n') + '</t></si>');
+                if (sharedStrList[i].indexOf('|') >= 0) {
+                    //rst.push('<si><t>' + sharedStrList[i].split('|').join('\r\n') + '</t></si>');
+                    rst.push('<si><t>' + sharedStrList[i].split('|').join('\n') + '</t></si>');
+                } else {
+                    rst.push('<si><t>' + sharedStrList[i] + '</t></si>');
+                }
+                // rst.push('<si><t>' + sharedStrList[i].replace('|','\r\n') + '</t></si>');
             } else {
                 rst.push('<si><t>' + sharedStrList[i] + '</t></si>');
             }
@@ -335,7 +341,7 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let cacheBorderCell = {};
-    let currentPageMergePos = null;
+    let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let private_pre_analyze_pos = function(){
         let cell, pos;
         let self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
@@ -481,7 +487,10 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         return rst;
     };
     let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr, needFurtherChk) {
-        let rst = 0, mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND];
+        let rst = 0,
+            mergeBorder = (sheetData[JV.PROP_PAGE_MERGE_BORDER])?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
+            mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
+        ;
         if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] !== undefined) {
             rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT];
         }
@@ -494,7 +503,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                     for (let i = 0; i < topSide.length; i++) {
                         if (cell[JV.PROP_AREA][JV.PROP_TOP] >= topSide[i]) {
                             if (cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= bottomSide[i]) {
-                                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
+                                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBand[JV.PROP_STYLE][JV.PROP_ID]];
                                 rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
                                 break;
                             }
@@ -503,13 +512,13 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                         }
                     }
                 } else {
-                    let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
+                    let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBand[JV.PROP_STYLE][JV.PROP_ID]];
                     rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
                 }
             }
         } else {
             if (cell[JV.PROP_AREA][borderStr] === mergeBorder[borderStr]) {
-                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
+                let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBand[JV.PROP_STYLE][JV.PROP_ID]];
                 if (needFurtherChk) {
                     if (cell[JV.PROP_AREA][JV.PROP_TOP] >= mergeBorder[JV.PROP_TOP] &&
                         cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= mergeBorder[JV.PROP_BOTTOM]) {

+ 2 - 0
modules/volume_price/models/volume_price_model.js

@@ -30,6 +30,7 @@ class volumePriceModel extends baseModel {
             if(err){
                 callback(1, '', null);
             }else {
+                // console.log(JSON.stringify(datas));
                 callback(0, consts.projectConst.VOLUMEPRICE, datas);
             }
         })
@@ -39,6 +40,7 @@ class volumePriceModel extends baseModel {
         let funs = [];
 
         function saveOne(doc) {
+            // console.log('-----------------------------------------------------------------------------' + JSON.stringify(doc));
             return function (cb) {
                 switch (doc.updateType) {
                     case commonConsts.UT_UPDATE:

+ 6 - 0
modules/volume_price/models/volume_price_schema.js

@@ -20,12 +20,18 @@ let volumePriceSchema = new Schema({
     serialNo: Number,
     // 编号
     code: String,
+    // 量价类型:人工、材料、机械、主材、设备
+    type: String,
+    programID: Number,
     // 名称
     name: String,
     // 单位
     unit: String,
     // 数量
     quantity: Number,
+    marketUnitFee: String,
+    marketTotalFee: String,
+
     // 费用字段
     fees: [subSchema.feesSchema],
     // 是否删除

+ 1 - 1
public/web/tree_sheet/tree_sheet_helper.js

@@ -137,7 +137,7 @@ var TREE_SHEET_HELPER = {
                     cell.value(getFieldText2());
                 }
                 if (colSetting.data.cellType && Object.prototype.toString.apply(colSetting.data.cellType) !== "[object String]") {
-                    cell.cellType(colSetting.data.cellType);
+                    cell.cellType(colSetting.data.cellType(node));
                 }
                 if (colSetting.readOnly) {
                     if (Object.prototype.toString.apply(colSetting.readOnly) === "[object Function]") {

+ 16 - 8
test/tmp_data/test_ration_calc/ration_calc_base.js

@@ -42,42 +42,50 @@ let rationCalcBase = [
         'calcFun': 'base',
         'calcType': baseCalc,
         'gljTypes': [gljType.LABOUR]
-    },{
+    },
+    {
         'dispName': '定额基价材料费',
         'calcFun': 'base',
         'calcType': baseCalc,
         'gljTypes': [gljType.GENERAL_MATERIAL, gljType.CONCRETE, gljType.MORTAR, gljType.MIX_RATIO, gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR]
-    },{
+    },
+    {
         'dispName': '定额基价机械费',
         'calcFun': 'base',
         'calcType': baseCalc,
         'gljTypes': [gljType.GENERAL_MACHINE]
-    },{
+    },
+    {
         'dispName': '定额基价机上人工费',
         'calcFun': 'base',
         'calcType': baseCalc,
         'gljTypes': [gljType.MACHINE_LABOUR]
-    },{
+    },
+    {
         'dispName': '人工费价差',
         'calcFun': 'diff',
         'calcType': diffCalc,
         'gljTypes': [gljType.LABOUR]
-    },{
+    },
+    {
         'dispName': '材料费价差',
         'calcFun': 'diff',
         'calcType': diffCalc,
         'gljTypes': [gljType.GENERAL_MATERIAL, gljType.CONCRETE, gljType.MORTAR, gljType.MIX_RATIO, gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR]
-    },{
+    },
+    {
         'dispName': '机械费价差',
         'calcFun': 'diff',
         'calcType': diffCalc,
         'gljTypes': [gljType.GENERAL_MACHINE]
-    },{
+    },
+    {
         'dispName': '主材费',
         'calcFun': 'budget',
         'calcType': budgetCalc,
         'gljTypes': [gljType.MAIN_MATERIAL]
-    },{
+    },
+    {
         'dispName': '设备费',
         'calcFun': 'budget',
         'calcType': budgetCalc,

+ 3 - 0
tmp/forDeployment.js

@@ -0,0 +1,3 @@
+/**
+ * Created by Tony on 2017/11/28.
+ */

二進制
web/building_saas/img/FirstPageSimple.cur


二進制
web/building_saas/img/LastPageSimple.cur


二進制
web/building_saas/img/NextPageSimple.cur


二進制
web/building_saas/img/PreviousPageSimple.cur


+ 87 - 75
web/building_saas/main/js/models/calc_program.js

@@ -255,74 +255,89 @@ let executeObj = {
     },
     base: function(calcBaseName) {
         let me = executeObj, rst = 0,
-            //base = getRationCalcBase(calcBaseName);
             base = me.calcBase[calcBaseName];
 
         if (base != null) {
-            let price = 0, aprice = 0, mprice = 0, tmpSum = 0, mdSum = 0;
-
             function isSubset(sub, arr){
-                // if(!(sub instanceof Array) || !(arr instanceof Array)) return false;
-                // if(sub.length > arr.length) return false;
                 for(var i = 0, len = sub.length; i < len; i++){
                     if(arr.indexOf(sub[i]) == -1) return false;
                 }
                 return true;
-            }
-
+            };
             // 机上人工费:多一层
-            if (isSubset(base.gljTypes, [gljType.MACHINE_LABOUR])) {
-                if (!me.treeNode.data.gljList) tmpSum = 0
-                else{
-                    for (let glj of me.treeNode.data.gljList) {
-                        if (glj.type == gljType.GENERAL_MACHINE) {
-                            // 获取机械组成物
-                            let mds = projectObj.project.composition.getCompositionByCode(glj.code);
-                            if (!mds) mds = [];
-                            for (let md of mds){
-                                if (base.gljTypes.indexOf(md.glj_type) >= 0) {
-                                    price = md["base_price"];
-                                    if (!price) price = 0;
-                                    mdSum = mdSum + (md["consumption"] * price).toDecimal(me.digit);
-                                    mdSum = (mdSum).toDecimal(me.digitDefault);
-                                }
-                            };
-                            tmpSum = tmpSum + (glj["quantity"] * mdSum).toDecimal(me.digitDefault);
-                            tmpSum = (tmpSum).toDecimal(me.digitDefault);
-                        }
+            function machineLabourFee() {
+                if (!me.treeNode.data.gljList) return 0;
+                let result = 0, mdSum = 0;
+                for (let glj of me.treeNode.data.gljList) {
+                    if (glj.type == gljType.GENERAL_MACHINE) {
+                        // 获取机械组成物
+                        let mds = projectObj.project.composition.getCompositionByCode(glj.code);
+                        if (!mds) mds = [];
+                        for (let md of mds){
+                            if (base.gljTypes.indexOf(md.glj_type) >= 0) {
+                                let q = md["consumption"] ? md["consumption"] : 0;
+                                let p = md["base_price"] ? md["base_price"] : 0;
+                                mdSum = mdSum + (q * p).toDecimal(me.digit);
+                                mdSum = (mdSum).toDecimal(me.digitDefault);
+                            }
+                        };
+                        result = result + (glj["quantity"] * mdSum).toDecimal(me.digitDefault);
+                        result = (result).toDecimal(me.digitDefault);
                     };
-                }
-            }else{
-                if (!me.treeNode.data.gljList) tmpSum = 0
-                else{
-                    for (let glj of me.treeNode.data.gljList) {
-                        if (base.gljTypes.indexOf(glj.type) >= 0) {
-                            if (base.calcType == baseCalc){ price = glj["basePrice"];}
-                            else if (base.calcType == adjustCalc){price = glj["adjustPrice"];}
-                            else if (base.calcType == budgetCalc){price = glj["marketPrice"];}
-                            else if (base.calcType == diffCalc){
-                                aprice = glj["adjustPrice"];
-                                if (!aprice) aprice = 0;
-                                mprice = glj["marketPrice"];
-                                if (!mprice) mprice = 0;
-                                price = mprice - aprice;
-                            };
-                            if (!price) price = 0;
-                            tmpSum = tmpSum + (glj["quantity"] * price).toDecimal(me.digitDefault);
-                            tmpSum = (tmpSum).toDecimal(me.digitDefault);
+                };
+                return result;
+            };
+            function commonGLJFee(){
+                if (!me.treeNode.data.gljList) return 0;
+                let result = 0;
+                for (let glj of me.treeNode.data.gljList) {
+                    let price = 0;
+                    if (base.gljTypes.indexOf(glj.type) >= 0) {
+                        if (base.calcType == baseCalc){ price = parseFloat(glj["basePrice"]);}
+                        else if (base.calcType == adjustCalc){price = parseFloat(glj["adjustPrice"]);}
+                        else if (base.calcType == budgetCalc){price = parseFloat(glj["marketPrice"]);}
+                        else if (base.calcType == diffCalc){
+                            let aprice = glj["adjustPrice"] ? glj["adjustPrice"] : 0;
+                            let mprice = glj["marketPrice"] ? glj["marketPrice"] : 0;
+                            price = (parseFloat(mprice) - parseFloat(aprice)).toDecimal(me.digitDefault);
                         };
+                        result = result + (glj["quantity"] * price).toDecimal(me.digitDefault);
+                        result = (result).toDecimal(me.digitDefault);
                     };
                 };
+                return result;
+            };
+            // 量价没有具体的工料机类型,但仍然要用定额的计算程序,所以要给计算基数直接指定。
+            function volumePriceFee() {
+                let result = 0;
+                if (
+                    ( me.treeNode.data.type === '人工' && base.dispName === '定额基价人工费') ||
+                    ( me.treeNode.data.type === '材料' && base.dispName === '定额基价材料费') ||
+                    ( me.treeNode.data.type === '机械' && base.dispName === '定额基价机械费') ||
+                    ( me.treeNode.data.type === '主材' && base.dispName === '主材费') ||
+                    ( me.treeNode.data.type === '设备' && base.dispName === '设备费')
+                ) result = me.treeNode.data.marketUnitFee;
+
+                return result;
             };
 
-            rst = (tmpSum).toDecimal(me.digitDefault);
+            if (me.treeNode.sourceType === projectObj.project.VolumePrice.getSourceType()){
+                rst = volumePriceFee();
+            }
+            else{
+                if (isSubset(base.gljTypes, [gljType.MACHINE_LABOUR]))
+                    rst = machineLabourFee()
+                else
+                    rst = commonGLJFee();
+            }
         };
 
         return rst;
     },
     HJ: function () {
         let me = this;
-        return me.treeNode.calcBaseValue;
+        let rst = me.treeNode.data.marketUnitFee ? me.treeNode.data.marketUnitFee : 0;
+        return rst;
     }
 };
 
@@ -524,7 +539,7 @@ class CalcProgram {
         };
     };
 
-    // 仅内部调用。注意:外部不能直接使用
+    // 仅内部调用。注意:外部不能直接使用,因为这里传入的树节点必须有一定的初始化。
     InnerCalc(treeNode){
         let me = this;
         let project = me.project;
@@ -605,14 +620,18 @@ class CalcProgram {
                     treeNode.data.programID = defaultBillTemplate.ID;
                 };
             }
-            else {
-                if (treeNode.sourceType === project.Ration.getSourceType()) {
-                    treeNode.data.gljList = project.ration_glj.getGljArrByRation(treeNode.data.ID);
-                }
-                else if (treeNode.sourceType === project.Bills.getSourceType()) {
-                    let rations = project.Ration.getBillsSortRation(treeNode.source.getID());
-                    treeNode.data.gljList = project.ration_glj.getGatherGljArrByRations(rations);
+            else if (treeNode.calcType == treeNodeCalcType.ctRationCalcProgram) {
+                let muf = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
+                let q = treeNode.data.quantity ? treeNode.data.quantity : 0;
+                treeNode.data.marketTotalFee = (muf * q).toDecimal(me.digit);
+                treeNode.data.gljList = me.project.ration_glj.getGljArrByRation(treeNode.data.ID);
+                if (treeNode.data.programID == undefined){
+                    treeNode.data.programID = 1;
                 };
+            }
+            else if (treeNode.calcType == treeNodeCalcType.ctBillCalcProgram) {
+                let rations = project.Ration.getBillsSortRation(treeNode.source.getID());
+                treeNode.data.gljList = project.ration_glj.getGatherGljArrByRations(rations);
 
                 if (treeNode.data.programID == undefined){
                     treeNode.data.programID = 1;
@@ -652,35 +671,25 @@ class CalcProgram {
         let me = this;
 
         let isRation = treeNode.sourceType === me.project.Ration.getSourceType();
+        let isVolumePrice = treeNode.sourceType === me.project.VolumePrice.getSourceType();
         let isBill = treeNode.sourceType === me.project.Bills.getSourceType();
-        let isLeafBill = isBill && treeNode.source.children && treeNode.source.children.length === 0;
+        let isLeafBill = isBill && treeNode.source.children && treeNode.source.children.length === 0;   // 是清单且其下没有子清单
         let isBillPriceCalc = me.project.projSetting.billsCalcMode === billsPrice;
 
-        if (isRation)
-            treeNode.calcType = treeNodeCalcType.ctRationCalcProgram
+        if (isRation || isVolumePrice){
+            treeNode.calcType = treeNodeCalcType.ctRationCalcProgram;
+        }
         else if (isLeafBill) {
             if (treeNode.children && treeNode.children.length > 0){
                 me.calcLeafBillChildren(treeNode);
-                if (treeNode.children[0].sourceType == me.project.Ration.getSourceType()){
-                    if (isBillPriceCalc)                   // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算
-                        treeNode.calcType = treeNodeCalcType.ctBillCalcProgram;
-                    else                                  // 前三种计算模式下的叶子清单:汇总定额的计算程序的费用类别
-                        treeNode.calcType = treeNodeCalcType.ctGatherRations;
-                }
-                else if (treeNode.children[0].sourceType == me.project.VolumePrice.getSourceType()){
-                    let value = 20000;
-                    // if (treeNode.data.feesIndex && treeNode.data.feesIndex.common && treeNode.data.feesIndex.common.unitFee != 0)
-                    //     value = treeNode.data.feesIndex.common.unitFee;
-                    treeNode.calcType = treeNodeCalcType.ctCalcBaseValue;
-                    treeNode.calcBaseValue = value;
-                };
+
+                if (isBillPriceCalc)                        // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算
+                    treeNode.calcType = treeNodeCalcType.ctBillCalcProgram;
+                else                                        // 前三种计算模式下的叶子清单:汇总定额的计算程序的费用类别
+                    treeNode.calcType = treeNodeCalcType.ctGatherRations;
             }
             else{                                          // 公式计算
-                let value = 20000;
-                // if (treeNode.data.feesIndex && treeNode.data.feesIndex.common && treeNode.data.feesIndex.common.unitFee != 0)
-                //     value = treeNode.data.feesIndex.common.unitFee;
                 treeNode.calcType = treeNodeCalcType.ctCalcBaseValue;
-                treeNode.calcBaseValue = value;
             };
         }
         else if (isBill)                                 // 父清单:汇总子清单的费用类别
@@ -720,8 +729,11 @@ class CalcProgram {
                 let data = {
                     ID: node.data.ID,
                     projectID: me.project.ID(),
+                    type: node.data.type,
                     quantity: node.data.quantity,
                     programID: node.data.programID,
+                    marketUnitFee: node.data.marketUnitFee,
+                    marketTotalFee: node.data.marketTotalFee,
                     fees: node.data.fees
                 };
                 let newData = {'updateType': 'ut_update', 'updateData': data};

+ 17 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -10,7 +10,11 @@ let MainTreeCol = {
             } else if (node.sourceType === projectObj.project.Ration.getSourceType()) {
                 return '定';
             } else if (node.sourceType === projectObj.project.VolumePrice.getSourceType()) {
-                return '量';
+                if (node.data.type === '人工') return '量人'
+                else if (node.data.type === '材料') return '量材'
+                else if (node.data.type === '机械') return '量机'
+                else if (node.data.type === '主材') return '量主'
+                else if (node.data.type === '设备') return '量设';
             } else if (node.sourceType === projectObj.project.ration_glj.getSourceType()) {
                 return '主';
             }
@@ -23,6 +27,10 @@ let MainTreeCol = {
         }
     },
     readOnly: {
+        type: function (node){
+            return node.sourceType !== projectObj.project.VolumePrice.getSourceType();
+        },
+
         bills: function (node) {
             return node.sourceType === projectObj.project.Bills.getSourceType();
         },
@@ -81,6 +89,14 @@ let MainTreeCol = {
             var names = new GC.Spread.Sheets.CellTypes.ComboBox();
             names.items(projectObj.project.calcProgram.compiledTemplateNames);
             return names;
+        },
+
+        type: function (node) {
+            if (node.sourceType === projectObj.project.VolumePrice.getSourceType()) {
+                let VPType = new GC.Spread.Sheets.CellTypes.ComboBox();
+                VPType.items(["人工","材料","机械","主材","设备"]);
+                return VPType;
+            };
         }
      },
     getEvent: function (eventName) {

+ 16 - 24
web/building_saas/main/js/views/project_view.js

@@ -19,11 +19,7 @@ var projectObj = {
 
         // CSL.2017.07.25
         if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
-            if (node.sourceType === project.Bills.getSourceType() || node.sourceType === project.Ration.getSourceType()) {
-                calcProgramObj.showData(node);
-            } else {
-                calcProgramObj.clearData();
-            };
+            calcProgramObj.showData(node);
         };
         //zhong 2017-9-1 特征及内容
         if(pageCCOprObj.active){
@@ -267,27 +263,23 @@ var projectObj = {
         if (value !== calcFees.getFee(node.data, fieldName)) {
             if (fieldName === 'code') {
                 projectObj.updateCode(node, value);
-            } else if (fieldName === 'quantity' && project.quantity_detail.quantityEditChecking(value,node,fieldName)) {
-                if (value) {value = value.toDecimal(projectObj.project.Decimal.common.quantity);};
-                node.data.quantity = value;
-                node.changed = true;
-                project.calcProgram.calculate(node);
-                project.calcProgram.saveNode(node);
-                // projectObj.updateAndReCalculate(node, fieldName, value);
-            } else if (fieldName === 'feesIndex.common.unitFee') {
-                if (value) {value = value.toDecimal(projectObj.project.Decimal.common.unitFee);};
-                node.data.feesIndex.common.unitFee = value;
-                project.calcProgram.calculate(node);
-                project.calcProgram.saveNode(node);
-                // projectObj.updateAndReCalculate(node, fieldName, value);
-            } else if (fieldName === 'programID') {
-                node.data.programID = value;
+            }
+            else if(fieldName ==='feeRate'){
+                project.FeeRate.updateFeeRateFromBills(value,node,fieldName);
+            }
+            else if (fieldName === 'quantity' || fieldName === 'marketUnitFee' || fieldName === 'programID' || fieldName === 'type'){
+                if (fieldName === 'quantity' && project.quantity_detail.quantityEditChecking(value,node,fieldName)) {
+                    if (value) {value = value.toDecimal(projectObj.project.Decimal.common.quantity)};
+                } else if (fieldName === 'marketUnitFee') {
+                    if (value) {value = parseFloat(value).toDecimal(projectObj.project.Decimal.common.unitFee)};
+                };
+
                 node.changed = true;
+                node.data[fieldName] = value;
                 project.calcProgram.calculate(node);
                 project.calcProgram.saveNode(node);
-            } else if(fieldName ==='feeRate'){
-                project.FeeRate.updateFeeRateFromBills(value,node,fieldName);
-            }else {
+            }
+            else {
                 if (node.sourceType === project.Bills.getSourceType()) {
                     project.Bills.updateField(node.source, fieldName, value, true);
                 } else if (node.sourceType === project.Ration.getSourceType()) {
@@ -369,7 +361,7 @@ var projectObj = {
                     }
                     if (col.data.cellType && Object.prototype.toString.apply(col.data.cellType) === "[object String]") {
                         let getCellType = MainTreeCol.getEvent(col.data.cellType);
-                        col.data.cellType = getCellType();
+                        col.data.cellType = getCellType;
                     }
                     if (col.data.digit && Object.prototype.toString.apply(col.data.digit) === "[object String]") {
                         col.data.decimal = that.project.getDecimal(col.data.digit);

+ 1 - 5
web/building_saas/main/js/views/sub_view.js

@@ -92,11 +92,7 @@ $("#linkJSCX").click(function(){        // 计算程序
     if (!projectObj.mainController.tree.selected)
         projectObj.mainController.tree.selected = projectObj.mainController.tree.firstNode();
     let sel = projectObj.mainController.tree.selected;
-    if (sel.sourceType === projectObj.project.Bills.getSourceType() || sel.sourceType === projectObj.project.Ration.getSourceType()) {
-        calcProgramObj.showData(sel);
-    } else {
-        calcProgramObj.clearData();
-    };
+    calcProgramObj.showData(sel);
     gljOprObj.activeTab='#linkJSCX';
 });
 

+ 1 - 1
web/building_saas/report/html/rpt_main.html

@@ -16,7 +16,7 @@
                 <div class="print-toolsbar">
                     <div class="panel">
                         <div class="panel-body">
-                            <button class="btn btn-secondary btn-sm" type="button">
+                            <button class="btn btn-secondary btn-sm" type="button" onclick="rptHeaderObj.getExcel();">
                                 <i class="fa fa-print"></i><br>
                                 打印 <span id="checkCount" class="badge badge-primary">5</span>
                             </button>

+ 32 - 12
web/building_saas/report/js/rpt_main.js

@@ -72,7 +72,9 @@ let zTreeOprObj = {
             params.pageSize = pageSize;
             params.rpt_tpl_id = treeNode.refId;
             params.prj_id = projectInfoObj.projectInfo.ID;
-            CommonAjax.postEx("report_api/getReport", params, 5000, true, function(result){
+            me.currentNode = treeNode;
+            CommonAjax.postEx("report_api/getReport", params, 5000, true,
+                function(result){
                     let pageRst = result;
                     if (pageRst) {
                         me.currentRptPageRst = pageRst;
@@ -85,16 +87,16 @@ let zTreeOprObj = {
                         } else {
                             canvas.height = size[1] + 50;
                         }
-                        me.showPage(0, canvas);
+                        me.showPage(1, canvas);
                     }
                 }, null, null
             );
         }
     },
-    showPage: function (pageStep, canvas) {
+    showPage: function (pageNum, canvas) {
         let me = zTreeOprObj;
-        if (me.currentPage + pageStep >= 1 && me.currentPage + pageStep <= me.maxPages) {
-            me.currentPage = me.currentPage + pageStep;
+        if (pageNum >= 1 && pageNum <= me.maxPages) {
+            me.currentPage = pageNum;
             JpcCanvasOutput.cleanCanvas(canvas);
             JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
             JpcCanvasOutput.drawToCanvas(me.currentRptPageRst, canvas, me.currentPage);
@@ -104,12 +106,14 @@ let zTreeOprObj = {
 
 let canvasOprObj = {
     canvasOnMouseMove: function (event) {
-        let x = event.offsetX - JpcCanvasOutput.offsetX,
-            canvas = event.originalTarget
-        ;
-        if (x < 200) {
+        let x = event.offsetX - JpcCanvasOutput.offsetX, canvas = event.originalTarget;
+        if (x < 80) {
+            canvas.style.cursor = "url(/web/building_saas/img/FirstPageSimple.cur), auto";
+        } else if (x < 200) {
             // canvas.style.cursor = "e-resize";
             canvas.style.cursor = "url(/web/building_saas/img/PreviousPageSimple.cur), auto";
+        } else if ((canvas.width - x) < 80) {
+            canvas.style.cursor = "url(/web/building_saas/img/LastPageSimple.cur), auto";
         } else if ((canvas.width - x) < 200) {
             // canvas.style.cursor = "w-resize";
             canvas.style.cursor = "url(/web/building_saas/img/NextPageSimple.cur), auto";
@@ -121,10 +125,14 @@ let canvasOprObj = {
         let x = event.offsetX - JpcCanvasOutput.offsetX,
             //y = event.offsetY - JpcCanvasOutput.offsetY,
             canvas = event.originalTarget;
-        if (x < 300) {
-            zTreeOprObj.showPage(-1, canvas);
-        } else if ((canvas.width - x) < 300) {
+        if (x < 80) {
             zTreeOprObj.showPage(1, canvas);
+        } else if (x < 200) {
+            zTreeOprObj.showPage(zTreeOprObj.currentPage - 1, canvas);
+        } else if ((canvas.width - x) < 80) {
+            zTreeOprObj.showPage(zTreeOprObj.maxPages, canvas);
+        } else if ((canvas.width - x) < 200) {
+            zTreeOprObj.showPage(zTreeOprObj.currentPage + 1, canvas);
         }
     }
 };
@@ -140,7 +148,19 @@ let rptHeaderObj = {
         //
         return rst;
     },
+    getCurrentReportOption: function() {
+        //
+    },
     getExcel: function() {
+        let me = rptHeaderObj;
         //目前只支持当前打开报表
+        //zTreeOprObj.currentRptPageRst
+        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId) {
+            let orgRptName = zTreeOprObj.currentNode.name;
+            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_');
+            let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
+                me.getCurrentPageSize() + "/" + orgRptName + "/" + false + "/" + 'normal';
+            window.location = url;//这里不能使用get方法跳转,否则下载不成功
+        }
     }
 };