浏览代码

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

zhongzewei 8 年之前
父节点
当前提交
5ab6000b5d

+ 7 - 2
modules/fees/controllers/fees_controller.js

@@ -25,9 +25,14 @@ module.exports = {
         projectFeeRateFile.rates(fileID, function (doc) {
             res.json({data: doc});
         })
-    }
-
+    },
 
+    projectFeeUpdateRate: function (req, res) {
+        var rateObj = {"fileID": req.body.fileID, "rateID": req.body.rateID, "rateValue": req.body.rateValue};
+        projectFeeRateFile.updateRate(rateObj, function (doc) {
+            res.json({data: doc});
+        })
+    }
 }
 
 

+ 18 - 0
modules/fees/models/fees_db.js

@@ -36,6 +36,24 @@ FeeRateFile.prototype.rates = function(fileID, controllerFun){
     })
 };
 
+// 1 保存成功; 0 保存失败;-1没有找到对应记录。
+FeeRateFile.prototype.updateRate = function(rateObj, controllerFun){
+    feeRatesModel.find({"ID": rateObj.fileID}, ["rates"], function(err, data){
+        if(data.length){
+            for (var i = 0; i < data[0].rates.length; i++) {
+                if (data[0].rates[i].ID == rateObj.rateID) {
+                    data[0].rates[i].rate = rateObj.rateValue;
+                    data[0].save(function (err) {
+                        if (err) { controllerFun(0); } else { controllerFun(1); }
+                    });
+                    break;
+                }
+            };
+        }
+        else{ controllerFun(-1); }
+    })
+};
+
 module.exports = new FeeRateFile();
 
 

+ 1 - 0
modules/fees/routes/fees_router.js

