Browse Source

Merge branch 'master' into olym

caiaolin 8 years ago
parent
commit
09b3ce6bb9

+ 5 - 2
modules/reports/controllers/rpt_controller.js

@@ -62,15 +62,18 @@ module.exports = {
         let rpt_id = req.body.ID;
         let pageSize = req.body.pageSize;
         getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
+            //fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
             callback(req, res, null, pageRst);
         })
     },
     getExcel: function(req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,
-            rptName = req.params.rptName;
+            rptName = req.params.rptName,
+            isOneSheet = req.params.isOneSheet;
+        ;
         getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
-            rpt_xl_util.exportExcel(pageRst, rptName, null, function(newName){
+            rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, 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');

+ 37 - 0
modules/reports/models/rpt_tpl_data.js

@@ -0,0 +1,37 @@
+/**
+ * Created by Tony on 2017/7/24.
+ */
+
+let mongoose = require('mongoose');
+let dbm = require("../../../config/db/db_manager");
+let smartcostdb = dbm.getCfgConnection("scConstruct");
+let Schema = mongoose.Schema;
+
+let rptTplPrjSchema = new Schema({
+    "ID": Number,
+    "ParentID": Number,
+    "NextSiblingID": Number,
+    "name": String,         //项目名称
+    "location": String,     //工程地点
+    "constructor": String,  //建设单位
+    "supervisor": String,   //监理
+    "auditor": String       //审核
+});
+
+let rptTplBillsSchema = new Schema({
+
+});
+
+let rptTplRationSchema = new Schema({
+
+});
+
+let tplPrjData = smartcostdb.model("temp_tpl_data", rptTplPrjSchema, "projects");
+let tplBillsData = smartcostdb.model("temp_tpl_data", rptTplBillsSchema, "bills");
+let tplRationData = smartcostdb.model("temp_tpl_data", rptTplRationSchema, "ration");
+
+module.exports = {
+    prjMdl: tplPrjData,
+    billsMdl: tplBillsData,
+    rationMdl: tplRationData
+};

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

@@ -9,10 +9,9 @@ module.exports = function (app) {
     let reportController = require('./../controllers/rpt_controller');
 
     rptRouter.post('/getReport', reportController.getReportAllPages);
-    rptRouter.get('/getExcel/:id/:size/:rptName', reportController.getExcel);
+    rptRouter.get('/getExcel/:id/:size/:rptName/:isOneSheet', reportController.getExcel);
 
     app.use("/report_api", rptRouter);
 };
 
 
-

+ 8 - 3
modules/reports/util/rpt_data_util.js

@@ -11,7 +11,7 @@ class Rpt_Common{
 class Rpt_Data_Extractor {
     initialize(Projects) {
         this.Projects = Projects;
-        //Projects对象从前端传送过来,无需在后端重复查询及构建
+        //Projects对象应该从前端传送过来,无需在后端重复查询及构建
         /* 结构:
          {
             currentPrjId: int,
@@ -35,9 +35,14 @@ class Rpt_Data_Extractor {
          */
     };
 
-    prepare($CURRENT_RPT) {
+    prepareData($CURRENT_RPT) {
         //在报表提取数据前的准备工作,主要有:
-        //1. 确认指标数据的类型,
+        //1. 确认指标数据的类型(离散/主/从)
+        //2. 根据类型提取数据,排序
+        // 2.1. header类型
+        // 2.2. 章类型
+        // 2.3. detail类型
+        // 2.4. 排序
     };
 
 }

+ 242 - 137
modules/reports/util/rpt_excel_util.js

@@ -9,7 +9,7 @@ let jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
 let DPI = jpcCmnHelper.getScreenDPI()[0];
 const dftHeadXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
 
-function writeContentTypes(sheets) {
+function writeContentTypes(sheets, isSinglePage) {
     let rst = [];
     rst.push(dftHeadXml + '\r\n');
     rst.push('<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">');
@@ -21,8 +21,12 @@ function writeContentTypes(sheets) {
     rst.push('<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>');
     rst.push('<Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>');
     rst.push('<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>');
-    for (let i = 0; i < sheets.length; i++) {
-        rst.push('<Override PartName="/xl/worksheets/sheet' + (i + 1) + '.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>')
+    if (isSinglePage) {
+        rst.push('<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>')
+    } else {
+        for (let i = 0; i < sheets.length; i++) {
+            rst.push('<Override PartName="/xl/worksheets/sheet' + (i + 1) + '.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>')
+        }
     }
     rst.push('<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>');
     rst.push('</Types>');
@@ -38,7 +42,7 @@ function writeRootRels(){
     rst.push('</Relationships>');
     return rst;
 }
-function writeApp(sheets) {
+function writeApp(sheets, isSinglePage) {
     let rst = [];
     rst.push(dftHeadXml + '\r\n');
     rst.push('<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">');
@@ -48,13 +52,19 @@ function writeApp(sheets) {
     rst.push('<HeadingPairs>');
     rst.push('<vt:vector size="2" baseType="variant">');
     rst.push('<vt:variant><vt:lpstr>工作表</vt:lpstr></vt:variant>');
-    rst.push('<vt:variant><vt:i4>' + sheets.length + '</vt:i4></vt:variant>');
+    if (isSinglePage) rst.push('<vt:variant><vt:i4>1</vt:i4></vt:variant>')
+    else rst.push('<vt:variant><vt:i4>' + sheets.length + '</vt:i4></vt:variant>');
     rst.push('</vt:vector>');
     rst.push('</HeadingPairs>');
     rst.push('<TitlesOfParts>');
-    rst.push('<vt:vector size="' + sheets.length + '" baseType="lpstr">');
-    for (let i = 0; i < sheets.length; i++) {
-        rst.push('<vt:lpstr>' + sheets[i].sheetName + '</vt:lpstr>')
+    if (isSinglePage) {
+        rst.push('<vt:vector size="1" baseType="lpstr">');
+        rst.push('<vt:lpstr>' + sheets[0].sheetName + '</vt:lpstr>')
+    } else {
+        rst.push('<vt:vector size="' + sheets.length + '" baseType="lpstr">');
+        for (let i = 0; i < sheets.length; i++) {
+            rst.push('<vt:lpstr>' + sheets[i].sheetName + '</vt:lpstr>')
+        }
     }
     rst.push('</vt:vector>');
     rst.push('</TitlesOfParts>');
@@ -88,7 +98,7 @@ function writeCore() {
     rst.push('</cp:coreProperties>');
     return rst;
 }
-function writeXlWorkBook(sheets){
+function writeXlWorkBook(sheets, isSinglePage){
     let rst = [];
     rst.push(dftHeadXml + '\r\n');
     rst.push('<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">');
@@ -96,8 +106,12 @@ function writeXlWorkBook(sheets){
     rst.push('<workbookPr defaultThemeVersion="124226"/>');
     rst.push('<bookViews><workbookView xWindow="360" yWindow="345" windowWidth="14655" windowHeight="4305"/></bookViews>');
     rst.push('<sheets>');
-    for (let i = 0; i < sheets.length; i++) {
-        rst.push('<sheet name="' + sheets[i].sheetName + '" sheetId="' + (i + 1) + '" r:id="rId' + (i + 1) + '"/>')
+    if (isSinglePage) {
+        rst.push('<sheet name="' + sheets[0].sheetName + '" sheetId="1" r:id="rId1"/>');
+    } else {
+        for (let i = 0; i < sheets.length; i++) {
+            rst.push('<sheet name="' + sheets[i].sheetName + '" sheetId="' + (i + 1) + '" r:id="rId' + (i + 1) + '"/>');
+        }
     }
     rst.push('</sheets>');
     rst.push('<calcPr calcId="124519"/>');
@@ -105,13 +119,18 @@ function writeXlWorkBook(sheets){
     rst.push('</workbook>');
     return rst;
 }
-function writeXlRels(sheets){
+function writeXlRels(sheets, isSinglePage){
     let rst = [], idx = 1;
     rst.push(dftHeadXml + '\r\n');
     rst.push('<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">');
-    for (let i = 0; i < sheets.length; i++) {
-        rst.push('<Relationship Id="rId' + idx + '" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet' + (i + 1) + '.xml"/>')
+    if (isSinglePage) {
+        rst.push('<Relationship Id="rId' + idx + '" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>')
         idx++;
+    } else {
+        for (let i = 0; i < sheets.length; i++) {
+            rst.push('<Relationship Id="rId' + idx + '" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet' + (i + 1) + '.xml"/>')
+            idx++;
+        }
     }
     rst.push('<Relationship Id="rId' + idx + '" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>');
     idx++;
@@ -213,7 +232,7 @@ function writeSharedString(sharedStrList){
     }
     return rst;
 }
-function writeSheets(pageData, sharedStrList, stylesObj){
+function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage){
     let rst = [];
     private_pushDftFont = function(){
         let font = {};
@@ -221,52 +240,73 @@ function writeSheets(pageData, sharedStrList, stylesObj){
             stylesObj.fonts = [];
         }
         font[JV.FONT_PROPS[0]] = "宋体"; //font name
-        font.size = 11;
+        font.size = 12;
         font.charset = 134;
         font.colorIdx = "8";
         stylesObj.fonts.push(font);
     };
     private_pushDftFont();
-    for (let i = 0; i < pageData.items.length; i++) {
-        rst.push(writeSheet(pageData, pageData.items[i], sharedStrList, stylesObj));
+    if (isSinglePage) {
+        rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj));
+    } else {
+        for (let i = 0; i < pageData.items.length; i++) {
+            rst.push(writeSheet(pageData, pageData.items[i], paperSize, sharedStrList, stylesObj));
+        }
     }
     return rst;
 }
-function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
-    let rst = [], xPos = [], yPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
+    let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let cacheBorderCell = {};
-    xPos.push(0);
-    yPos.push(0);
     private_pre_analyze_pos = function(){
         let cell, pos;
-        sheetData.cells.sort(function(cell1, cell2) {
-            let rst = 0;
-            if (cell1[JV.PROP_AREA][JV.PROP_TOP] > cell2[JV.PROP_AREA][JV.PROP_TOP]) {
-                rst = 1;
-            } else if (cell1[JV.PROP_AREA][JV.PROP_TOP] < cell2[JV.PROP_AREA][JV.PROP_TOP]) {
-                rst = -1;
-            } else {
-                if (cell1[JV.PROP_AREA][JV.PROP_LEFT] > cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+        self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
+            theShtData.cells.sort(function(cell1, cell2) {
+                let rst = 0;
+                if (cell1[JV.PROP_AREA][JV.PROP_TOP] > cell2[JV.PROP_AREA][JV.PROP_TOP]) {
                     rst = 1;
-                } else if (cell1[JV.PROP_AREA][JV.PROP_LEFT] < cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+                } else if (cell1[JV.PROP_AREA][JV.PROP_TOP] < cell2[JV.PROP_AREA][JV.PROP_TOP]) {
                     rst = -1;
+                } else {
+                    if (cell1[JV.PROP_AREA][JV.PROP_LEFT] > cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+                        rst = 1;
+                    } else if (cell1[JV.PROP_AREA][JV.PROP_LEFT] < cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+                        rst = -1;
+                    }
                 }
+                return rst;
+            });
+            for (let i = 0; i < theShtData.cells.length; i++) {
+                cell = theShtData.cells[i];
+                pos = cell[JV.PROP_AREA][JV.PROP_LEFT];
+                if (theXPos.indexOf(pos) < 0) theXPos.push(pos);
+                pos = cell[JV.PROP_AREA][JV.PROP_RIGHT];
+                if (theXPos.indexOf(pos) < 0) theXPos.push(pos);
+                pos = cell[JV.PROP_AREA][JV.PROP_TOP];
+                if (theYPos.indexOf(pos) < 0) theYPos.push(pos);
+                pos = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
+                if (theYPos.indexOf(pos) < 0) theYPos.push(pos);
+            }
+        };
+        xPos.push(0);
+        if (sheetData) {
+            //current sheet data
+            yPos.push(0);
+            self_analyze_sheet_pos(sheetData, xPos, yPos);
+            xPos.sort(private_array_sort);
+            yPos.sort(private_array_sort);
+        } else {
+            //total data in one sheet
+            for (let shtItemData of pageData.items) {
+                let tmpPos = [];
+                tmpPos.push(0);
+                self_analyze_sheet_pos(shtItemData, xPos, tmpPos);
+                tmpPos.sort(private_array_sort);
+                yMultiPos.push(tmpPos);
             }
-            return rst;
-        });
-        for (let i = 0; i < sheetData.cells.length; i++) {
-            cell = sheetData.cells[i];
-            pos = cell[JV.PROP_AREA][JV.PROP_LEFT];
-            if (xPos.indexOf(pos) < 0) xPos.push(pos);
-            pos = cell[JV.PROP_AREA][JV.PROP_RIGHT];
-            if (xPos.indexOf(pos) < 0) xPos.push(pos);
-            pos = cell[JV.PROP_AREA][JV.PROP_TOP];
-            if (yPos.indexOf(pos) < 0) yPos.push(pos);
-            pos = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
-            if (yPos.indexOf(pos) < 0) yPos.push(pos);
-        }
-        xPos.sort(private_array_sort);
-        yPos.sort(private_array_sort);
+            xPos.sort(private_array_sort);
+            yPos = yMultiPos[0];
+        }
     };
     private_array_sort = function(i1, i2){
         let rst = 0;
@@ -466,15 +506,28 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
         let cell, idxR, idxL, idxT, idxB, cnt = 0;
         rst.push('<mergeCells count="?">');
         let startIdx = rst.length - 1;
-        for (let i = 0; i < sheetData.cells.length; i++) {
-            cell = sheetData.cells[i];
-            idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
-            idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
-            idxB = yPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
-            idxT = yPos.indexOf(cell[JV.PROP_AREA][JV.PROP_TOP]);
-            if (idxR - idxL > 1 || idxB - idxT > 1) {
-                rst.push('<mergeCell ref="' + private_getCellIdxStr(idxL - 1) + idxT + ':' + private_getCellIdxStr(idxR - 2) + (idxB - 1) + '"/>');
-                cnt++;
+        self_setMergedCells = function (theData, theYPos, offsetY) {
+            for (let i = 0; i < theData.cells.length; i++) {
+                cell = theData.cells[i];
+                idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
+                idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
+                idxB = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
+                idxT = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_TOP]);
+                if (idxR - idxL > 1 || idxB - idxT > 1) {
+                    rst.push('<mergeCell ref="' + private_getCellIdxStr(idxL - 1) + (idxT + offsetY) + ':' + private_getCellIdxStr(idxR - 2) + (idxB - 1 + offsetY) + '"/>');
+                    cnt++;
+                }
+            }
+        }
+        if (sheetData) {
+            self_setMergedCells(sheetData, yPos, 0);
+        } else {
+            let osY = 0;
+            for (let i = 0; i < pageData.items.length; i++) {
+                let shtItemData = pageData.items[i];
+                let tmpPos = yMultiPos[i];
+                self_setMergedCells(shtItemData, tmpPos, osY);
+                osY += tmpPos.length;
             }
         }
         rst[startIdx] = '<mergeCells count="' + cnt + '">';
@@ -482,10 +535,10 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
     };
     private_chkIfNeedCacheCell = function(cell){
         let rst = false;
-        if (cell[JV.PROP_AREA][JV.PROP_LEFT] == pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] ||
-            cell[JV.PROP_AREA][JV.PROP_RIGHT] == pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] ||
-            cell[JV.PROP_AREA][JV.PROP_TOP] == pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] ||
-            cell[JV.PROP_AREA][JV.PROP_BOTTOM] == pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM]){
+        if (cell[JV.PROP_AREA][JV.PROP_LEFT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] ||
+            cell[JV.PROP_AREA][JV.PROP_RIGHT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] ||
+            cell[JV.PROP_AREA][JV.PROP_TOP] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] ||
+            cell[JV.PROP_AREA][JV.PROP_BOTTOM] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM]){
             if (cell[JV.PROP_AREA][JV.PROP_LEFT] >= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] &&
                 cell[JV.PROP_AREA][JV.PROP_RIGHT] <= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] &&
                 cell[JV.PROP_AREA][JV.PROP_TOP] >= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] &&
@@ -497,22 +550,35 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
     };
     private_cacheMergeBandBorderIdxs = function() {
         let cell, idxR, idxL, idxT, idxB;
-        for (let i = 0; i < sheetData.cells.length; i++) {
-            cell = sheetData.cells[i];
-            idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
-            idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
-            idxB = yPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
-            idxT = yPos.indexOf(cell[JV.PROP_AREA][JV.PROP_TOP]);
-            if (idxR - idxL > 1 || idxB - idxT > 1) {
-                if (private_chkIfNeedCacheCell(cell)) {
-                    for (let xi = idxL; xi < idxR; xi++) {
-                        for (let yj = idxT; yj < idxB; yj++) {
-                            cacheBorderCell[private_getCellIdxStr(xi - 1) + yj] = cell;
+        self_cachMergeIdxs = function (theData, theYPos, offsetY) {
+            for (let i = 0; i < theData.cells.length; i++) {
+                cell = theData.cells[i];
+                idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
+                idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
+                idxB = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
+                idxT = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_TOP]);
+                if (idxR - idxL > 1 || idxB - idxT > 1) {
+                    if (private_chkIfNeedCacheCell(cell)) {
+                        for (let xi = idxL; xi < idxR; xi++) {
+                            for (let yj = idxT; yj < idxB; yj++) {
+                                cacheBorderCell[private_getCellIdxStr(xi - 1) + yj + offsetY] = cell;
+                            }
                         }
                     }
                 }
             }
         }
+        if (sheetData) {
+            self_cachMergeIdxs(sheetData, yPos, 0);
+        } else {
+            let osY = 0;
+            for (let i = 0; i < pageData.items.length; i++) {
+                let shtItemData = pageData.items[i];
+                let tmpPos = yMultiPos[i];
+                self_cachMergeIdxs(shtItemData, tmpPos, osY);
+                osY += tmpPos.length;
+            }
+        }
     };
     private_getMergedCellStyleId = function(preStyleId, colIdxStr) {
         let rst = preStyleId;
@@ -526,80 +592,98 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
         rst.push('<sheetData>');
         let spanX = xPos.length - 2, cellIdx = 0, h = 0,
             hasMoreCols = true, nextColIdx = -1,
-            nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP])
+            nextRowIdx = 0
             ;
-        private_cacheMergeBandBorderIdxs();
-        for (let i = 1; i < yPos.length - 1; i++) {
-            h = 1.0 * (yPos[i+1] - yPos[i]) / DPI * 25.4 / 0.3612;
-            h = Math.round(h * 1000) / 1000;
-            rst.push('<row r="' + i + '" spans="1:' + spanX + '" ht="' + h + '" customHeight="1">');
-            //then put the cells of this row
-            let colIdxStr = '';
-            hasMoreCols = true;
-            while (nextRowIdx < i) {
-                if (cellIdx >= sheetData.cells.length || nextRowIdx > i) {
-                    break;
-                } else {
-                    cellIdx++;
-                    nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                }
-            }
-            if (nextRowIdx > i) {
-                hasMoreCols = false;
-            }
-            nextColIdx = xPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
-            let preStyleIdx = 1;
-            for (let j = 1; j < xPos.length - 1; j++) {
-                colIdxStr = private_getCellIdxStr(j - 1);
-                if (hasMoreCols) {
-                    if (nextColIdx == j) {
-                        let styleIdx = private_getStyleId(sheetData.cells[cellIdx]);
-                        preStyleIdx = styleIdx;
-                        if (strUtil.isEmptyString(sheetData.cells[cellIdx][JV.PROP_VALUE])) {
-                            rst.push('<c r="' + colIdxStr + i + '" s="' + styleIdx + '"/>');
-                            //should setup the right style instead!
-                        } else {
-                            let valIdx = private_getSharedStrIdx(sheetData.cells[cellIdx][JV.PROP_VALUE]);
-                            rst.push('<c r="' + colIdxStr + i + '" s="' + styleIdx + '" t="s">');
-                            rst.push('<v>' + valIdx + '</v>');
-                            rst.push('</c>');
-                        }
+        self_setData = function (theShtData, theYPos, offsetY) {
+            for (let i = 1; i < theYPos.length - 1; i++) {
+                h = (theYPos[i+1] - theYPos[i]) / DPI * 25.4 / 0.3612;
+                h = Math.round(h * 1000) / 1000;
+                rst.push('<row r="' + (i + offsetY) + '" spans="1:' + spanX + '" ht="' + h + '" customHeight="1">');
+                let colIdxStr = '';
+                hasMoreCols = true;
+                while (nextRowIdx < i) {
+                    if (cellIdx >= theShtData.cells.length || nextRowIdx > i) {
+                        break;
+                    } else {
                         cellIdx++;
-                        if (cellIdx < sheetData.cells.length) {
-                            nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                            if (nextRowIdx > i) {
-                                hasMoreCols = false;
+                        nextRowIdx = theYPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                    }
+                }
+                if (nextRowIdx > i) {
+                    hasMoreCols = false;
+                }
+                nextColIdx = xPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
+                let preStyleIdx = 1;
+                for (let j = 1; j < xPos.length - 1; j++) {
+                    colIdxStr = private_getCellIdxStr(j - 1);
+                    if (hasMoreCols) {
+                        if (nextColIdx == j) {
+                            let styleIdx = private_getStyleId(theShtData.cells[cellIdx]);
+                            preStyleIdx = styleIdx;
+                            if (strUtil.isEmptyString(theShtData.cells[cellIdx][JV.PROP_VALUE])) {
+                                rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + styleIdx + '"/>');
+                                //should setup the right style instead!
                             } else {
-                                nextColIdx = xPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
+                                let valIdx = private_getSharedStrIdx(theShtData.cells[cellIdx][JV.PROP_VALUE]);
+                                rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + styleIdx + '" t="s">');
+                                rst.push('<v>' + valIdx + '</v>');
+                                rst.push('</c>');
                             }
-                        } else {
+                            cellIdx++;
+                            if (cellIdx < theShtData.cells.length) {
+                                nextRowIdx = theYPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                                if (nextRowIdx > i) {
+                                    hasMoreCols = false;
+                                } else {
+                                    nextColIdx = xPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
+                                }
+                            } else {
+                                hasMoreCols = false;
+                            }
+                        } else if (nextColIdx < 0) {
+                            //impossible!
+                            console.log('has abnormal case!');
                             hasMoreCols = false;
+                        } else {
+                            //rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + preStyleIdx + '"/>');
+                            rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i + offsetY) + '"/>');
                         }
-                    } else if (nextColIdx < 0) {
-                        //impossible!
-                        console.log('has abnormal case!');
-                        hasMoreCols = false;
                     } else {
-                        //rst.push('<c r="' + colIdxStr + i + '" s="' + preStyleIdx + '"/>');
-                        rst.push('<c r="' + colIdxStr + i + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i) + '"/>');
+                        //rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + preStyleIdx + '"/>');
+                        rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i + offsetY) + '"/>');
                     }
-                } else {
-                    //rst.push('<c r="' + colIdxStr + i + '" s="' + preStyleIdx + '"/>');
-                    rst.push('<c r="' + colIdxStr + i + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i) + '"/>');
                 }
+                rst.push('</row>');
+            }
+        }
+        private_cacheMergeBandBorderIdxs();
+        if (sheetData) {
+            //current sheet data
+            nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+            self_setData(sheetData, yPos, 0);
+        } else {
+            //total data in one sheet
+            let cnt = 0;
+            for (let i = 0; i < pageData.items.length; i++) {
+                let shtItemData = pageData.items[i];
+                let tmpPos = yMultiPos[i];
+                cellIdx = 0;
+                nextRowIdx = tmpPos.indexOf(shtItemData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                self_setData(shtItemData, tmpPos, cnt);
+                cnt += tmpPos.length;
             }
-            rst.push('</row>');
         }
-        //sheetData.cells.length
         rst.push('</sheetData>');
     };
+
     private_pre_analyze_pos();
     rst.push(dftHeadXml + '\r\n');
     rst.push('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">');
     let colStr = private_getCellIdxStr(xPos.length - 3);
     rst.push('<dimension ref="A1:' + colStr + '' + yPos.length + '"/>');
     rst.push('<sheetViews><sheetView tabSelected="1" workbookViewId="0">');
-    rst.push('<selection sqref="A1:' + colStr + '1"/>');
+    //rst.push('<selection sqref="A1:' + colStr + '1"/>');
+    rst.push('<selection sqref="A1:A1"/>');
     rst.push('</sheetView></sheetViews>');
     rst.push('<sheetFormatPr defaultRowHeight="13.5"/>');
     private_setCols();
@@ -607,23 +691,37 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
     private_setMergedCells();
     rst.push('<phoneticPr fontId="1" type="noConversion"/>');
     rst.push('<pageMargins left="0.315" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
-    //rst.push('<pageSetup paperSize="9" fitToWidth="0" fitToHeight="0" orientation="landscape" horizontalDpi="300" verticalDpi="300"/>');
+    let paperSizeIdx = JV.PAGES_SIZE_STR.indexOf(paperSize);
+    let pStr = '';
+    if (paperSizeIdx >= 0) {
+        pStr = 'paperSize="' + JV.PAGES_SIZE_IDX[paperSizeIdx] + '"';
+    }
+    let orientationStr = (pageData[JV.NODE_PAGE_INFO][0] > pageData[JV.NODE_PAGE_INFO][1])?'landscape':'portrait';
+    rst.push('<pageSetup ' + pStr + ' fitToWidth="0" fitToHeight="0" orientation="' + orientationStr + '" />');
     rst.push('<headerFooter alignWithMargins="0"/>');
     rst.push('</worksheet>');
-    //rst.push('');
     return rst;
 }
 
 module.exports = {
-    exportExcel: function (pageData, fName, options, callback) {
-        let rptOptions = (options || {singlePage: false, fileName: 'report'});
+    exportExcel: function (pageData, paperSize, fName, options, callback) {
+        let rptOptions = ({singlePage: false, fileName: 'report'});
+        if (options === 'true') {
+            rptOptions.singlePage = true;
+        }
+        let isSinglePage = rptOptions.singlePage;
         let sheets = [];
+        if (isSinglePage) {
+            //
+        } else {
+            //
+        }
         for (let i = 0; i < pageData.items.length; i++) {
             sheets.push({sheetName: '第' + (i + 1) + '页'});
         }
         //1.
         let file = '[Content_Types].xml';
-        let data = writeContentTypes(sheets);
+        let data = writeContentTypes(sheets, isSinglePage);
         let zip = new JSZip();
         zip.file(file, data.join(''), {compression: 'DEFLATE'});
         //2.
@@ -634,7 +732,7 @@ module.exports = {
         //3.
         let zip_docProps = zip.folder('docProps');
         file = 'app.xml';
-        data = writeApp(sheets);
+        data = writeApp(sheets, isSinglePage);
         zip_docProps.file(file, data.join(''), {compression: 'DEFLATE'});
         file = 'core.xml';
         data = writeCore();
@@ -642,11 +740,11 @@ module.exports = {
         //4.
         let zip_xl = zip.folder('xl');
         file = 'workbook.xml';
-        data = writeXlWorkBook(sheets);
+        data = writeXlWorkBook(sheets, isSinglePage);
         zip_xl.file(file, data.join(''), {compression: 'DEFLATE'});
         let zip_rels2 = zip_xl.folder('_rels');
         file = 'workbook.xml.rels';
-        data = writeXlRels(sheets);
+        data = writeXlRels(sheets, isSinglePage);
         zip_rels2.file(file, data.join(''), {compression: 'DEFLATE'});
         //5.
         let zip_theme = zip_xl.folder('theme');
@@ -656,10 +754,17 @@ module.exports = {
         //6.
         let zip_worksheets = zip_xl.folder('worksheets');
         let sharedStrList = [], stylesObj = {};
-        data = writeSheets(pageData, sharedStrList, stylesObj);
-        for (let i = 0; i < data.length; i++) {
-            file = 'sheet' + (i + 1) + '.xml';
-            zip_worksheets.file(file, data[i].join(''), {compression: 'DEFLATE'});
+        data = writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage);
+        if (isSinglePage) {
+            for (let i = 0; i < 1; i++) {
+                file = 'sheet' + (i + 1) + '.xml';
+                zip_worksheets.file(file, data[i].join(''), {compression: 'DEFLATE'});
+            }
+        } else {
+            for (let i = 0; i < data.length; i++) {
+                file = 'sheet' + (i + 1) + '.xml';
+                zip_worksheets.file(file, data[i].join(''), {compression: 'DEFLATE'});
+            }
         }
         file = 'sharedStrings.xml';
         data = writeSharedString(sharedStrList);

+ 21 - 23
public/calc_util.js

@@ -16,10 +16,11 @@ let executeObj = {
     currentTpl : null,
     currentRationItem: null,
     currentFeeRateFile: null,
-    at: function(code) {
+    at: function(ID) {
         let me = executeObj,
             rst = 0;
-        rst = me.currentTpl.compileAssistantObj[code].unitFee;
+        rst = me.currentTpl.compileAssistantObj[ID].unitFee;
+        rst = parseFloat(rst);
         return rst;
     },
     base: function(calcBaseCode) {
@@ -74,7 +75,8 @@ class calculation {
         let me = this;
         me.hasCompiled = false;
         me.errs = [];
-        let private_extract_code = function(str, idx){
+
+        let private_extract_ID = function(str, idx){
             let rst = '', lBracket = 0, rBracket = 0, firstIdx = idx, lastIdx = 0;
             for (let i = idx; i < str.length; i++) {
                 if (str[i] === '(') {
@@ -99,30 +101,28 @@ class calculation {
             return rst;
         };
         let private_parse_ref = function(item, itemIdx){
-            let expr = item.expression.split('at(').join('A(');
-            item.expression = expr;
+            //let expr = item.expression.split('at(').join('@(');
+            //item.expression = expr;
             //console.log('expression: ' + expr);
-            let idx = expr.indexOf('A(', 0);
+            let idx = item.expression.indexOf('@(', 0);
             while (idx >= 0) {
-                let code = private_extract_code(expr, idx);
-                //console.log('提取code: ' + code);
-                if (code.length > 0) {
-                    let subItem = me.compileAssistantObj[code];
+                let ID = private_extract_ID(item.expression, idx);
+                if (ID.length > 0) {
+                    let subItem = me.compileAssistantObj[ID];
                     if (subItem) {
-                        if (subItem.code !== item.code) {
-                            private_parse_ref(subItem, me.compileAssistantObj[code + "_idx"]);
+                        if (subItem.ID !== item.ID) {
+                            private_parse_ref(subItem, me.compileAssistantObj[ID + "_idx"]);
                         } else {
-                            me.errs.push("There exists the self refer code: " + code);
+                            me.errs.push("There exists the self refer ID: " + ID);
                         }
                     } else {
-                        me.errs.push("There exists the invalid code by which could not find the item: " + code);
-                        console.log('invalid code: ' + code);
+                        me.errs.push("There exists the invalid ID by which could not find the item: " + ID);
+                        console.log('invalid ID: ' + ID);
                     }
                 }
-                idx = expr.indexOf('A(', idx + code.length + 3);
+                idx = item.expression.indexOf('@(', idx + ID.length + 3);
             }
             if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
-                //console.log('the code ready to push: ' + item.code);
                 me.calcTpl.compiledSeq.push(itemIdx);
             }
         };
@@ -134,7 +134,7 @@ class calculation {
         let private_compile_items = function() {
             for (let idx of me.calcTpl.compiledSeq) {
                 let item = me.calcTpl.calcItems[idx];
-                item.compiledExpr = item.expression.split('A(').join('$CE.at(');
+                item.compiledExpr = item.expression.split('@(').join('$CE.at(');
                 item.compiledExpr = item.compiledExpr.split('base(').join('$CE.base(');
                 item.compiledExpr = item.compiledExpr.split('fee(').join('$CE.fee(');
                 item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');
@@ -157,8 +157,8 @@ class calculation {
             private_comile_feeFile();
             for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
                 let item = me.calcTpl.calcItems[i];
-                me.compileAssistantObj[item.code] = item;
-                me.compileAssistantObj[item.code + "_idx"] = i;
+                me.compileAssistantObj[item.ID] = item;
+                me.compileAssistantObj[item.ID + "_idx"] = i;
             }
             //2. second round -> go!
             for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
@@ -171,8 +171,6 @@ class calculation {
                 console.log('errors: ' + me.errs.toString());
             }
         }
-        //console.log(me.compileAssistantObj);
-        //console.log(me.calcTpl.compiledSeq);
     };
     calculate( $RATION){
         let me = this;
@@ -185,7 +183,7 @@ class calculation {
             for (let idx of me.calcTpl.compiledSeq) {
                 let item = me.calcTpl.calcItems[idx];
                 item.unitFee = eval(item.compiledExpr);
-                item.totalFee = eval(item.unitFee * 5);     // AAAAA 5为测试值 $RATION.data.Quantity
+                item.totalFee = item.unitFee * 3;     // AAAAA 5为测试值 $RATION.data.Quantity
             }
         }
     }

+ 1 - 0
public/web/rpt_value_define.js

@@ -188,6 +188,7 @@ let JV = {
     PAGE_SELF_DEFINE: "自定义",
 
     PAGES_SIZE_STR: ["A3", "A4", "A5", "B5", "LETTER", "LEGAL", "EXECUTIVE", "16K"],
+    PAGES_SIZE_IDX: [8, 9, 11, 13, 1, 5, 7, 93],
     PAGES_SIZE: [[11.69, 16.54], [8.27, 11.69], [5.83, 8.27], [6.93, 9.84], [8.5, 11.0], [8.5, 14.0], [7.25, 10.5], [7.25, 10.5]],
 
     HUNDRED_PERCENT : 100.0,

+ 2 - 1
web/building_saas/fee_rates/fee_rate.html

@@ -9,12 +9,13 @@
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+
     <link rel="stylesheet" href="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css">
     <script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>
     <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
     <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
     <script src="/lib/spreadjs/views/locale/gc.spread.views.dataview.locale.zh-CN.10.0.0.min.js" type="text/javascript"></script>
-    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+    <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
 
 
     <style>

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

@@ -283,6 +283,9 @@ var quantity_detail = {
             if(needupdate){
                 var updateData = this.getUpdateData('ut_update',query,doc,'updateQuantityRegex');
                 project.pushNow('updateQuantityDetail',[this.getSourceType()],updateData);
+            }else {
+                var sheet = subSpread.getActiveSheet();
+                sheet.getCell(args.row,args.col).value(gljOprObj.detailData[args.row].regex);
             }
         };
 

+ 64 - 46
web/building_saas/main/js/models/ration_calc.js

@@ -221,149 +221,167 @@ let calcTemplate = {
     compiledSeq: [],
     calcItems: [
         {
+            ID: "1",
             code: "1",
             name: "基价直接工程费",
-            dispExpr: "A2+A5+A6+A10",
-            expression: "A('2') + A('5') + A('6') + A('10')",
+            dispExpr: "F2+F5+F6+F10",
+            expression: "@('2') + @('5') + @('6') + @('10')",
             compiledExpr: "",
             statement: "基价人工费+基价材料费+基价机械费+未计价材料费"
         },
         {
-            code: "2",
+            ID: "2",
+            code: "1.1",
             name: "基价人工费",
-            dispExpr: "A3+A4",
-            expression: "A('3') + A('4')",
+            dispExpr: "F3+F4",
+            expression: "@('3') + @('4')",
             compiledExpr: "",
             statement: "定额基价人工费+定额人工单价(基价)调整"
         },
         {
-            code: "3",
+            ID: "3",
+            code: "1.1.1",
             name: "定额基价人工费",
-            dispExpr: "定额基价人工费",
+            dispExpr: "[定额基价人工费]",
             expression: "base('定额基价人工费').toFixed(2)",
             compiledExpr: "",
             statement: "定额基价人工费"
         },
         {
-            code: "4",
-            name: "定额人工单价(基价)调整",
-            dispExpr: "A3*[1.89-1]",
-            expression: "A('3') * (1.89-1)",
+            ID: "4",
+            code: "1.1.2",
+            name: "[定额人工单价(基价)调整]",
+            dispExpr: "F3*(1.89-1)",
+            expression: "@('3') * (1.89-1)",
             compiledExpr: "",
             statement: "定额基价人工费*[定额人工单价(基价)调整系数-1]",
             memo: "渝建发(2013)51"
         },
         {
-            code: "5",
+            ID: "5",
+            code: "1.2",
             name: "基价材料费",
-            dispExpr: "定额基价材料费",
+            dispExpr: "[定额基价材料费]",
             expression: "base('定额基价材料费')",
             compiledExpr: "",
             statement: "定额基价材料费"
         },
         {
-            code: "6",
+            ID: "6",
+            code: "1.3",
             name: "基价机械费",
-            dispExpr: "A7+A9",
-            expression: "A('7') + A('9')",
+            dispExpr: "F7+F9",
+            expression: "@('7') + @('9')",
             compiledExpr: "",
             statement: "定额基价机械费+定额机上人工单价(基价)调整"
         },
         {
-            code: "7",
+            ID: "7",
+            code: "1.3.1",
             name: "定额基价机械费",
-            dispExpr: "定额基价机械费",
+            dispExpr: "[定额基价机械费]",
             expression: "base('定额基价机械费')",
             compiledExpr: "",
             statement: "定额基价机械费"
         },
         {
-            code: "8",
+            ID: "8",
+            code: "1.3.1.1",
             name: "其中:定额基价机上人工费",
-            dispExpr: "定额基价机上人工费",
+            dispExpr: "[定额基价机上人工费]",
             expression: "base('定额基价机上人工费')",
             compiledExpr: "",
             statement: "定额基价机上人工费"
         },
         {
-            code: "9",
+            ID: "9",
+            code: "1.3.2",
             name: "定额机上人工单价(基价)调整",
-            dispExpr: "A8*[1.89-1]",
-            expression: "A('8') * (1.89-1)",
+            dispExpr: "F8*(1.89-1)",
+            expression: "@('8') * (1.89-1)",
             compiledExpr: "",
             statement: "定额基价机上人工费*[定额机上人工单价(基价)调整系数-1]"
         },
         {
-            code: "10",
+            ID: "10",
+            code: "1.4",
             name: "未计价材料费",
-            dispExpr: "主材费+设备费",
+            dispExpr: "[主材费]+[设备费]",
             expression: "base('主材费') + base('设备费')",
             compiledExpr: "",
             statement: "主材费+设备费"
         },
         {
-            code: "11",
+            ID: "11",
+            code: "2",
             name: "企业管理费",
-            dispExpr: "A3",
-            expression: "A('3')",
+            dispExpr: "F3",
+            expression: "@('3')*8.21 / 100",
             compiledExpr: "",
             statement: "定额基价人工费",
             memo: "渝建发[2014]27号"
         },
         {
-            code: "12",
+            ID: "12",
+            code: "3",
             name: "利润",
-            dispExpr: "A3",
-            expression: "A('3')",
+            dispExpr: "F3",
+            expression: "@('3')*6.5 / 100",
             compiledExpr: "",
             statement: "定额基价人工费"
         },
         {
-            code: "13",
+            ID: "13",
+            code: "4",
             name: "风险因素",
-            dispExpr: "A3",
-            expression: "A('3')",
+            dispExpr: "F3",
+            expression: "@('3')*3 / 100",
             compiledExpr: "",
             statement: "定额基价人工费",
             memo: "同定额包干费"
         },
         {
-            code: "14",
+            ID: "14",
+            code: "5",
             name: "人材机价差",
-            dispExpr: "A15+A16+A17",
-            expression: "A('15') + A('16') + A('17')",
+            dispExpr: "F15+F16+F17",
+            expression: "@('15') + @('16') + @('17')",
             compiledExpr: "",
             statement: "人工费价差+材料费价差+机械费价差"
         },
         {
-            code: "15",
+            ID: "15",
+            code: "5.1",
             name: "人工费价差",
-            dispExpr: "信息价或市场价格-调整后的定额人工费(基价)",
+            dispExpr: "[市场价格人工费]-[调整后的定额人工费(基价)]",
             expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
             compiledExpr: "",
             statement: "市场价格人工费-调整后的定额人工费(基价)"
         },
         {
-            code: "16",
+            ID: "16",
+            code: "5.2",
             name: "材料费价差",
-            dispExpr: "信息价或市场价格-定额基价材料费",
+            dispExpr: "[市场价格材料费]-[定额基价材料费]",
             expression: "base('市场价格材料费') - base('定额基价材料费(调整后)')",
             compiledExpr: "",
             statement: "市场价格材料费-定额基价材料费"
         },
         {
-            code: "17",
+            ID: "17",
+            code: "5.3",
             name: "机械费价差",
-            dispExpr: "信息价或市场价格-调整后的定额基价机械费(基价)",
+            dispExpr: "[市场价格机械费]-[调整后的定额基价机械费(基价)]",
             expression: "base('市场价格机械费') - base('定额基价机械费(调整后)')",
             compiledExpr: "",
             statement: "市场价格机械费-调整后的定额基价机械费(基价)"
         },
         {
-            code: "18",
+            ID: "18",
+            code: "6",
             name: "综合单价",
-            dispExpr: "A1+A11+A12+A13+A14",
-            expression: "A('1') + A('11') + A('12') + A('13') + A('14')",
+            dispExpr: "F1+F11+F12+F13+F14",
+            expression: "@('1') + @('11') + @('12') + @('13') + @('14')",
             compiledExpr: "",
             statement: "基价直接工程费+企业管理费+利润+风险因素+人材机价差"
         }

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

@@ -65,9 +65,9 @@ let rationCalcView = {
 
     setting: {
         header: [
-            {headerName: "费用代号", headerWidth: 75, dataCode: "code", dataType: "String", formatter: "A"+"0", hAlign: "center"},
+            {headerName: "费用代号", headerWidth: 75, dataCode: "code", dataType: "String", hAlign: "left"},
             {headerName: "费用名称", headerWidth: 200, dataCode: "name", dataType: "String"},
-            {headerName: "计算基数", headerWidth: 180, dataCode: "dispExpr", dataType: "String"},
+            {headerName: "计算基数", headerWidth: 280, dataCode: "dispExpr", dataType: "String"},
             {headerName: "基数说明", headerWidth: 220, dataCode: "statement", dataType: "String"},
             {headerName: "费率", headerWidth: 80, dataCode: "feeRate", dataType: "Number"},   // precision: 3
             {headerName: "单价", headerWidth: 100, dataCode: "unitFee", dataType: "Number"},  // execRst

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

@@ -60,7 +60,7 @@ $("#linkJSCX").click(function(){        // 计算程序
     subSpread.setActiveSheetIndex(4);
     rationCalcView.initSheet(subSpread.getSheet(4));
     let sel = projectObj.mainController.tree.selected;
-    if (sel.sourceType == 'ration'){
+    if (sel != null && sel.sourceType == 'ration'){
         rationCalcView.showData(sel);
     }
     else{