@@ -13,6 +13,7 @@ feesRouter.get('/', function(req, res) {
 feesRouter.post('/getLibNames', feesController.libNames);
 feesRouter.post('/getLibFeeRates', feesController.libFeeRates);
 feesRouter.post('/getProjectFeeRates', feesController.projectFeeRates);
+feesRouter.post('/updateProjectFeeRate', feesController.projectFeeUpdateRate);
 
 
 module.exports = feesRouter;

+ 103 - 12
modules/reports/util/rpt_excel_util.js

@@ -126,7 +126,69 @@ function writeTheme(){
     return rst;
 }
 function writeStyles(stylesObj){
-    //
+    var rst = [];
+    rst.push(dftHeadXml + '\r\n');
+    rst.push('<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">');
+    //1. push fonts
+    rst.push('<fonts count="' + stylesObj.fonts.length + '">')
+    for (var i = 0; i < stylesObj.fonts.length; i++) {
+        var font = stylesObj.fonts[i];
+        rst.push('<font>');
+        if (strUtil.convertStrToBoolean(font[JV.FONT_PROPS[3]])) {
+            rst.push('<b/>');
+        }
+        rst.push('<sz val="' + font.size + '"/>');
+        rst.push('<color indexed="' + font.colorIdx + '"/>');
+        rst.push('<name val="' + font[JV.FONT_PROPS[0]] + '"/>');
+        rst.push('<charset val="' + font.charset + '"/>');
+        rst.push('</font>');
+    }
+    rst.push('<fonts>');
+    //2. push default fills
+    rst.push('<fills count="2"><fill><patternFill patternType="none" /></fill><fill><patternFill patternType="gray125" /></fill></fills>');
+    //3. push borders
+    rst.push('<borders count="' + stylesObj.borders.length + '">')
+    private_setBorder = function(border, borderDirection) {
+        if (border[borderDirection][JV.PROP_LINE_WEIGHT] == 0) {
+            rst.push('<' + borderDirection.toLowerCase() + '/>');
+        } else {
+            var bW = 'thin';
+            if (border[borderDirection][JV.PROP_LINE_WEIGHT] = 2) bW = 'medium';
+            if (border[borderDirection][JV.PROP_LINE_WEIGHT] > 2) bW = 'thick';
+            rst.push('<' + borderDirection.toLowerCase() + ' style="' + bW + '">' + '<color indexed="64"/>' + '</' + borderDirection.toLowerCase() + '>');
+        }
+    };
+    for (var i = 0; i < stylesObj.borders.length; i++) {
+        var border = stylesObj.borders[i];
+        private_setBorder(border, JV.PROP_LEFT);
+        private_setBorder(border, JV.PROP_RIGHT);
+        private_setBorder(border, JV.PROP_TOP);
+        private_setBorder(border, JV.PROP_BOTTOM);
+    }
+    rst.push('</borders>');
+    //4. push cellStyleXfs
+    rst.push('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"><alignment vertical="center"/></xf></cellStyleXfs>');
+    //5. push cellXfs
+    rst.push('<cellXfs count="' + stylesObj.cellXfs.length + '">');
+    for (var i = 0; i < stylesObj.cellXfs.length; i++) {
+        var excelStyle = stylesObj.cellXfs[i];
+        rst.push('<xf numFmtId="0" fontId="' + excelStyle.fontId + '" fillId="0" borderId="' + excelStyle.borderId + '" xfId="0">');
+        var alignStr = '<alignment horizontal="' + excelStyle[JV.CONTROL_PROPS[2]] + '" vertical="' + excelStyle[JV.CONTROL_PROPS[3]] + '"';
+        if (strUtil.convertStrToBoolean(excelStyle[JV.CONTROL_PROPS[1]])) {
+            alignStr = alignStr + ' shrinkToFit="1"';
+        }
+        if (strUtil.convertStrToBoolean(excelStyle[JV.CONTROL_PROPS[4]])) {
+            alignStr = alignStr + ' wrapText="1"';
+        }
+        alignStr = alignStr + '/>';
+        rst.push(alignStr);
+        rst.push('</xf>');
+    }
+    rst.push('</cellXfs>');
+    //6. others (xfl style / dxfs / tableStyles)
+    //..
+    rst.push('</styleSheet>');
+    return rst;
 }
 function writeSharedString(sharedStrList){
     var rst = [];
@@ -219,7 +281,7 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
         for (var i = 0; i < stylesObj.fonts.length; i++) {
             var font = stylesObj.fonts[i];
             if (sheetFont) {
-                if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4)) {
+                if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4) && font[JV.FONT_PROPS[3]] == sheetFont[JV.FONT_PROPS[3]]) {
                     hasFont = true;
                     rst = i;
                     break;
@@ -230,10 +292,11 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
         }
         if (!hasFont) {
             var font = {};
-            font[JV.FONT_PROPS[0]] = sheetFont[JV.FONT_PROPS[0]];
+            font[JV.FONT_PROPS[0]] = sheetFont[JV.FONT_PROPS[0]]; //font name
             font.size = Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4);
             font.charset = 134;
-            font.scheme = "minor";
+            font.colorIdx = "8";
+            font[JV.FONT_PROPS[3]] = sheetFont[JV.FONT_PROPS[3]]; //font bold
             stylesObj.fonts.push(font);
             rst = stylesObj.fonts.length - 1;
         }
@@ -314,16 +377,41 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getStyleIdx = function(cell) {
+    private_checkControl = function(cellControl, sheetControl) {
+        var rst = true;
+        for (var i = 0; i < JV.CONTROL_PROPS.length; i++) {
+            if (cellControl[JV.CONTROL_PROPS[i]] != sheetControl[JV.CONTROL_PROPS[i]]) {
+                rst = false;
+                break;
+            }
+        }
+        return rst;
+    };
+    private_getStyleId = function(cell) {
         var rst = 1, hasStyle = false;
         if (!(stylesObj.cellXfs)) stylesObj.cellXfs = [];
+        var fontId = private_getFontId(cell);
+        var borderId = private_getBorderId(cell);
+        var cellControl = sheetData[JV.NODE_CONTROL_COLLECTION][cell[JV.PROP_CONTROL]];
         for (var i = 0; i < stylesObj.cellXfs.length; i++) {
-            //check font and border
-            var fontId = private_getFontId(cell);
-            var cellStyle = stylesObj.cellXfs[i];
+            var sheetControl = stylesObj.cellXfs[i];
+            if (sheetControl.fontId == fontId && sheetControl.borderId == borderId) {
+                if (private_checkControl(cellControl, sheetControl)) {
+                    rst = i;
+                    hasStyle = true;
+                    break;
+                }
+            }
         }
         if (!hasStyle) {
-            //add new style
+            var sheetControl = {};
+            sheetControl.fontId = fontId;
+            sheetControl.borderId = borderId;
+            for (var i = 0; i < JV.CONTROL_PROPS.length; i++) {
+                sheetControl[JV.CONTROL_PROPS[i]] = cellControl[JV.CONTROL_PROPS[i]];
+            }
+            stylesObj.cellXfs.push(sheetControl);
+            rst = stylesObj.cellXfs.length - 1;
         }
         return rst;
     };
@@ -389,7 +477,7 @@ function writeSheet(sheetData, sharedStrList, stylesObj){
                 colIdxStr = private_getCellIdxStr(j);
                 if (hasMoreCols) {
                     if (nextColIdx == j) {
-                        var styleIdx = private_getStyleIdx(sheetData.cells[cellIdx]);
+                        var styleIdx = private_getStyleId(sheetData.cells[cellIdx]);
                         if (strUtil.isEmptyString(sheetData.cells[cellIdx][JV.PROP_VALUE])) {
                             rst.push('<c r="' + colIdxStr + i + '" s="' + styleIdx + '"/>');
                             //should setup the right style instead!
@@ -469,8 +557,8 @@ module.exports = {
     ,testWriteXlRels: function(sheets) {
         return writeXlRels(sheets);
     }
-    ,testWriteSheets: function(pageData, sharedStrList, styleList){
-        return writeSheets(pageData, sharedStrList, styleList);
+    ,testWriteSheets: function(pageData, sharedStrList, stylesObj){
+        return writeSheets(pageData, sharedStrList, stylesObj);
     }
     ,testWriteSharedString: function(sharedStrList){
         return writeSharedString(sharedStrList);
@@ -478,4 +566,7 @@ module.exports = {
     ,testWriteTheme: function() {
         return writeTheme();
     }
+    ,testWriteStyles: function(stylesObj) {
+        return writeStyles(stylesObj);
+    }
 }

+ 10 - 0
public/stringUtil.js

@@ -39,5 +39,15 @@ module.exports = {
             for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
         }
         return re;
+    },
+    convertStrToBoolean: function(str) {
+        var rst = false, me = this;
+        if (!me.isEmptyString(str)) {
+            var upperStr = str.toUpperCase();
+            if (upperStr == 'T' || upperStr == 'Y' || upperStr == 'YES' || upperStr == 'TRUE') {
+                rst = true;
+            }
+        }
+        return rst;
     }
 }

+ 7 - 2
test/unit/excel_export/rpt_excel_export_test.js

@@ -33,8 +33,8 @@ test('check excel output', function(t){
     var xlRels = rpt_xl_util.testWriteXlRels(sheets);
     fsUtil.writeArrayToFile(xlRels, '../../../tmp/workbook.xml.rels');
     t.pass('pass xl sheet rels');
-    var sharedStrList = [], styleList= [];
-    var sheetsArr = rpt_xl_util.testWriteSheets(testReport07_1, sharedStrList, styleList);
+    var sharedStrList = [], stylesObj = {};
+    var sheetsArr = rpt_xl_util.testWriteSheets(testReport07_1, sharedStrList, stylesObj);
     for (var i = 0; i < sheetsArr.length; i++) {
         fsUtil.writeArrayToFile(sheetsArr[i], '../../../tmp/sheet' + (i + 1) + '.xml');
         t.pass('pass sheet' + (i + 1));
@@ -42,6 +42,11 @@ test('check excel output', function(t){
     var sharedStr = rpt_xl_util.testWriteSharedString(sharedStrList);
     fsUtil.writeArrayToFile(sharedStr, '../../../tmp/sharedStrings.xml');
     t.pass('pass shared string');
+
+    var styleStr = rpt_xl_util.testWriteStyles(stylesObj);
+    fsUtil.writeArrayToFile(sharedStr, '../../../tmp/styles.xml');
+    t.pass('pass styles');
+
     var theme = rpt_xl_util.testWriteTheme();
     //console.log(theme);
     var themeArr = [];

+ 35 - 4
web/fees/feeRate.js

@@ -3,6 +3,7 @@
  */
 var region = '重庆';
 var feeRateFileID = 5;
+var datas = [];
 var spreadView;
 
 $(document).ready(function () {
@@ -23,7 +24,8 @@ function loadProjectFeeRates(fileID) {
         data: {"fileID": fileID},
         success: function (result) {
             if (result.data) {
-                createSpreadView(result.data[0].rates, true);
+                datas = result.data[0].rates;
+                createSpreadView(true);
             }
         },
         error: function (result) {
@@ -61,7 +63,8 @@ function loadLibFeeRates(libID) {
         data: {"libID": libID},
         success: function (result) {
             if (result.data) {
-                createSpreadView(result.data[0].rates, false);
+                datas = result.data[0].rates;
+                createSpreadView(false);
             }
         },
         error: function (result) {
@@ -70,7 +73,7 @@ function loadLibFeeRates(libID) {
     });
 }
 
-function createSpreadView(datas, canEdit) {
+function createSpreadView(canEdit) {
     // 创建前先销毁旧树表。
     //$('#divFee').empty();  // 清空不行,浏览器跟踪显示错误数狂飚:TypeError: G is null
     //$('#divFee').remove(); // 删除可以,但是太山寨。
@@ -142,8 +145,36 @@ function createSpreadView(datas, canEdit) {
         }
     };
 
+    var dataSource = {
+        loadRange: function(params) {
+            params.success(datas);
+        },
+
+        update: function(params) {
+            $.ajax({
+                type: 'POST',
+                url: '/fees/updateProjectFeeRate',
+                data: {"fileID": feeRateFileID, "rateID": params.dataItem.ID, "rateValue": params.dataItem.rate},
+                success: function(data) {
+                    var iCode = data.data;
+                    if (iCode == 1){
+                        params.success();
+                    }else{
+                        alert('(' + iCode + ') 修改失败!');
+                        spreadView.cancelEditing();
+                        params.failed();
+                    }
+                },
+                error: function(xhr, status) {
+                    alert('内部程序错误!');
+                    params.failed();
+                }
+            });
+        }
+    };
+
     spreadView = new GC.Spread.Views.DataView($('#divFee')[0],
-        datas, columns, new GC.Spread.Views.Plugins.GridLayout(options));
+        dataSource, columns, new GC.Spread.Views.Plugins.GridLayout(options));
     spreadView.invalidate();
     document.querySelector('#divFee').focus();
 }