Sfoglia il codice sorgente

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

zhongzewei 7 anni fa
parent
commit
d83fb1e7dc
49 ha cambiato i file con 585 aggiunte e 187841 eliminazioni
  1. 2 1
      modules/glj/controllers/glj_controller.js
  2. 7 2
      modules/glj/models/glj_list_model.js
  3. 14 1
      modules/main/controllers/calc_program_controller.js
  4. 34 2
      modules/main/facade/calc_program_facade.js
  5. 2 1
      modules/main/models/project_consts.js
  6. 1 0
      modules/main/routes/calc_program_route.js
  7. 1 1
      modules/ration_repository/models/ration_item.js
  8. 16 14
      modules/reports/rpt_component/helper/jpc_helper_flow_tab.js
  9. 4 3
      modules/reports/rpt_component/jpc_data.js
  10. 9 0
      modules/reports/rpt_component/jpc_ex.js
  11. 3 3
      modules/reports/rpt_component/jpc_flow_tab.js
  12. 28 3
      modules/reports/rpt_component/jpc_rte.js
  13. 112 2
      modules/reports/util/rpt_construct_data_util.js
  14. 9 1
      public/calc_util.js
  15. 42 42
      public/stringUtil.js
  16. 1 0
      public/web/sheet/sheet_common.js
  17. 7 7
      public/web/string_util_light.js
  18. 10 3
      test/unit/reports/test_tpl_09_1.js
  19. 0 18062
      tmp/07_1.page.js
  20. 0 14
      tmp/excel_test_raw_data/08-2/[Content_Types].xml
  21. 0 6
      tmp/excel_test_raw_data/08-2/_rels/.rels
  22. 0 26
      tmp/excel_test_raw_data/08-2/docProps/app.xml
  23. 0 7
      tmp/excel_test_raw_data/08-2/docProps/core.xml
  24. 0 7
      tmp/excel_test_raw_data/08-2/xl/_rels/workbook.xml.rels
  25. 0 17365
      tmp/excel_test_raw_data/08-2/xl/sharedStrings.xml
  26. 0 205
      tmp/excel_test_raw_data/08-2/xl/styles.xml
  27. 0 281
      tmp/excel_test_raw_data/08-2/xl/theme/theme1.xml
  28. 0 12
      tmp/excel_test_raw_data/08-2/xl/workbook.xml
  29. 0 151683
      tmp/excel_test_raw_data/08-2/xl/worksheets/sheet1.xml
  30. 2 7
      web/building_saas/css/main.css
  31. 3 2
      web/building_saas/glj/js/common_spread.js
  32. 2 1
      web/building_saas/glj/js/project_glj.js
  33. 16 14
      web/building_saas/glj/js/project_glj_spread.js
  34. 2 2
      web/building_saas/js/global.js
  35. 1 1
      web/building_saas/main/html/calc_program_manage.html
  36. 1 1
      web/building_saas/main/html/main.html
  37. 6 2
      web/building_saas/main/js/controllers/project_controller.js
  38. 12 1
      web/building_saas/main/js/models/calc_program.js
  39. 1 0
      web/building_saas/main/js/models/project.js
  40. 7 0
      web/building_saas/main/js/models/ration.js
  41. 5 4
      web/building_saas/main/js/views/fee_rate_view.js
  42. 174 14
      web/building_saas/main/js/views/glj_view.js
  43. 10 5
      web/building_saas/main/js/views/glj_view_contextMenu.js
  44. 18 18
      web/building_saas/main/js/views/main_tree_col.js
  45. 2 1
      web/building_saas/main/js/views/project_property_labour_coe_view.js
  46. 6 4
      web/building_saas/main/js/views/project_view.js
  47. 5 5
      web/building_saas/main/js/views/std_bills_lib.js
  48. 5 5
      web/building_saas/main/js/views/std_ration_lib.js
  49. 5 0
      web/building_saas/report/js/jpc_output.js

+ 2 - 1
modules/glj/controllers/glj_controller.js

@@ -66,10 +66,11 @@ class GLJController extends BaseController {
 
 
             // 先获取对应标段的项目工料机数据
             // 先获取对应标段的项目工料机数据
             let gljListModel = new GLJListModel();
             let gljListModel = new GLJListModel();
-            let [gljList, mixRatioConnectData] = await gljListModel.getListByProjectId(projectId, unitPriceFileId);
+            let [gljList, mixRatioConnectData,mixRationMap] = await gljListModel.getListByProjectId(projectId, unitPriceFileId);
 
 
             responseData.data.gljList = gljList;
             responseData.data.gljList = gljList;
             responseData.data.mixRatioConnectData = mixRatioConnectData;
             responseData.data.mixRatioConnectData = mixRatioConnectData;
+            responseData.data.mixRatioMap = mixRationMap;
             responseData.data.usedTenderList = usedTenderList;
             responseData.data.usedTenderList = usedTenderList;
             responseData.data.constData = {
             responseData.data.constData = {
                 materialIdList: gljListModel.materialIdList,
                 materialIdList: gljListModel.materialIdList,

+ 7 - 2
modules/glj/models/glj_list_model.js

@@ -76,6 +76,7 @@ class GLJListModel extends BaseModel {
     async getListByProjectId(projectId, unitPriceFileId) {
     async getListByProjectId(projectId, unitPriceFileId) {
         let gljData = null;
         let gljData = null;
         let mixRatioConnectData = {};
         let mixRatioConnectData = {};
+        let mixRationMap={};
         try {
         try {
             // 首先获取对应标段下所有的项目工料机数据
             // 首先获取对应标段下所有的项目工料机数据
             let condition = {project_id: projectId};
             let condition = {project_id: projectId};
@@ -138,7 +139,11 @@ class GLJListModel extends BaseModel {
                     } else {
                     } else {
                         mixRatioData[tmp.glj_id] = [tmp];
                         mixRatioData[tmp.glj_id] = [tmp];
                     }
                     }
-
+                    if(mixRationMap[tmp.connect_code]!=undefined){
+                        mixRationMap[tmp.connect_code].push(tmp);
+                    }else {
+                        mixRationMap[tmp.connect_code]=[tmp];
+                    }
                     if (mixRatioConnectData[tmp.glj_id] !== undefined) {
                     if (mixRatioConnectData[tmp.glj_id] !== undefined) {
                         mixRatioConnectData[tmp.glj_id].push(tmp.connect_code);
                         mixRatioConnectData[tmp.glj_id].push(tmp.connect_code);
                     } else {
                     } else {
@@ -160,7 +165,7 @@ class GLJListModel extends BaseModel {
             gljData = [];
             gljData = [];
         }
         }
 
 
-        return [gljData, mixRatioConnectData];
+        return [gljData, mixRatioConnectData,mixRationMap];
     }
     }
 
 
     /**
     /**

+ 14 - 1
modules/main/controllers/calc_program_controller.js

@@ -8,7 +8,8 @@ let calcProgramFacade = require('../facade/calc_program_facade');
 module.exports = {
 module.exports = {
     getProjectCalcProgram: getProjectCalcProgram,
     getProjectCalcProgram: getProjectCalcProgram,
     getStdCalcProgram: getStdCalcProgram,
     getStdCalcProgram: getStdCalcProgram,
-    saveCalcItem: saveCalcItem
+    saveCalcItem: saveCalcItem,
+    saveCalcItems: saveCalcItems
 };
 };
 
 
 async function getProjectCalcProgram(req, res) {
 async function getProjectCalcProgram(req, res) {
@@ -50,3 +51,15 @@ async function saveCalcItem(req, res) {
     });
     });
     res.json(result);
     res.json(result);
 };
 };
+
+async function saveCalcItems(req, res) {
+    let result = {error: 0, message: ''};
+
+    calcProgramFacade.saveCalcItems(req.body.data, function (err, msg) {
+        if (err) {
+            result.error = 1;
+        };
+        result.message = msg;
+    });
+    res.json(result);
+};

+ 34 - 2
modules/main/facade/calc_program_facade.js

@@ -18,7 +18,8 @@ module.exports = {
     getStdCalcProgramFile: getStdCalcProgramFile,
     getStdCalcProgramFile: getStdCalcProgramFile,
     getData: getData,
     getData: getData,
     save: save,
     save: save,
-    saveCalcItem: saveCalcItem
+    saveCalcItem: saveCalcItem,
+    saveCalcItems: saveCalcItems
 };
 };
 
 
 async function newProjectCalcProgramFile(data) {
 async function newProjectCalcProgramFile(data) {
@@ -114,11 +115,42 @@ function saveCalcItem(dataObj, callback) {
             callback( {err:1, msg:'没有找到计算程序文件'} );
             callback( {err:1, msg:'没有找到计算程序文件'} );
         }
         }
     });
     });
+};
 
 
+// {  projectID: projectID, calcItems: [{templatesID, calcItem}]  }
+function saveCalcItems(datas, callback) {
+    let datasObj = JSON.parse(datas);
+    projectCalcProgramsModel.findOne({projectID: datasObj.projectID}, function (err, data) {
+        if(!err){
+            for (let cI of datasObj.calcItems){
+                for (let i = 0; i < data.templates.length; i++){
+                    if (data.templates[i].ID == cI.templatesID){
+                        for (let j=0; j < data.templates[i].calcItems.length; j++){
+                            if (data.templates[i].calcItems[j].ID == cI.calcItem.ID){
+                                data.templates[i].calcItems[j] = cI.calcItem;
+                                data.save(function (err) {
+                                    if (err) {
+                                        callback({err:1, msg:'本条计算规则保存失败'});
+                                    } else {
+                                        callback({err:0, msg:'本条计算规则保存成功'});
+                                    }
+                                });
+                                break;
+                            };
+                        };
+                        break;
+                    };
+                };
+            };
+        }
+        else {
+            callback( {err:1, msg:'没有找到计算程序文件'} );
+        }
+    });
 };
 };
 
 
 // for test
 // for test
 /*let udata = {ID:8, code: '8.8.8', name: '被改成了888', hehe: '增加的属性'};
 /*let udata = {ID:8, code: '8.8.8', name: '被改成了888', hehe: '增加的属性'};
-saveCalcItem({projectID: 597, templatesID: 4, calcItemID: 8, data: udata}, function (data) {
+saveCalcItem({projectID: 597, templatesID: 4, data: udata}, function (data) {
     console.log({msg:data.msg, data: data.data});
     console.log({msg:data.msg, data: data.data});
 })*/
 })*/

+ 2 - 1
modules/main/models/project_consts.js

@@ -33,7 +33,8 @@ let projectConstList = [
     'properties',
     'properties',
     'volume_price',
     'volume_price',
     'feeRate',
     'feeRate',
-    'labour_coe'
+    'labour_coe',
+    'calc_program'
 ];
 ];
 
 
 let commonConst = {
 let commonConst = {

+ 1 - 0
modules/main/routes/calc_program_route.js

@@ -12,6 +12,7 @@ module.exports = function (app) {
     cpRouter.post('/getProjectCalcProgram', cpController.getProjectCalcProgram);
     cpRouter.post('/getProjectCalcProgram', cpController.getProjectCalcProgram);
     cpRouter.post('/getStdCalcProgram', cpController.getStdCalcProgram);
     cpRouter.post('/getStdCalcProgram', cpController.getStdCalcProgram);
     cpRouter.post('/saveCalcItem', cpController.saveCalcItem);
     cpRouter.post('/saveCalcItem', cpController.saveCalcItem);
+    cpRouter.post('/saveCalcItems', cpController.saveCalcItems);
 
 
     app.use('/calcProgram',cpRouter);
     app.use('/calcProgram',cpRouter);
 }
 }

+ 1 - 1
modules/ration_repository/models/ration_item.js

@@ -47,7 +47,7 @@ var counter = require('../../../public/counter/counter');
 var rationItemDAO = function(){};
 var rationItemDAO = function(){};
 
 
 rationItemDAO.prototype.getRationItemsBySection = function(sectionId,callback){
 rationItemDAO.prototype.getRationItemsBySection = function(sectionId,callback){
-    rationItemModel.find({"sectionId": sectionId, "$or": [{"isDeleted": null}, {"isDeleted": false} ]},function(err,data){
+    rationItemModel.find({"sectionId": sectionId, "$or": [{"isDeleted": null}, {"isDeleted": false} ]}, null, {sort: {code: 1}}, function(err,data){
         if(err) callback(true, "Fail to get items", "")
         if(err) callback(true, "Fail to get items", "")
         else callback(false,"Get items successfully", data);
         else callback(false,"Get items successfully", data);
     })
     })

+ 16 - 14
modules/reports/rpt_component/helper/jpc_helper_flow_tab.js

@@ -2,33 +2,35 @@ let JV = require('../jpc_value_define');
 let JpcCommonHelper = require('./jpc_helper_common');
 let JpcCommonHelper = require('./jpc_helper_common');
 
 
 let JpcFlowTabHelper = {
 let JpcFlowTabHelper = {
-    getMaxRowsPerPage: function(bands, rptTpl) {
+    getMaxRowsPerPage: function(bands, rptTpl, isEx) {
         let rst = 1;
         let rst = 1;
-        let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT];
+        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
+        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
         if (band) {
             let maxFieldMeasure = 1.0;
             let maxFieldMeasure = 1.0;
             if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
             if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-                maxFieldMeasure = 1.0 * rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
+                maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
             } else {
             } else {
-                maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
+                maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
             }
             }
             rst = Math.floor((band.Bottom - band.Top) / maxFieldMeasure);
             rst = Math.floor((band.Bottom - band.Top) / maxFieldMeasure);
         }
         }
         return rst;
         return rst;
     },
     },
-    getActualContentAreaHeight: function(bands, rptTpl, segments, page) {
+    getActualContentAreaHeight: function(bands, rptTpl, segments, page, isEx) {
         let rst = 1;
         let rst = 1;
-        let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT];
+        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
+        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
         if (band) {
             let maxFieldMeasure = 1.0;
             let maxFieldMeasure = 1.0;
             if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
             if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
                 let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-                maxFieldMeasure = 1.0 * rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
+                maxFieldMeasure = 1.0 * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] * unitFactor;
             } else {
             } else {
-                maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
+                maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
             }
             }
             if (segments.length >= page) {
             if (segments.length >= page) {
                 rst = segments[page - 1].length * maxFieldMeasure;
                 rst = segments[page - 1].length * maxFieldMeasure;
@@ -36,17 +38,17 @@ let JpcFlowTabHelper = {
         }
         }
         return rst;
         return rst;
     },
     },
-    chkSegEnd: function (bands, rptTpl, sortedSequence, segIdx, preRec, nextRec) {
-        let me = this, rst = true;
+    chkSegEnd: function (bands, rptTpl, sortedSequence, segIdx, preRec, nextRec, isEx) {
+        let me = this;
         let remainAmt = preRec + nextRec - sortedSequence[segIdx].length;
         let remainAmt = preRec + nextRec - sortedSequence[segIdx].length;
-        rst = me.hasEnoughSpace(rptTpl, bands, remainAmt);
-        return rst;
+        return me.hasEnoughSpace(rptTpl, bands, remainAmt, isEx);
     },
     },
-    hasEnoughSpace: function (rptTpl, bands, remainAmt) {
+    hasEnoughSpace: function (rptTpl, bands, remainAmt, isEx) {
         if (remainAmt < 0) return false;
         if (remainAmt < 0) return false;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT];
+        let FLOW_INFO_STR = (!isEx)?JV.NODE_FLOW_INFO:JV.NODE_FLOW_INFO_EX;
+        let tab = rptTpl[FLOW_INFO_STR][JV.NODE_FLOW_CONTENT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band !== null && band !== undefined) {
         if (band !== null && band !== undefined) {
             measurement = 1.0 * tab[JV.PROP_CMN_HEIGHT] * unitFactor;
             measurement = 1.0 * tab[JV.PROP_CMN_HEIGHT] * unitFactor;

+ 4 - 3
modules/reports/rpt_component/jpc_data.js

@@ -1,4 +1,5 @@
 let JV = require('./jpc_value_define');
 let JV = require('./jpc_value_define');
+let jpc_common_helper = require("./helper/jpc_helper_common");
 let JpcData = {
 let JpcData = {
     createNew: function() {
     createNew: function() {
         let JpcDataRst = {};
         let JpcDataRst = {};
@@ -11,14 +12,14 @@ let JpcData = {
                 let masterIDs = [];
                 let masterIDs = [];
                 for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR].length; i++) {
                 for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR].length; i++) {
                     let mstFieldObj = rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR][i];
                     let mstFieldObj = rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR][i];
-                    if ((mstFieldObj[JV.PROP_IS_ID]) && (mstFieldObj[JV.PROP_IS_ID] === 'T')) {
+                    if (jpc_common_helper.getBoolean(mstFieldObj[JV.PROP_IS_ID])) {
                         masterIDs.push({"idx": i, "seq": mstFieldObj[JV.PROP_ID_SEQ]});
                         masterIDs.push({"idx": i, "seq": mstFieldObj[JV.PROP_ID_SEQ]});
                     }
                     }
                 }
                 }
                 let detailIDs = [];
                 let detailIDs = [];
                 for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR].length; i++) {
                 for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR].length; i++) {
                     let dtlFieldObj = rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR][i];
                     let dtlFieldObj = rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR][i];
-                    if ((dtlFieldObj[JV.PROP_IS_ID]) && (dtlFieldObj[JV.PROP_IS_ID] === 'T')) {
+                    if (jpc_common_helper.getBoolean(dtlFieldObj[JV.PROP_IS_ID])) {
                         detailIDs.push({"idx": i, "seq": dtlFieldObj[JV.PROP_ID_SEQ]});
                         detailIDs.push({"idx": i, "seq": dtlFieldObj[JV.PROP_ID_SEQ]});
                     }
                     }
                 }
                 }
@@ -100,6 +101,6 @@ let JpcData = {
         };
         };
         return JpcDataRst;
         return JpcDataRst;
     }
     }
-}
+};
 
 
 module.exports = JpcData;
 module.exports = JpcData;

+ 9 - 0
modules/reports/rpt_component/jpc_ex.js

@@ -85,10 +85,14 @@ JpcExSrv.prototype.createNew = function(){
         if (rptTpl[JV.NODE_FLOW_INFO]) {
         if (rptTpl[JV.NODE_FLOW_INFO]) {
             me.flowTab = JpcFlowTab.createNew();
             me.flowTab = JpcFlowTab.createNew();
             me.flowTab.initialize(false);
             me.flowTab.initialize(false);
+            me.isFollowMode = false;
         }
         }
         if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
         if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
             me.flowTabEx = JpcFlowTab.createNew();
             me.flowTabEx = JpcFlowTab.createNew();
             me.flowTabEx.initialize(true);
             me.flowTabEx.initialize(true);
+            if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.PROP_FLOW_EX_DISPLAY_MODE] === JV.DISPLAY_MODE_FOLLOW) {
+                me.isFollowMode = true;
+            }
         }
         }
         if (rptTpl[JV.NODE_BILL_INFO]) {
         if (rptTpl[JV.NODE_BILL_INFO]) {
             me.billTab = JpcBillTab.createNew();
             me.billTab = JpcBillTab.createNew();
@@ -137,6 +141,11 @@ JpcExSrv.prototype.createNew = function(){
     JpcResult.paging = function(rptTpl, dataObj, defProperties, option) {
     JpcResult.paging = function(rptTpl, dataObj, defProperties, option) {
         let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
         let me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
         if (me.flowTab) {
         if (me.flowTab) {
+            if (me.isFollowMode) {
+                //
+            } else {
+                //
+            }
             me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption);
             me.totalPages = me.flowTab.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption);
             if (me.flowTabEx) {
             if (me.flowTabEx) {
                 me.exTotalPages = me.flowTabEx.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption);
                 me.exTotalPages = me.flowTabEx.preSetupPages(rptTpl, dataObj, defProperties, dftPagingOption);

+ 3 - 3
modules/reports/rpt_component/jpc_flow_tab.js

@@ -104,7 +104,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
             }
             function private_resetBandArea() {
             function private_resetBandArea() {
                 JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, !me.isEx, me.isEx);
                 JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, !me.isEx, me.isEx);
-                maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl);
+                maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl, me.isEx);
             }
             }
             for (let segIdx = 0; segIdx < me.segments.length; segIdx++) {
             for (let segIdx = 0; segIdx < me.segments.length; segIdx++) {
                 private_resetBandArea();
                 private_resetBandArea();
@@ -112,7 +112,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 let rowSplitCnt = Math.ceil(1.0 * me.segments[segIdx].length / orgMaxRowRec);
                 let rowSplitCnt = Math.ceil(1.0 * me.segments[segIdx].length / orgMaxRowRec);
                 pageStatus[JV.STATUS_SEGMENT_END] = true;
                 pageStatus[JV.STATUS_SEGMENT_END] = true;
                 private_resetBandArea();
                 private_resetBandArea();
-                let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, me.segments, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
+                let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, me.segments, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec, me.isEx);
                 if (hasAdHocRow) rowSplitCnt++;
                 if (hasAdHocRow) rowSplitCnt++;
                 if (rowSplitCnt % me.multiCols > 0) {
                 if (rowSplitCnt % me.multiCols > 0) {
                     rowSplitCnt++
                     rowSplitCnt++
@@ -145,7 +145,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             //2. then reset the band height
             //2. then reset the band height
             let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT];
             let tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT];
             let flowContentBand = bands[tab[JV.PROP_BAND_NAME]];
             let flowContentBand = bands[tab[JV.PROP_BAND_NAME]];
-            let actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, page);
+            let actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, page, me.isEx);
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
             // 2.1 Content-Tab
             // 2.1 Content-Tab

+ 28 - 3
modules/reports/rpt_component/jpc_rte.js

@@ -46,15 +46,40 @@ let JE = {
         }
         }
         return rst;
         return rst;
     },
     },
-    setFieldValue: function (field, newValue, dataObj, valIdx) {
-        if (!(field.DataNodeName)) {
+    setFieldValue: function (field, dataObj, valIdx, newValue) {
+        if (field.DataNodeName === "NA") {
+            if (!field[JV.PROP_AD_HOC_DATA]) {
+                field[JV.PROP_AD_HOC_DATA] = [];
+            }
+            field[JV.PROP_AD_HOC_DATA][valIdx] = newValue;
+        } else if (!field.DataNodeName) {
+            //that means this is a self-defined discrete field!
+            field.DataNodeName = JV.DATA_DISCRETE_DATA;
+            let len = dataObj[JV.DATA_DISCRETE_DATA].length;
+            field.DataSeq = len;
+            dataObj[JV.DATA_DISCRETE_DATA].push([]);
+            dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
+        } else {
+            dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
+        }
+    },
+    getFieldValue: function (field, dataObj, valIdx, dftVal) {
+        let rst = dftVal;
+        if (!field.DataNodeName) {
             //that means this is a self-defined discrete field!
             //that means this is a self-defined discrete field!
             field.DataNodeName = JV.DATA_DISCRETE_DATA;
             field.DataNodeName = JV.DATA_DISCRETE_DATA;
             let len = dataObj[JV.DATA_DISCRETE_DATA];
             let len = dataObj[JV.DATA_DISCRETE_DATA];
             field.DataSeq = len;
             field.DataSeq = len;
             dataObj[JV.DATA_DISCRETE_DATA].push([]);
             dataObj[JV.DATA_DISCRETE_DATA].push([]);
         }
         }
-        dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
+        if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx) {
+            rst = dataObj[field.DataNodeName][field.DataSeq][valIdx];
+        } else {
+            if (dftVal === null && dataObj[field.DataNodeName][field.DataSeq].length > 0) {
+                rst = dataObj[field.DataNodeName][field.DataSeq][dataObj[field.DataNodeName][field.DataSeq].length - 1];
+            }
+        }
+        return rst;
     }
     }
 }
 }
 
 

+ 112 - 2
modules/reports/util/rpt_construct_data_util.js

@@ -161,8 +161,8 @@ class Rpt_Data_Extractor {
         // console.log(JV.DATA_MASTER_DATA_EX);
         // console.log(JV.DATA_MASTER_DATA_EX);
         // console.log(rptDataObj[JV.DATA_MASTER_DATA_EX]);
         // console.log(rptDataObj[JV.DATA_MASTER_DATA_EX]);
         assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX], rptDataObj[JV.DATA_DETAIL_DATA_EX], $PROJECT);
         assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX], rptDataObj[JV.DATA_DETAIL_DATA_EX], $PROJECT);
-        console.log(JV.DATA_DETAIL_DATA_EX);
-        console.log(rptDataObj[JV.DATA_DETAIL_DATA_EX]);
+        // console.log(JV.DATA_DETAIL_DATA_EX);
+        // console.log(rptDataObj[JV.DATA_DETAIL_DATA_EX]);
         return rptDataObj;
         return rptDataObj;
     };
     };
 
 
@@ -340,10 +340,18 @@ function sortData(sourceData, sortCfg) {
 
 
 function setupFunc(obj, prop, ownRawObj) {
 function setupFunc(obj, prop, ownRawObj) {
     obj[prop] = {};
     obj[prop] = {};
+    // if (prop === projectConst.CALC_PROGRAM) {
+    //     obj[prop]["myOwnRawDataObj"] = ownRawObj.data;
+    // } else {
+    //     obj[prop]["myOwnRawDataObj"] = ownRawObj;
+    // }
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
     obj[prop].getProperty = ext_getPropety;
     obj[prop].getProperty = ext_getPropety;
     obj[prop].getFee = ext_getFee;
     obj[prop].getFee = ext_getFee;
     obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
     obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
+    obj[prop].getArrayItemByKey = ext_getArrayItemByKey;
+    if (prop === projectConst.CALC_PROGRAM) obj[prop].getCalcProperty = ext_getCalcProperty;
+    if (prop === projectConst.FEERATE) obj[prop].getFeeRate = ext_getFeeRate;
 }
 }
 
 
 function assembleFields(fieldList, rstDataArr, $PROJECT) {
 function assembleFields(fieldList, rstDataArr, $PROJECT) {
@@ -449,6 +457,103 @@ function ext_getFee(feeKey, dtlFeeKey) {
     return rst;
     return rst;
 }
 }
 
 
+function ext_getCalcProperty(templateIDs, calcItemKey, calcItemKeyVal, calcItemRstKey){
+    let rst = [], parentObj = this; //this should be "calc_program" object
+    let dtObj = parentObj["myOwnRawDataObj"];
+    let optimizeObj = {};
+    let private_getProperty = function (cId) {
+        let calcTplObj = optimizeObj["calc_program_" + cId];
+        if (!calcTplObj) {
+            let templates = (dtObj.data._doc)?dtObj.data._doc.templates:dtObj.data.templates;
+            for (let tpl of templates) {
+                if (cId === tpl.ID) {
+                    optimizeObj["calc_program_" + cId] = tpl;
+                    calcTplObj = tpl;
+                    break;
+                }
+            }
+        }
+        if (calcTplObj) {
+            for (let calcItem of calcTplObj.calcItems) {
+                if (calcItem[calcItemKey] === calcItemKeyVal) {
+                    rst.push(calcItem[calcItemRstKey]);
+                    break;
+                }
+            }
+        }
+    };
+    if (templateIDs instanceof Array) {
+        for (let tplId of templateIDs) {
+            private_getProperty(tplId);
+        }
+    } else {
+        private_getProperty(templateIDs);
+    }
+    optimizeObj = null;
+    return rst;
+}
+
+function ext_getFeeRate(fee_Ids){
+    let rst = [], parentObj = this; //this should be "feeRate" object
+    let dtObj = parentObj["myOwnRawDataObj"];
+    let optimizeObj = {};
+    let private_getFeeRate = function (fId) {
+        let feeRateItemObj = optimizeObj["fee_rates_" + fId];
+        if (!feeRateItemObj) {
+            let rates = (dtObj.data._doc)?dtObj.data._doc.rates:dtObj.data.rates;
+            for (let feeItem of rates) {
+                if (fId === feeItem.ID) {
+                    optimizeObj["fee_rates_" + fId] = feeItem;
+                    feeRateItemObj = feeItem;
+                    break;
+                }
+            }
+        }
+        if (feeRateItemObj) {
+            rst.push(feeRateItemObj.rate);
+        } else {
+            rst.push(0);
+        }
+    };
+    if (fee_Ids instanceof Array) {
+        for (let fId of fee_Ids) {
+            private_getFeeRate(fId);
+        }
+    } else {
+        private_getFeeRate(fee_Ids);
+    }
+    optimizeObj = null;
+    return rst;
+}
+
+function ext_getArrayItemByKey(arrayKey, itemKey, itemKeyValue, itemRstKey){
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    let private_getItemValue = function (arr, dtlItKV) {
+        for (let item of arr) {
+            if (item[itemKey] === dtlItKV) {
+                if (itemRstKey) {
+                    rst.push(item[itemRstKey]);
+                } else {
+                    rst.push(item);
+                }
+                break;
+            }
+        }
+    };
+    let arr = dtObj[arrayKey];
+    if (arr && arr instanceof Array) {
+        if (itemKeyValue instanceof Array) {
+            for (let dtlItemKeyVal of itemKeyValue) {
+                private_getItemValue(arr, dtlItemKeyVal);
+            }
+        } else {
+            private_getItemValue(arr, itemKeyValue);
+        }
+    }
+
+}
+
 function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey) {
 function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey) {
     let rst = [], parentObj = this;
     let rst = [], parentObj = this;
     let IdKey = (adHocIdKey)?adHocIdKey:"ID";
     let IdKey = (adHocIdKey)?adHocIdKey:"ID";
@@ -468,6 +573,11 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey) {
                                 if (i === 0) {
                                 if (i === 0) {
                                     rstP = item[splitPKey[i]];
                                     rstP = item[splitPKey[i]];
                                 } else {
                                 } else {
+                                    if (splitPKey[i].indexOf("[") === 0 && splitPKey[i].indexOf("]") === (splitPKey[i].length - 1)) {
+                                        //考虑数组情况^_^!!!
+                                    } else {
+                                        //
+                                    }
                                     rstP = rstP[splitPKey[i]];
                                     rstP = rstP[splitPKey[i]];
                                 }
                                 }
                             }
                             }

+ 9 - 1
public/calc_util.js

@@ -268,6 +268,7 @@ class Calculation {
         private_compile_feeType();
         private_compile_feeType();
         private_compile_calcBase();
         private_compile_calcBase();
         me.compiledTemplates = {};
         me.compiledTemplates = {};
+        me.saveForReports = [];
     };
     };
 
 
     compileTemplate(template){
     compileTemplate(template){
@@ -341,8 +342,13 @@ class Calculation {
                 };
                 };
 
 
                 if (item.feeRateID) {
                 if (item.feeRateID) {
-                    var cmf = me.compiledFeeRates["feeRate_" + item.feeRateID];
+                    let orgFeeRate = item.feeRate;
+                    let cmf = me.compiledFeeRates["feeRate_" + item.feeRateID];
                     item.feeRate = cmf?cmf.rate:100;
                     item.feeRate = cmf?cmf.rate:100;
+
+                    if (!orgFeeRate || (orgFeeRate && orgFeeRate != item.feeRate)){
+                        me.saveForReports.push({templatesID: template.ID, calcItem: item});
+                    }
                 };
                 };
 
 
                 // 字段名映射
                 // 字段名映射
@@ -372,6 +378,8 @@ class Calculation {
         };
         };
     };
     };
 
 
+
+
     calculate($treeNode){
     calculate($treeNode){
         let me = this;
         let me = this;
         let templateID = $treeNode.data.programID;
         let templateID = $treeNode.data.programID;

+ 42 - 42
public/stringUtil.js

@@ -1,5 +1,5 @@
-var pinyin = (function (){
-    var Pinyin = function (ops){
+let pinyin = (function (){
+    let Pinyin = function (ops){
             this.initialize(ops);
             this.initialize(ops);
         },
         },
 
 
@@ -23,10 +23,10 @@ var pinyin = (function (){
 
 
         // 提取拼音, 返回首字母大写形式
         // 提取拼音, 返回首字母大写形式
         getFullChars: function(str){
         getFullChars: function(str){
-            var result = '', name;
-            var reg = new RegExp('[a-zA-Z0-9\- ]');
-            for (var i=0, len = str.length; i < len; i++){
-                var ch = str.substr(i,1), unicode = ch.charCodeAt(0);
+            let result = '', name;
+            let reg = new RegExp('[a-zA-Z0-9\- ]');
+            for (let i=0, len = str.length; i < len; i++){
+                let ch = str.substr(i,1), unicode = ch.charCodeAt(0);
                 if(unicode > 40869 || unicode < 19968){
                 if(unicode > 40869 || unicode < 19968){
                     result += ch;
                     result += ch;
                 }else{
                 }else{
@@ -43,10 +43,10 @@ var pinyin = (function (){
         getCamelChars: function(str){
         getCamelChars: function(str){
             if(typeof(str) !== 'string')
             if(typeof(str) !== 'string')
                 throw new Error(-1, "函数getFisrt需要字符串类型参数!");
                 throw new Error(-1, "函数getFisrt需要字符串类型参数!");
-            var chars = []; //保存中间结果的数组
-            for(var i=0,len=str.length; i < len; i++){
+            let chars = []; //保存中间结果的数组
+            for(let i=0,len=str.length; i < len; i++){
                 //获得unicode码
                 //获得unicode码
-                var ch = str.charAt(i);
+                let ch = str.charAt(i);
                 //检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理
                 //检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理
                 chars.push(this._getChar(ch));
                 chars.push(this._getChar(ch));
             }
             }
@@ -57,9 +57,9 @@ var pinyin = (function (){
 
 
         // 提取拼音
         // 提取拼音
         _getFullChar: function(str){
         _getFullChar: function(str){
-            for (var key in this.full_dict){
+            for (let key in this.full_dict){
                 if(-1 !== this.full_dict[key].indexOf(str)){
                 if(-1 !== this.full_dict[key].indexOf(str)){
-                    return this._capitalize(key); break;
+                    return this._capitalize(key);
                 }
                 }
             }
             }
             return false;
             return false;
@@ -68,14 +68,14 @@ var pinyin = (function (){
         // 首字母大写
         // 首字母大写
         _capitalize: function(str){
         _capitalize: function(str){
             if(str.length>0){
             if(str.length>0){
-                var first = str.substr(0,1).toUpperCase();
-                var spare = str.substr(1,str.length);
+                let first = str.substr(0,1).toUpperCase();
+                let spare = str.substr(1,str.length);
                 return first + spare;
                 return first + spare;
             }
             }
         },
         },
 
 
         _getChar: function(ch){
         _getChar: function(ch){
-            var unicode = ch.charCodeAt(0);
+            let unicode = ch.charCodeAt(0);
             //如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
             //如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
             if(unicode > 40869 || unicode < 19968)
             if(unicode > 40869 || unicode < 19968)
                 return ch; //dealWithOthers(ch);
                 return ch; //dealWithOthers(ch);
@@ -88,21 +88,21 @@ var pinyin = (function (){
         _getResult: function(chars){
         _getResult: function(chars){
             if(!this.options.checkPolyphone)
             if(!this.options.checkPolyphone)
                 return chars.join('');
                 return chars.join('');
-            var result = [''];
-            for(var i=0,len=chars.length;i<len;i++){
-                var str = chars[i], strlen = str.length;
+            let result = [''];
+            for(let i=0,len=chars.length;i<len;i++){
+                let str = chars[i], strlen = str.length;
                 if(strlen == 1){
                 if(strlen == 1){
-                    for(var j=0; j < result.length; j++){
+                    for(let j=0; j < result.length; j++){
                         result[k] += str;
                         result[k] += str;
                     }
                     }
                 }else{
                 }else{
-                    var swap1 = result.slice(0);
+                    let swap1 = result.slice(0);
                     result = [];
                     result = [];
-                    for(var j=0; j < strlen; j++){
+                    for(let j=0; j < strlen; j++){
                         //复制一个相同的arrRslt
                         //复制一个相同的arrRslt
-                        var swap2 = swap1.slice(0);
+                        let swap2 = swap1.slice(0);
                         //把当前字符str[k]添加到每个元素末尾
                         //把当前字符str[k]添加到每个元素末尾
-                        for(var k=0; k < swap2.length; k++){
+                        for(let k=0; k < swap2.length; k++){
                             swap2[k] += str.charAt(j);
                             swap2[k] += str.charAt(j);
                         }
                         }
                         //把复制并修改后的数组连接到arrRslt上
                         //把复制并修改后的数组连接到arrRslt上
@@ -115,8 +115,8 @@ var pinyin = (function (){
 
 
     };
     };
 
 
-    var extend = function(dst, src){
-        for(var property in src){
+    let extend = function(dst, src){
+        for(let property in src){
             dst[property] = src[property];
             dst[property] = src[property];
         }
         }
         return dst;
         return dst;
@@ -127,51 +127,51 @@ var pinyin = (function (){
 
 
 module.exports = {
 module.exports = {
     isEmptyString: function(str) {
     isEmptyString: function(str) {
-        var rst = false;
-        if (str == null || str == undefined) {
+        let rst = false;
+        if (str === null || str === undefined) {
             rst = true;
             rst = true;
         } else if (typeof str) {
         } else if (typeof str) {
-            var reg = /^\s*$/;
+            let reg = /^\s*$/;
             rst = reg.test(str);
             rst = reg.test(str);
         }
         }
         return rst;
         return rst;
     },
     },
     convertNumToChinese : function(num, isCurrency) {
     convertNumToChinese : function(num, isCurrency) {
         if (!/^\d*(\.\d*)?$/.test(num)) { return "Number is wrong!"; }
         if (!/^\d*(\.\d*)?$/.test(num)) { return "Number is wrong!"; }
-        var AA, BB;
+        let AA, BB;
         if (isCurrency) {
         if (isCurrency) {
-            AA = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
-            BB = new Array("", "拾", "佰", "仟", "萬", "億", "点", "");
+            AA = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
+            BB = ["", "拾", "佰", "仟", "萬", "億", "点", ""];
         } else {
         } else {
             AA = ['零','一','二','三','四','五','六','七','八','九'];
             AA = ['零','一','二','三','四','五','六','七','八','九'];
-            BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
+            BB = ["", "十", "百", "千", "万", "亿", "点", ""];
         }
         }
-        //var AA = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
-        //var BB = new Array("", "拾", "佰", "仟", "萬", "億", "点", "");
-        var a = ("" + num).replace(/(^0*)/g, "").split("."), k = 0, re = "";
-        for (var i = a[0].length - 1; i >= 0; i--) {
+        //let AA = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
+        //let BB = new Array("", "拾", "佰", "仟", "萬", "億", "点", "");
+        let a = ("" + num).replace(/(^0*)/g, "").split("."), k = 0, re = "";
+        for (let i = a[0].length - 1; i >= 0; i--) {
             switch (k) {
             switch (k) {
                 case 0: re = BB[7] + re; break;
                 case 0: re = BB[7] + re; break;
                 case 4: if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
                 case 4: if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
                     re = BB[4] + re; break;
                     re = BB[4] + re; break;
                 case 8: re = BB[5] + re; BB[7] = BB[5]; k = 0; break;
                 case 8: re = BB[5] + re; BB[7] = BB[5]; k = 0; break;
             }
             }
-            if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
-            if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re; k++;
+            if (k % 4 === 2 && a[0].charAt(i + 2) !== 0 && a[0].charAt(i + 1) === 0) re = AA[0] + re;
+            if (a[0].charAt(i) !== 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re; k++;
         }
         }
 
 
         if (a.length > 1) //加上小数部分(如果有小数部分)
         if (a.length > 1) //加上小数部分(如果有小数部分)
         {
         {
             re += BB[6];
             re += BB[6];
-            for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
+            for (let i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
         }
         }
         return re;
         return re;
     },
     },
     convertStrToBoolean: function(str) {
     convertStrToBoolean: function(str) {
-        var rst = false, me = this;
+        let rst = false, me = this;
         if (!me.isEmptyString(str)) {
         if (!me.isEmptyString(str)) {
-            var upperStr = str.toUpperCase();
-            if (upperStr == 'T' || upperStr == 'Y' || upperStr == 'YES' || upperStr == 'TRUE') {
+            let upperStr = str.toUpperCase();
+            if (upperStr === 'T' || upperStr === 'Y' || upperStr === 'YES' || upperStr === 'TRUE') {
                 rst = true;
                 rst = true;
             }
             }
         }
         }
@@ -183,4 +183,4 @@ module.exports = {
     getPinYinCamelChars: function(value) {
     getPinYinCamelChars: function(value) {
         return pinyin.getCamelChars(value);
         return pinyin.getCamelChars(value);
     }
     }
-}
+};

+ 1 - 0
public/web/sheet/sheet_common.js

@@ -9,6 +9,7 @@ var sheetCommonObj = {
         var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: SheetCount });
         var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: SheetCount });
         spreadBook.options.tabStripVisible = false;
         spreadBook.options.tabStripVisible = false;
         spreadBook.options.showHorizontalScrollbar = true;
         spreadBook.options.showHorizontalScrollbar = true;
+        spreadBook.options.showVerticalScrollbar = true;
         spreadBook.options.allowCopyPasteExcelStyle = false;
         spreadBook.options.allowCopyPasteExcelStyle = false;
         spreadBook.options.allowUserDragDrop = true;
         spreadBook.options.allowUserDragDrop = true;
         return spreadBook;
         return spreadBook;

+ 7 - 7
public/web/string_util_light.js

@@ -5,23 +5,23 @@
 
 
 let stringUtil = {
 let stringUtil = {
     isEmptyString: function(str) {
     isEmptyString: function(str) {
-        var rst = false;
-        if (str == null || str == undefined) {
+        let rst = false;
+        if (str === null || str === undefined) {
             rst = true;
             rst = true;
         } else if (typeof str) {
         } else if (typeof str) {
-            var reg = /^\s*$/;
+            let reg = /^\s*$/;
             rst = reg.test(str);
             rst = reg.test(str);
         }
         }
         return rst;
         return rst;
     },
     },
     convertStrToBoolean: function(str) {
     convertStrToBoolean: function(str) {
-        var rst = false, me = this;
+        let rst = false, me = this;
         if (!me.isEmptyString(str)) {
         if (!me.isEmptyString(str)) {
-            var upperStr = str.toUpperCase();
-            if (upperStr == 'T' || upperStr == 'Y' || upperStr == 'YES' || upperStr == 'TRUE') {
+            let upperStr = str.toUpperCase();
+            if (upperStr === 'T' || upperStr === 'Y' || upperStr === 'YES' || upperStr === 'TRUE') {
                 rst = true;
                 rst = true;
             }
             }
         }
         }
         return rst;
         return rst;
     }
     }
-}
+};

+ 10 - 3
test/unit/reports/test_tpl_09_1.js

@@ -38,8 +38,13 @@ let projectDataMdl = require('../../../modules/main/models/project');
 let demoPrjId = - 1;
 let demoPrjId = - 1;
 let demoRptId = 226, pagesize = "A4";
 let demoRptId = 226, pagesize = "A4";
 
 
-demoPrjId = 610; //QA: 建筑工程
 let userId_Leng = 1142; //小冷User Id
 let userId_Leng = 1142; //小冷User Id
+demoPrjId = 720; //QA: DW3
+/*/
+let userId_Dft = userId_Leng;
+/*/
+let userId_Dft = 76075;
+//*/
 
 
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
@@ -73,8 +78,10 @@ test('测试 - 获取project部分数据: ', function (t) {
     filter.push(projectConsts.BILLS);
     filter.push(projectConsts.BILLS);
     filter.push(projectConsts.RATION);
     filter.push(projectConsts.RATION);
     filter.push(projectConsts.RATION_GLJ);
     filter.push(projectConsts.RATION_GLJ);
+    filter.push(projectConsts.PROJECTGLJ);
     filter.push(projectConsts.FEERATE);
     filter.push(projectConsts.FEERATE);
-    prjMdl.project.getUserProject(userId_Leng, demoPrjId, function(err, msg, prjObj){
+    filter.push(projectConsts.CALC_PROGRAM);
+    prjMdl.project.getUserProject(userId_Dft, demoPrjId, function(err, msg, prjObj){
         if (!err) {
         if (!err) {
             projectDataMdl.getFilterData(demoPrjId, filter, function (results) {
             projectDataMdl.getFilterData(demoPrjId, filter, function (results) {
                 if (results) {
                 if (results) {
@@ -109,7 +116,7 @@ test('测试 - 测试模板啦: ', function (t) {
         let filter = rptDataUtil.getDataRequestFilter();
         let filter = rptDataUtil.getDataRequestFilter();
         console.log(filter);
         console.log(filter);
         //正常应该根据报表模板定义的数据类型来请求数据
         //正常应该根据报表模板定义的数据类型来请求数据
-        rptTplDataFacade.prepareProjectData(userId_Leng, demoPrjId, filter, function (err, msg, rawDataObj) {
+        rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
             if (!err) {
                 let tplData = rptDataUtil.assembleData(rawDataObj);
                 let tplData = rptDataUtil.assembleData(rawDataObj);
                 // fsUtil.wirteObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.js");
                 // fsUtil.wirteObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.js");

File diff suppressed because it is too large
+ 0 - 18062
tmp/07_1.page.js


+ 0 - 14
tmp/excel_test_raw_data/08-2/[Content_Types].xml

@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
-	<Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/>
-	<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>
-	<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
-	<Default Extension="xml" ContentType="application/xml"/>
-	<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>
-	<Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
-	<Override PartName="/xl/worksheets/sheet2.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
-	<Override PartName="/xl/worksheets/sheet3.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
-	<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
-	<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>
-	<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
-</Types>

+ 0 - 6
tmp/excel_test_raw_data/08-2/_rels/.rels

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
-	<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
-	<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
-	<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
-</Relationships>

+ 0 - 26
tmp/excel_test_raw_data/08-2/docProps/app.xml

@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
-	<Application>Microsoft Excel</Application>
-	<DocSecurity>0</DocSecurity>
-	<ScaleCrop>false</ScaleCrop>
-	<HeadingPairs>
-		<vt:vector size="2" baseType="variant">
-			<vt:variant>
-				<vt:lpstr>工作表</vt:lpstr>
-			</vt:variant>
-			<vt:variant>
-				<vt:i4>1</vt:i4>
-			</vt:variant>
-		</vt:vector>
-	</HeadingPairs>
-	<TitlesOfParts>
-		<vt:vector size="1" baseType="lpstr">
-			<vt:lpstr>第1页</vt:lpstr>
-		</vt:vector>
-	</TitlesOfParts>
-	<Company>OOCL</Company>
-	<LinksUpToDate>false</LinksUpToDate>
-	<SharedDoc>false</SharedDoc>
-	<HyperlinksChanged>false</HyperlinksChanged>
-	<AppVersion>12.0000</AppVersion>
-</Properties>

+ 0 - 7
tmp/excel_test_raw_data/08-2/docProps/core.xml

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<dc:creator>Tony</dc:creator>
-	<cp:lastModifiedBy>Tony</cp:lastModifiedBy>
-	<dcterms:created xsi:type="dcterms:W3CDTF">2011-05-14T09:11:44Z</dcterms:created>
-	<dcterms:modified xsi:type="dcterms:W3CDTF">2017-03-31T02:23:46Z</dcterms:modified>
-</cp:coreProperties>

+ 0 - 7
tmp/excel_test_raw_data/08-2/xl/_rels/workbook.xml.rels

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
-    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml" />
-    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml" />
-    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml" />
-    <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml" />
-</Relationships>

File diff suppressed because it is too large
+ 0 - 17365
tmp/excel_test_raw_data/08-2/xl/sharedStrings.xml


+ 0 - 205
tmp/excel_test_raw_data/08-2/xl/styles.xml

@@ -1,205 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
-	<fonts count="6">
-		<font>
-			<sz val="11"/>
-			<color theme="1"/>
-			<name val="宋体"/>
-			<charset val="134"/>
-			<scheme val="minor"/>
-		</font>
-		<font>
-			<sz val="9"/>
-			<name val="宋体"/>
-			<charset val="134"/>
-		</font>
-		<font>
-			<b/>
-			<sz val="20"/>
-			<color indexed="8"/>
-			<name val="smartSimSun"/>
-			<charset val="134"/>
-		</font>
-		<font>
-			<sz val="9"/>
-			<color indexed="8"/>
-			<name val="smartSimSun"/>
-			<charset val="134"/>
-		</font>
-		<font>
-			<sz val="9"/>
-			<color indexed="8"/>
-			<name val="宋体"/>
-			<charset val="134"/>
-		</font>
-		<font>
-			<sz val="12"/>
-			<color indexed="8"/>
-			<name val="宋体"/>
-			<charset val="134"/>
-		</font>
-	</fonts>
-	<fills count="2">
-		<fill>
-			<patternFill patternType="none"/>
-		</fill>
-		<fill>
-			<patternFill patternType="gray125"/>
-		</fill>
-	</fills>
-	<borders count="6">
-		<border>
-			<left/>
-			<right/>
-			<top/>
-			<bottom/>
-			<diagonal/>
-		</border>
-		<border>
-			<left/>
-			<right style="thin">
-				<color indexed="8"/>
-			</right>
-			<top style="thin">
-				<color indexed="8"/>
-			</top>
-			<bottom style="thin">
-				<color indexed="8"/>
-			</bottom>
-			<diagonal/>
-		</border>
-		<border>
-			<left style="thin">
-				<color indexed="8"/>
-			</left>
-			<right style="thin">
-				<color indexed="8"/>
-			</right>
-			<top style="thin">
-				<color indexed="8"/>
-			</top>
-			<bottom style="thin">
-				<color indexed="8"/>
-			</bottom>
-			<diagonal/>
-		</border>
-		<border>
-			<left style="thin">
-				<color indexed="8"/>
-			</left>
-			<right/>
-			<top style="thin">
-				<color indexed="8"/>
-			</top>
-			<bottom style="thin">
-				<color indexed="8"/>
-			</bottom>
-			<diagonal/>
-		</border>
-		<border>
-			<left style="thin">
-				<color indexed="8"/>
-			</left>
-			<right/>
-			<top style="thin">
-				<color indexed="8"/>
-			</top>
-			<bottom/>
-			<diagonal/>
-		</border>
-		<border>
-			<left style="thin">
-				<color indexed="8"/>
-			</left>
-			<right/>
-			<top/>
-			<bottom/>
-			<diagonal/>
-		</border>
-	</borders>
-	<cellStyleXfs count="1">
-		<xf numFmtId="0" fontId="0" fillId="0" borderId="0">
-			<alignment vertical="center"/>
-		</xf>
-	</cellStyleXfs>
-	<cellXfs count="19">
-		<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0">
-			<alignment vertical="center"/>
-		</xf>
-		<xf numFmtId="0" fontId="2" fillId="0" borderId="0" xfId="0" applyFont="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="0" xfId="0" applyFont="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="left" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="1" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" wrapText="1" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="2" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="2" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="left" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="2" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="2" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="right" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="3" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="4" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="5" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="1" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="3" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="right" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="4" fillId="0" borderId="0" xfId="0" applyFont="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="left" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="1" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="5" fillId="0" borderId="2" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="5" fillId="0" borderId="3" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="center" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="2" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="right" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-		<xf numFmtId="0" fontId="3" fillId="0" borderId="3" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1" applyProtection="1">
-			<alignment horizontal="right" vertical="center" shrinkToFit="1"/>
-			<protection locked="0"/>
-		</xf>
-	</cellXfs>
-	<cellStyles count="1"><cellStyle name="常规" xfId="0" builtinId="0"/></cellStyles>
-	<dxfs count="0"/>
-	<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/>
-</styleSheet>

+ 0 - 281
tmp/excel_test_raw_data/08-2/xl/theme/theme1.xml

@@ -1,281 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office 主题">
-    <a:themeElements>
-        <a:clrScheme name="Office">
-            <a:dk1>
-                <a:sysClr val="windowText" lastClr="000000" />
-            </a:dk1>
-            <a:lt1>
-                <a:sysClr val="window" lastClr="FFFFFF" />
-            </a:lt1>
-            <a:dk2>
-                <a:srgbClr val="1F497D" />
-            </a:dk2>
-            <a:lt2>
-                <a:srgbClr val="EEECE1" />
-            </a:lt2>
-            <a:accent1>
-                <a:srgbClr val="4F81BD" />
-            </a:accent1>
-            <a:accent2>
-                <a:srgbClr val="C0504D" />
-            </a:accent2>
-            <a:accent3>
-                <a:srgbClr val="9BBB59" />
-            </a:accent3>
-            <a:accent4>
-                <a:srgbClr val="8064A2" />
-            </a:accent4>
-            <a:accent5>
-                <a:srgbClr val="4BACC6" />
-            </a:accent5>
-            <a:accent6>
-                <a:srgbClr val="F79646" />
-            </a:accent6>
-            <a:hlink>
-                <a:srgbClr val="0000FF" />
-            </a:hlink>
-            <a:folHlink>
-                <a:srgbClr val="800080" />
-            </a:folHlink>
-        </a:clrScheme>
-        <a:fontScheme name="Office">
-            <a:majorFont>
-                <a:latin typeface="Cambria" />
-                <a:ea typeface="" />
-                <a:cs typeface="" />
-                <a:font script="Jpan" typeface="MS Pゴシック" />
-                <a:font script="Hang" typeface="맑은 고딕" />
-                <a:font script="Hans" typeface="宋体" />
-                <a:font script="Hant" typeface="新細明體" />
-                <a:font script="Arab" typeface="Times New Roman" />
-                <a:font script="Hebr" typeface="Times New Roman" />
-                <a:font script="Thai" typeface="Tahoma" />
-                <a:font script="Ethi" typeface="Nyala" />
-                <a:font script="Beng" typeface="Vrinda" />
-                <a:font script="Gujr" typeface="Shruti" />
-                <a:font script="Khmr" typeface="MoolBoran" />
-                <a:font script="Knda" typeface="Tunga" />
-                <a:font script="Guru" typeface="Raavi" />
-                <a:font script="Cans" typeface="Euphemia" />
-                <a:font script="Cher" typeface="Plantagenet Cherokee" />
-                <a:font script="Yiii" typeface="Microsoft Yi Baiti" />
-                <a:font script="Tibt" typeface="Microsoft Himalaya" />
-                <a:font script="Thaa" typeface="MV Boli" />
-                <a:font script="Deva" typeface="Mangal" />
-                <a:font script="Telu" typeface="Gautami" />
-                <a:font script="Taml" typeface="Latha" />
-                <a:font script="Syrc" typeface="Estrangelo Edessa" />
-                <a:font script="Orya" typeface="Kalinga" />
-                <a:font script="Mlym" typeface="Kartika" />
-                <a:font script="Laoo" typeface="DokChampa" />
-                <a:font script="Sinh" typeface="Iskoola Pota" />
-                <a:font script="Mong" typeface="Mongolian Baiti" />
-                <a:font script="Viet" typeface="Times New Roman" />
-                <a:font script="Uigh" typeface="Microsoft Uighur" />
-            </a:majorFont>
-            <a:minorFont>
-                <a:latin typeface="Calibri" />
-                <a:ea typeface="" />
-                <a:cs typeface="" />
-                <a:font script="Jpan" typeface="MS Pゴシック" />
-                <a:font script="Hang" typeface="맑은 고딕" />
-                <a:font script="Hans" typeface="宋体" />
-                <a:font script="Hant" typeface="新細明體" />
-                <a:font script="Arab" typeface="Arial" />
-                <a:font script="Hebr" typeface="Arial" />
-                <a:font script="Thai" typeface="Tahoma" />
-                <a:font script="Ethi" typeface="Nyala" />
-                <a:font script="Beng" typeface="Vrinda" />
-                <a:font script="Gujr" typeface="Shruti" />
-                <a:font script="Khmr" typeface="DaunPenh" />
-                <a:font script="Knda" typeface="Tunga" />
-                <a:font script="Guru" typeface="Raavi" />
-                <a:font script="Cans" typeface="Euphemia" />
-                <a:font script="Cher" typeface="Plantagenet Cherokee" />
-                <a:font script="Yiii" typeface="Microsoft Yi Baiti" />
-                <a:font script="Tibt" typeface="Microsoft Himalaya" />
-                <a:font script="Thaa" typeface="MV Boli" />
-                <a:font script="Deva" typeface="Mangal" />
-                <a:font script="Telu" typeface="Gautami" />
-                <a:font script="Taml" typeface="Latha" />
-                <a:font script="Syrc" typeface="Estrangelo Edessa" />
-                <a:font script="Orya" typeface="Kalinga" />
-                <a:font script="Mlym" typeface="Kartika" />
-                <a:font script="Laoo" typeface="DokChampa" />
-                <a:font script="Sinh" typeface="Iskoola Pota" />
-                <a:font script="Mong" typeface="Mongolian Baiti" />
-                <a:font script="Viet" typeface="Arial" />
-                <a:font script="Uigh" typeface="Microsoft Uighur" />
-            </a:minorFont>
-        </a:fontScheme>
-        <a:fmtScheme name="Office">
-            <a:fillStyleLst>
-                <a:solidFill>
-                    <a:schemeClr val="phClr" />
-                </a:solidFill>
-                <a:gradFill rotWithShape="1">
-                    <a:gsLst>
-                        <a:gs pos="0">
-                            <a:schemeClr val="phClr">
-                                <a:tint val="50000" />
-                                <a:satMod val="300000" />
-                            </a:schemeClr>
-                        </a:gs>
-                        <a:gs pos="35000">
-                            <a:schemeClr val="phClr">
-                                <a:tint val="37000" />
-                                <a:satMod val="300000" />
-                            </a:schemeClr>
-                        </a:gs>
-                        <a:gs pos="100000">
-                            <a:schemeClr val="phClr">
-                                <a:tint val="15000" />
-                                <a:satMod val="350000" />
-                            </a:schemeClr>
-                        </a:gs>
-                    </a:gsLst>
-                    <a:lin ang="16200000" scaled="1" />
-                </a:gradFill>
-                <a:gradFill rotWithShape="1">
-                    <a:gsLst>
-                        <a:gs pos="0">
-                            <a:schemeClr val="phClr">
-                                <a:shade val="51000" />
-                                <a:satMod val="130000" />
-                            </a:schemeClr>
-                        </a:gs>
-                        <a:gs pos="80000">
-                            <a:schemeClr val="phClr">
-                                <a:shade val="93000" />
-                                <a:satMod val="130000" />
-                            </a:schemeClr>
-                        </a:gs>
-                        <a:gs pos="100000">
-                            <a:schemeClr val="phClr">
-                                <a:shade val="94000" />
-                                <a:satMod val="135000" />
-                            </a:schemeClr>
-                        </a:gs>
-                    </a:gsLst>
-                    <a:lin ang="16200000" scaled="0" />
-                </a:gradFill>
-            </a:fillStyleLst>
-            <a:lnStyleLst>
-                <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr">
-                    <a:solidFill>
-                        <a:schemeClr val="phClr">
-                            <a:shade val="95000" />
-                            <a:satMod val="105000" />
-                        </a:schemeClr>
-                    </a:solidFill>
-                    <a:prstDash val="solid" />
-                </a:ln>
-                <a:ln w="25400" cap="flat" cmpd="sng" algn="ctr">
-                    <a:solidFill>
-                        <a:schemeClr val="phClr" />
-                    </a:solidFill>
-                    <a:prstDash val="solid" />
-                </a:ln>
-                <a:ln w="38100" cap="flat" cmpd="sng" algn="ctr">
-                    <a:solidFill>
-                        <a:schemeClr val="phClr" />
-                    </a:solidFill>
-                    <a:prstDash val="solid" />
-                </a:ln>
-            </a:lnStyleLst>
-            <a:effectStyleLst>
-                <a:effectStyle>
-                    <a:effectLst>
-                        <a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0">
-                            <a:srgbClr val="000000">
-                                <a:alpha val="38000" />
-                            </a:srgbClr>
-                        </a:outerShdw>
-                    </a:effectLst>
-                </a:effectStyle>
-                <a:effectStyle>
-                    <a:effectLst>
-                        <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0">
-                            <a:srgbClr val="000000">
-                                <a:alpha val="35000" />
-                            </a:srgbClr>
-                        </a:outerShdw>
-                    </a:effectLst>
-                </a:effectStyle>
-                <a:effectStyle>
-                    <a:effectLst>
-                        <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0">
-                            <a:srgbClr val="000000">
-                                <a:alpha val="35000" />
-                            </a:srgbClr>
-                        </a:outerShdw>
-                    </a:effectLst>
-                    <a:scene3d>
-                        <a:camera prst="orthographicFront">
-                            <a:rot lat="0" lon="0" rev="0" />
-                        </a:camera>
-                        <a:lightRig rig="threePt" dir="t">
-                            <a:rot lat="0" lon="0" rev="1200000" />
-                        </a:lightRig>
-                    </a:scene3d>
-                    <a:sp3d>
-                        <a:bevelT w="63500" h="25400" />
-                    </a:sp3d>
-                </a:effectStyle>
-            </a:effectStyleLst>
-            <a:bgFillStyleLst>
-                <a:solidFill>
-                    <a:schemeClr val="phClr" />
-                </a:solidFill>
-                <a:gradFill rotWithShape="1">
-                    <a:gsLst>
-                        <a:gs pos="0">
-                            <a:schemeClr val="phClr">
-                                <a:tint val="40000" />
-                                <a:satMod val="350000" />
-                            </a:schemeClr>
-                        </a:gs>
-                        <a:gs pos="40000">
-                            <a:schemeClr val="phClr">
-                                <a:tint val="45000" />
-                                <a:shade val="99000" />
-                                <a:satMod val="350000" />
-                            </a:schemeClr>
-                        </a:gs>
-                        <a:gs pos="100000">
-                            <a:schemeClr val="phClr">
-                                <a:shade val="20000" />
-                                <a:satMod val="255000" />
-                            </a:schemeClr>
-                        </a:gs>
-                    </a:gsLst>
-                    <a:path path="circle">
-                        <a:fillToRect l="50000" t="-80000" r="50000" b="180000" />
-                    </a:path>
-                </a:gradFill>
-                <a:gradFill rotWithShape="1">
-                    <a:gsLst>
-                        <a:gs pos="0">
-                            <a:schemeClr val="phClr">
-                                <a:tint val="80000" />
-                                <a:satMod val="300000" />
-                            </a:schemeClr>
-                        </a:gs>
-                        <a:gs pos="100000">
-                            <a:schemeClr val="phClr">
-                                <a:shade val="30000" />
-                                <a:satMod val="200000" />
-                            </a:schemeClr>
-                        </a:gs>
-                    </a:gsLst>
-                    <a:path path="circle">
-                        <a:fillToRect l="50000" t="50000" r="50000" b="50000" />
-                    </a:path>
-                </a:gradFill>
-            </a:bgFillStyleLst>
-        </a:fmtScheme>
-    </a:themeElements>
-    <a:objectDefaults />
-    <a:extraClrSchemeLst />
-</a:theme>

+ 0 - 12
tmp/excel_test_raw_data/08-2/xl/workbook.xml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
-	<fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505"/>
-	<workbookPr defaultThemeVersion="124226"/>
-	<bookViews>
-		<workbookView xWindow="360" yWindow="345" windowWidth="14655" windowHeight="4305"/>
-	</bookViews>
-	<sheets>
-		<sheet name="第1页" sheetId="1" r:id="rId1"/>
-	</sheets>
-	<calcPr calcId="124519"/>
-</workbook>

File diff suppressed because it is too large
+ 0 - 151683
tmp/excel_test_raw_data/08-2/xl/worksheets/sheet1.xml


+ 2 - 7
web/building_saas/css/main.css

@@ -105,7 +105,7 @@ body {
   width:0%;
   width:0%;
 }
 }
 .sidebar-bottom,.sidebar-bottom .col-lg-6,.sidebar-bottom .col-lg-12 {
 .sidebar-bottom,.sidebar-bottom .col-lg-6,.sidebar-bottom .col-lg-12 {
-  height:200px
+  height:300px
 }
 }
 .top-content, .fluid-content {
 .top-content, .fluid-content {
     overflow: auto;
     overflow: auto;
@@ -234,7 +234,7 @@ body {
     }
     }
 }
 }
 .bottom-content .tab-content .main-data-bottom{
 .bottom-content .tab-content .main-data-bottom{
-    height: 200px;
+    height: 300px;
     overflow: auto;
     overflow: auto;
 }
 }
 .bottom-content .tab-content .ovf-hidden{
 .bottom-content .tab-content .ovf-hidden{
@@ -309,8 +309,3 @@ body {
   max-width: 200px;
   max-width: 200px;
   display: inline-block;
   display: inline-block;
 }
 }
-.gc-column-header-cell{
-    text-align: center!important;
-}
-.modal-lg{max-width: 1000px}
-.modal-feeRate {max-width: 550px}

+ 3 - 2
web/building_saas/glj/js/common_spread.js

@@ -29,11 +29,12 @@ function CommonSpreadJs (header) {
 CommonSpreadJs.prototype.init = function(target) {
 CommonSpreadJs.prototype.init = function(target) {
 
 
     let setting = {
     let setting = {
-        header: []
+        header: [],
+        view:{rowHeaderWidth:35}
     };
     };
     this.columnInfo = [];
     this.columnInfo = [];
     for(let tmp of this.header) {
     for(let tmp of this.header) {
-        let width = tmp.field === 'name' ? 200 : 120;
+        let width = tmp.width==undefined ? 120 : tmp.width;
         setting.header.push({headerName: tmp.name, headerWidth: width});
         setting.header.push({headerName: tmp.name, headerWidth: width});
         this.columnInfo.push({name: tmp.field, displayName: tmp.name, visible: tmp.visible, cellType: tmp.cellType, size: width});
         this.columnInfo.push({name: tmp.field, displayName: tmp.name, visible: tmp.visible, cellType: tmp.cellType, size: width});
     }
     }

+ 2 - 1
web/building_saas/glj/js/project_glj.js

@@ -19,6 +19,7 @@ let GLJTypeConst = [];
 // spreadjs载入数据所需
 // spreadjs载入数据所需
 let jsonData = [];
 let jsonData = [];
 let mixRatioConnectData = [];
 let mixRatioConnectData = [];
+let mixRatioMap={};
 // 单价文件相关
 // 单价文件相关
 let usedUnitPriceInfo = {};
 let usedUnitPriceInfo = {};
 let otherFileData = {};
 let otherFileData = {};
@@ -215,7 +216,7 @@ function init() {
                 jsonData = tmpData;
                 jsonData = tmpData;
             }
             }
             mixRatioConnectData = data.mixRatioConnectData !== undefined ? data.mixRatioConnectData : mixRatioConnectData;
             mixRatioConnectData = data.mixRatioConnectData !== undefined ? data.mixRatioConnectData : mixRatioConnectData;
-
+            mixRatioMap = data.mixRatioMap !== undefined ? data.mixRatioMap : mixRatioMap;
             host = data.constData.hostname !== undefined ? data.constData.hostname : '';
             host = data.constData.hostname !== undefined ? data.constData.hostname : '';
             materialIdList = data.constData.materialIdList !== undefined ? data.constData.materialIdList : materialIdList;
             materialIdList = data.constData.materialIdList !== undefined ? data.constData.materialIdList : materialIdList;
             roomId = data.constData.roomId !== undefined ? data.constData.roomId : roomId;
             roomId = data.constData.roomId !== undefined ? data.constData.roomId : roomId;

+ 16 - 14
web/building_saas/glj/js/project_glj_spread.js

@@ -40,34 +40,36 @@ ProjectGLJSpread.prototype.init = function () {
     selectBox.items(supplySelect);
     selectBox.items(supplySelect);
     selectBox.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
     selectBox.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
     let header = [
     let header = [
-        {name: '编码', field: 'code', visible: true},
-        {name: '名称', field: 'name', visible: true},
-        {name: '规格型号', field: 'specs', visible: true},
-        {name: '单位', field: 'unit', visible: true},
-        {name: '类型', field: 'unit_price.short_name', visible: true},
+        {name: '编码', field: 'code', visible: true,width:80},
+        {name: '名称', field: 'name', visible: true,width:100},
+        {name: '规格型号', field: 'specs', visible: true,width:120},
+        {name: '单位', field: 'unit', visible: true,width:45},
+        {name: '类型', field: 'unit_price.short_name', visible: true,width:45},
         {name: 'ID', field: 'id', visible: false},
         {name: 'ID', field: 'id', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
-        {name: '总消耗量', field: 'quantity', visible: true},
-        {name: '基价单价', field: "unit_price.base_price", visible: true},
-        {name: '调整基价', field: 'adjust_price', visible: true},
-        {name: '市场单价', field: "unit_price.market_price", visible: true, validator: 'number'},
+        {name: '总消耗量', field: 'quantity', visible: true,width:100},
+        {name: '基价单价', field: "unit_price.base_price", visible: true,width:70},
+        {name: '调整基价', field: 'adjust_price', visible: true,width:70},
+        {name: '市场单价', field: "unit_price.market_price", visible: true, validator: 'number',width:70},
         {
         {
             name: '是否暂估',
             name: '是否暂估',
             field: 'is_evaluate',
             field: 'is_evaluate',
             visible: true,
             visible: true,
             cellType: new GC.Spread.Sheets.CellTypes.CheckBox(),
             cellType: new GC.Spread.Sheets.CellTypes.CheckBox(),
             validator: 'boolean'
             validator: 'boolean'
+            ,width:40
         },
         },
-        {name: '供货方式', field: 'supply', visible: true, cellType: selectBox},
-        {name: '甲供数量', field: 'supply_quantity', visible: true},
-        {name: '交货方式', field: 'delivery', visible: true},
-        {name: '送达地点', field: 'delivery_address', visible: true},
+        {name: '供货方式', field: 'supply', visible: true, cellType: selectBox,width:80},
+        {name: '甲供数量', field: 'supply_quantity', visible: true,width:100},
+        {name: '交货方式', field: 'delivery', visible: true,width:90},
+        {name: '送达地点', field: 'delivery_address', visible: true,width:100},
         {
         {
             name: '不调价',
             name: '不调价',
             field: 'is_adjust_price',
             field: 'is_adjust_price',
             visible: true,
             visible: true,
             cellType: new GC.Spread.Sheets.CellTypes.CheckBox(),
             cellType: new GC.Spread.Sheets.CellTypes.CheckBox(),
-            validator: 'boolean'
+            validator: 'boolean',
+            width:40
         },
         },
         {name: 'UID', field: 'unit_price.id', visible: false},
         {name: 'UID', field: 'unit_price.id', visible: false},
         {name: '工料机ID', field: 'glj_id', visible: false},
         {name: '工料机ID', field: 'glj_id', visible: false},

+ 2 - 2
web/building_saas/js/global.js

@@ -6,8 +6,8 @@ function autoFlashHeight(){
     var bottomContentHeight = $(".bottom-content").height();
     var bottomContentHeight = $(".bottom-content").height();
     var toolsBarHeightQ = $(".tools-bar-height-q").height();
     var toolsBarHeightQ = $(".tools-bar-height-q").height();
     var toolsBarHeightD = $(".tools-bar-height-d").height();
     var toolsBarHeightD = $(".tools-bar-height-d").height();
-    $(".main-data-side-q").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightQ-202);
-    $(".main-data-side-d").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightD-202);
+    $(".main-data-side-q").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightQ-302);
+    $(".main-data-side-d").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightD-302);
     $(".main-data-top").height($(window).height()-headerHeight-toolsbarHeight-bottomContentHeight-1);
     $(".main-data-top").height($(window).height()-headerHeight-toolsbarHeight-bottomContentHeight-1);
     $(".main-data-full").height($(window).height()-headerHeight-toolsbarHeight-1);
     $(".main-data-full").height($(window).height()-headerHeight-toolsbarHeight-1);
     $(".main-data-full-fl").height($(window).height()-headerHeight-toolsbarHeight-37);
     $(".main-data-full-fl").height($(window).height()-headerHeight-toolsbarHeight-37);

+ 1 - 1
web/building_saas/main/html/calc_program_manage.html

@@ -9,7 +9,7 @@
 
 
 <body>
 <body>
 <div style="">
 <div style="">
-    <img id="f_btn" src="/web/dest/css/img/feeRate_btn.jpg" alt="" style="display: block" />
+    <img id="f_btn" src="/web/dest/css/img/feeRate_btn.jpg" alt="" style="display: none" />
 </div>
 </div>
     <div class="toolsbar px-1">
     <div class="toolsbar px-1">
     </div>
     </div>

+ 1 - 1
web/building_saas/main/html/main.html

@@ -434,7 +434,7 @@
                         <span aria-hidden="true">&times;</span>
                         <span aria-hidden="true">&times;</span>
                     </button>
                     </button>
                 </div>
                 </div>
-                <div class="modal-body modal-auto-height" id="col_setting_spread" style="height: 130px; overflow: hidden;">
+                <div class="modal-body modal-auto-height" id="col_setting_spread" style="overflow: hidden;">
                 </div>
                 </div>
                 <div class="modal-footer">
                 <div class="modal-footer">
                     <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
                     <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>

+ 6 - 2
web/building_saas/main/js/controllers/project_controller.js

@@ -22,7 +22,7 @@ ProjectController = {
         if (target) {
         if (target) {
             console.log(target.depth());
             console.log(target.depth());
             parentID = target.depth() === 0 ? target.source.getID() : target.source.getParentID();
             parentID = target.depth() === 0 ? target.source.getID() : target.source.getParentID();
-            nextSiblingID = target ? target.source.getNextSiblingID() : project.Bills.tree.setting.rootId;
+            nextSiblingID = target.depth() === 0 ? project.Bills.tree.setting.rootId : target.source.getNextSiblingID();
 
 
             if (std) {
             if (std) {
                 let newCode = project.Bills.newFormatCode(std.code);
                 let newCode = project.Bills.newFormatCode(std.code);
@@ -30,7 +30,11 @@ ProjectController = {
             } else {
             } else {
                 newSource = project.Bills.insertBills(parentID, nextSiblingID);
                 newSource = project.Bills.insertBills(parentID, nextSiblingID);
             }
             }
-            newNode = project.mainTree.insert(target.depth() === 0 ? target.getID() : target.getParentID(), target.getNextSiblingID());
+            if (target.depth() === 0) {
+                newNode = project.mainTree.insert(target.getID(), project.mainTree.rootID())
+            } else {
+                newNode = project.mainTree.insert(target.getParentID(), target.getNextSiblingID());
+            }
         } else {
         } else {
             alert('不可添加清单');
             alert('不可添加清单');
         }
         }

+ 12 - 1
web/building_saas/main/js/models/calc_program.js

@@ -27,6 +27,7 @@ class CalcProgram {
         }
         }
     };
     };
 
 
+    // 经测试,全部编译一次耗时0.003~0.004秒。耗时基本忽略不计。
     compileAllTemps(){
     compileAllTemps(){
         let calcFeeRates = this.project.FeeRate.datas.rates;
         let calcFeeRates = this.project.FeeRate.datas.rates;
         let calcLabourCoes = this.project.labourCoe.datas.coes;
         let calcLabourCoes = this.project.labourCoe.datas.coes;
@@ -36,11 +37,21 @@ class CalcProgram {
         for (let ct of calcTemplates){
         for (let ct of calcTemplates){
             this.calc.compileTemplate(ct);
             this.calc.compileTemplate(ct);
         };
         };
+
+        // 存储费率临时数据,报表用。
+        if (this.calc.saveForReports.length > 0){
+            let saveDatas = {};
+            saveDatas.projectID = projectInfoObj.projectInfo.ID;
+            saveDatas.calcItems = this.calc.saveForReports;
+            CommonAjax.post('/calcProgram/saveCalcItems', saveDatas, function (data) {
+                this.calc.saveForReports = [];
+            });
+        };
     };
     };
 
 
     calculate(treeNode){
     calculate(treeNode){
         treeNode.data.gljList = this.project.ration_glj.getGljArrByRation(treeNode.data.ID);
         treeNode.data.gljList = this.project.ration_glj.getGljArrByRation(treeNode.data.ID);
         this.calc.calculate(treeNode);
         this.calc.calculate(treeNode);
         projectObj.mainController.refreshTreeNode([treeNode]);
         projectObj.mainController.refreshTreeNode([treeNode]);
-    };
+    }
 }
 }

+ 1 - 0
web/building_saas/main/js/models/project.js

@@ -162,6 +162,7 @@ var PROJECT = {
             };
             };
             loadIdTreeNode(this.Bills.tree.roots, null);
             loadIdTreeNode(this.Bills.tree.roots, null);
             this.mainTree.sortTreeItems();
             this.mainTree.sortTreeItems();
+            this.mainTree.selected = this.mainTree.firstNode();
         };
         };
 
 
         project.prototype.getParentTarget = function (node, targetField, targetValue) {
         project.prototype.getParentTarget = function (node, targetField, targetValue) {

+ 7 - 0
web/building_saas/main/js/models/ration.js

@@ -339,6 +339,13 @@ var Ration = {
 
 
             this.project.endUpdate();
             this.project.endUpdate();
         };
         };
+
+        ration.prototype.calcAll = function (){
+            for (let ration of this.datas){
+                let node = this.project.mainTree.findNode(ration.ID);
+                 this.project.calcProgram.calculate(node);
+            };
+        };
         
         
         return new ration(project);
         return new ration(project);
     }
     }

+ 5 - 4
web/building_saas/main/js/views/fee_rate_view.js

@@ -214,8 +214,8 @@ var feeRateObject={
                 ctx.restore();
                 ctx.restore();
             }
             }
             else {
             else {
-                x--;
-                y += h / 2 - 3;
+               // x--;
+                //y += h / 2 - 3;
                 ctx.save();
                 ctx.save();
                 ctx.restore();
                 ctx.restore();
             }
             }
@@ -235,7 +235,7 @@ var feeRateObject={
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
             var level = hitinfo.sheet.rowOutlines.getLevel(hitinfo.row);
             var level = hitinfo.sheet.rowOutlines.getLevel(hitinfo.row);
             var hoffset = (level + 2) * 12 + hitinfo.cellRect.x;
             var hoffset = (level + 2) * 12 + hitinfo.cellRect.x;
-            if (hitinfo.x < hoffset && hitinfo.x > hoffset - 10) {
+            if (level==-1&&hitinfo.x < hoffset && hitinfo.x > hoffset - 10) {
                 var collapsed = hitinfo.sheet.rowOutlines.isCollapsed(hitinfo.row + 1);
                 var collapsed = hitinfo.sheet.rowOutlines.isCollapsed(hitinfo.row + 1);
                 hitinfo.sheet.rowOutlines.setCollapsed(hitinfo.row, !collapsed);
                 hitinfo.sheet.rowOutlines.setCollapsed(hitinfo.row, !collapsed);
                 hitinfo.sheet.invalidateLayout();
                 hitinfo.sheet.invalidateLayout();
@@ -252,7 +252,8 @@ var feeRateObject={
         FeeRateEditCellType.prototype = new ns.CellTypes.Text();
         FeeRateEditCellType.prototype = new ns.CellTypes.Text();
         FeeRateEditCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
         FeeRateEditCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
             if(value!=null){
             if(value!=null){
-                ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3);
+               // ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3);
+                ctx.fillText(value,x+w,y+h-3);
             }
             }
             if(feeRateObject.editingCell){
             if(feeRateObject.editingCell){
                 if(feeRateObject.editingCell.row==options.row&&feeRateObject.editingCell.col==options.col){
                 if(feeRateObject.editingCell.row==options.row&&feeRateObject.editingCell.col==options.col){

+ 174 - 14
web/building_saas/main/js/views/glj_view.js

@@ -307,6 +307,8 @@ var gljOprObj = {
             var index= _.indexOf(me.setting.notEditedType,type);
             var index= _.indexOf(me.setting.notEditedType,type);
             if(index!=-1){
             if(index!=-1){
                 me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(true);
                 me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(true);
+            }else {
+                me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(false);
             }
             }
         }
         }
     },
     },
@@ -487,7 +489,6 @@ var gljOprObj = {
         return rowstr;
         return rowstr;
 
 
     },
     },
-
     showDataIfRationSelect:function (node) {
     showDataIfRationSelect:function (node) {
         var isShow = false;
         var isShow = false;
         if(node){
         if(node){
@@ -526,9 +527,25 @@ var gljOprObj = {
             this.showInSheet(gljList);
             this.showInSheet(gljList);
         }
         }
     },
     },
-    showRationGLJSheetData:function () {
-        this.sheetData=_.sortBy(this.sheetData,'type');
+    showRationGLJSheetData:function (init) {
+        this.sheet.getRange(0,-1,this.sheet.getRowCount(),-1).visible(true);
+        if(init){
+            this.sheetData=_.sortBy(this.sheetData,'type');
+            this.addMixRatioToShow();
+            this.initRationTree();
+        }
         sheetCommonObj.showData(this.sheet,this.setting,this.sheetData);
         sheetCommonObj.showData(this.sheet,this.setting,this.sheetData);
+
+    },
+    initRationTree:function () {
+        this.sheet.getRange(-1, 0, -1, 1).cellType(this.getTreeNodeCellType(this.sheetData));
+        for(var i =0;i<this.sheetData.length;i++){
+            if(this.sheetData[i].hasOwnProperty('subList')){
+                this.sheet.setTag(i,0,true);
+                this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).visible(false);
+                this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).locked(true);
+            }
+        }
     },
     },
     filterGljByRation:function (ration,datas) {
     filterGljByRation:function (ration,datas) {
         var gljList=[];
         var gljList=[];
@@ -539,24 +556,62 @@ var gljOprObj = {
     },
     },
     showInSheet:function(gljList){
     showInSheet:function(gljList){
         this.sheetData=this.combineWithProjectGlj(gljList);
         this.sheetData=this.combineWithProjectGlj(gljList);
-        this.showRationGLJSheetData();
+        this.showRationGLJSheetData(true);
+    },
+    addMixRatioToShow:function () {
+        var newList=[];
+      for(var i =0;i<this.sheetData.length;i++){
+          newList.push(this.sheetData[i]);
+          if(this.sheetData[i].hasOwnProperty('subList')){
+                newList = newList.concat(this.sheetData[i].subList);
+          }
+      }
+        this.sheetData= newList;
     },
     },
     combineWithProjectGlj:function (ration_gljs) {
     combineWithProjectGlj:function (ration_gljs) {
-        var projectGljs = projectObj.project.projectGLJ.datas.gljList;
+        var projectGLJData = projectObj.project.projectGLJ.datas;
+        var projectGljs = projectGLJData.gljList;
+        var mixRatioMap = projectGLJData.mixRatioMap;
         if(ration_gljs&&ration_gljs.length>0&&projectGljs&&projectGljs.length>0){
         if(ration_gljs&&ration_gljs.length>0&&projectGljs&&projectGljs.length>0){
-            ration_gljs.forEach(function (a) {
-                var glj = _.find(projectGljs,{id:a.projectGLJID});
+            for(var i =0;i<ration_gljs.length;i++){
+                var glj = _.find(projectGljs,{'id':ration_gljs[i].projectGLJID});
                 if(glj){
                 if(glj){
-                    a.basePrice=glj.unit_price.base_price;
-                    a.marketPrice=glj.unit_price.market_price;
-                    a.adjustPrice=glj.adjust_price;
-                    a.isEstimate=glj.is_evaluate;
+                    ration_gljs[i].basePrice=glj.unit_price.base_price;
+                    ration_gljs[i].marketPrice=glj.unit_price.market_price;
+                    ration_gljs[i].adjustPrice=glj.adjust_price;
+                    ration_gljs[i].isEstimate=glj.is_evaluate;
+                    if(mixRatioMap.hasOwnProperty(glj.code)){
+                        var mixRatios = this.getMixRationShowDatas(mixRatioMap[glj.code],projectGljs);
+                        ration_gljs[i].subList = mixRatios;
+                    }
                 }
                 }
-            })
+            }
         }
         }
         return ration_gljs;
         return ration_gljs;
-    }
-    ,
+    },
+    getMixRationShowDatas:function (mixRatioList,projectGljs) {
+        var temRationGLJs = [];
+        for(var i =0;i<mixRatioList.length;i++){
+            var pg =  _.find(projectGljs,{'code':mixRatioList[i].code});
+            var tem = {
+                code:pg.code,
+                name:pg.name,
+                specs:pg.specs,
+                unit:pg.unit,
+                shortName:pg.unit_price.short_name,
+                rationItemQuantity:mixRatioList[i].consumption,
+               // quantity:mixRatioList[i].consumption,
+                basePrice:pg.unit_price.base_price,
+                marketPrice:pg.unit_price.market_price,
+                adjustPrice:pg.adjust_price,
+                isEstimate:pg.is_evaluate,
+                isMixRatio:true
+            }
+            temRationGLJs.push(tem);
+        }
+        temRationGLJs=_.sortBy(temRationGLJs,'code');
+        return temRationGLJs;
+    },
     showRationCoeData:function (node) {
     showRationCoeData:function (node) {
         var coeList = [];
         var coeList = [];
         var ration_coe= projectObj.project.ration_coe;
         var ration_coe= projectObj.project.ration_coe;
@@ -874,6 +929,111 @@ var gljOprObj = {
     },
     },
     refreshView:function () {
     refreshView:function () {
         this.showRationGLJData();
         this.showRationGLJData();
+    },
+    getTreeNodeCellType:function (data) {
+        var ns = GC.Spread.Sheets;
+        var rectW = 10;
+        var rectH = 10;
+        var margin = 3;
+        function TreeNodeCellType() {
+        }
+
+        function drowRect(ctx,x,y,w,h) {
+            ctx.save();
+            ctx.strokeStyle = "gray";
+            ctx.translate(0.5,0.5);
+            ctx.beginPath();
+            var rectX = x+margin;
+            var rectY =  y+ Math.round(h/2)-rectH/2;
+            ctx.moveTo(rectX, rectY);
+            ctx.lineTo(rectX, rectY+rectH);
+            ctx.lineTo(rectX+rectW, rectY+rectH);
+            ctx.lineTo(rectX+rectW, rectY);
+            ctx.lineTo(rectX, rectY);
+            ctx.moveTo(rectX+rectW, y+Math.round(h/2));
+            ctx.lineTo(rectX+rectW+5, y+Math.round(h/2));
+            ctx.stroke();
+            ctx.restore();
+        }
+
+        function drowSymbol(ctx,x,y,w,h,collapsed) {
+            ctx.save();
+            ctx.strokeStyle = "#000000";
+            ctx.translate(0.5, 0.5);
+            ctx.beginPath();
+            ctx.moveTo(x+margin+2, y+Math.round(h/2));
+            ctx.lineTo(x+margin+8, y+Math.round(h/2));
+            var rectY =  y+ Math.round(h/2)-rectH/2;
+            if(collapsed){
+                ctx.moveTo(x+margin+rectW/2,rectY+2);
+                ctx.lineTo(x+margin+rectW/2,rectY+2+6);
+            }
+            ctx.stroke();
+            ctx.restore();
+        }
+
+        function drowSubItem(ctx,x,y,w,h,offset,nextItem) {
+            offset+=6;
+            ctx.save();
+            ctx.strokeStyle = "gray";
+            ctx.translate(0.5, 0.5);
+            ctx.beginPath();
+            ctx.moveTo(x+offset, y);
+            ctx.lineTo(x+offset, y+Math.round(h/2));
+            offset+=9;
+            ctx.lineTo(x+offset, y+Math.round(h/2));
+            if(nextItem&&nextItem.isMixRatio){
+                ctx.moveTo(x+offset-9, y+Math.round(h/2));
+                ctx.lineTo(x+offset-9, y+h);
+            }
+            ctx.stroke();
+            ctx.restore();
+            return offset;
+        }
+
+        TreeNodeCellType.prototype = new ns.CellTypes.Text();
+        TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
+            if(value!=null){
+                var offset = margin+rectW+6;
+                var recode = data[options.row];
+                if(recode&&recode.hasOwnProperty('subList')){
+                    drowRect(ctx,x,y,w,h);
+                    var collapsed = options.sheet.getTag(options.row,options.col);
+                    drowSymbol(ctx,x,y,w,h,collapsed);
+                }else if(recode&&recode.isMixRatio){
+                    offset= drowSubItem(ctx,x,y,w,h,offset,data[options.row+1]);
+                    offset+=1;
+                }
+                ctx.fillText(value,x+offset+ctx.measureText(value).width,y+h-5);
+            }
+        };
+        // override getHitInfo to allow cell type get mouse messages
+        TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
+            return {
+                x: x,
+                y: y,
+                row: context.row,
+                col: context.col,
+                cellStyle: cellStyle,
+                cellRect: cellRect,
+                sheetArea: context.sheetArea
+            };
+        }
+        TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
+            var recode = data[hitinfo.row];
+            if(recode&&recode.hasOwnProperty('subList')){
+               var hoffset= hitinfo.cellRect.x+3;
+                if (hitinfo.x > hoffset && hitinfo.x < hoffset + 10){
+                    var collapsed =  hitinfo.sheet.getTag(hitinfo.row,hitinfo.col,hitinfo.sheetArea);
+                    collapsed = !collapsed;
+                    hitinfo.sheet.setTag(hitinfo.row,hitinfo.col,collapsed);
+                    hitinfo.sheet.getRange(hitinfo.row+1, -1, recode.subList.length, -1).visible(!collapsed);
+                    hitinfo.sheet.invalidateLayout();
+                    hitinfo.sheet.repaint();
+                }
+            }
+        };
+        return new TreeNodeCellType()
     }
     }
 }
 }
 
 

+ 10 - 5
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -18,7 +18,7 @@ var gljContextMenu = {
                         var sheetData = gljOprObj.sheetData;
                         var sheetData = gljOprObj.sheetData;
                         var disable = true;
                         var disable = true;
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
-                            disable=false
+                            disable=  sheetData[gljContextMenu.selectedRow].isMixRatio==true?true:false;
                         }
                         }
                         return disable;
                         return disable;
                     },
                     },
@@ -32,11 +32,16 @@ var gljContextMenu = {
                     name: '添加工料机',
                     name: '添加工料机',
                     icon: 'fa-sign-in',
                     icon: 'fa-sign-in',
                     disabled: function () {
                     disabled: function () {
+                        var disable = true;
                         var selected = projectObj.project.mainTree.selected;
                         var selected = projectObj.project.mainTree.selected;
+                        var sheetData = gljOprObj.sheetData;
                         if(selected&&selected.sourceType==ModuleNames.ration){
                         if(selected&&selected.sourceType==ModuleNames.ration){
-                            return false;
+                            disable=false;
                         }
                         }
-                        return true;
+                        if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
+                            disable=  sheetData[gljContextMenu.selectedRow].isMixRatio==true?true:false;
+                        }
+                        return disable;
                     },
                     },
                     callback:function () {
                     callback:function () {
                         getGLJData('add');
                         getGLJData('add');
@@ -49,7 +54,7 @@ var gljContextMenu = {
                         var sheetData = gljOprObj.sheetData;
                         var sheetData = gljOprObj.sheetData;
                         var disable = true;
                         var disable = true;
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
-                            disable=false
+                            disable=  sheetData[gljContextMenu.selectedRow].isMixRatio==true?true:false;
                         }
                         }
                         return disable;
                         return disable;
                     },
                     },
@@ -64,7 +69,7 @@ var gljContextMenu = {
                         var sheetData = gljOprObj.sheetData;
                         var sheetData = gljOprObj.sheetData;
                         var disable = true;
                         var disable = true;
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
-                            disable=false
+                            disable=  sheetData[gljContextMenu.selectedRow].isMixRatio==true?true:false;
                         }
                         }
                         return disable;
                         return disable;
                     },
                     },

+ 18 - 18
web/building_saas/main/js/views/main_tree_col.js

@@ -111,33 +111,33 @@ let colSettingObj = {
     settingSpread: null,
     settingSpread: null,
     checkBox: new GC.Spread.Sheets.CellTypes.CheckBox(),
     checkBox: new GC.Spread.Sheets.CellTypes.CheckBox(),
     loadSetting: function (sheet, setting) {
     loadSetting: function (sheet, setting) {
-        sheet.setColumnCount(setting.cols.length);
-        sheet.setRowCount(setting.headRows, GC.Spread.Sheets.SheetArea.colHeader);
-        sheet.setRowCount(1);
-        sheet.getRange(0, -1, 1, -1).cellType(this.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
+        sheet.setRowCount(setting.cols.length);
+        sheet.setColumnCount(setting.headRows, GC.Spread.Sheets.SheetArea.rowHeader);
+        sheet.setColumnCount(1);
+        sheet.getRange(-1, 0, -1, 1).cellType(this.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
 
 
-        setting.headRowHeight.forEach(function (rowHeight, index) {
-            sheet.setRowHeight(index, rowHeight, GC.Spread.Sheets.SheetArea.colHeader);
-        });
         setting.cols.forEach(function (col, index) {
         setting.cols.forEach(function (col, index) {
-            let i, iRow = 0, cell;
+            let i, iCol = 0, cell;
             for (i = 0; i < col.head.spanCols.length; i++) {
             for (i = 0; i < col.head.spanCols.length; i++) {
                 if (col.head.spanCols[i] !== 0) {
                 if (col.head.spanCols[i] !== 0) {
-                    cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
-                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                    cell = sheet.getCell(index, iCol, GC.Spread.Sheets.SheetArea.rowHeader);
+                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]);
                 }
                 }
                 if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                 if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
-                    sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
+                    sheet.addSpan(index, iCol, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.rowHeader);
                 }
                 }
-                iRow += col.head.spanRows[i];
+                iCol += col.head.spanRows[i];
             };
             };
-            sheet.setColumnWidth(index, col.width);
-            cell = sheet.getCell(0, index).value(col.visible);
+            let colWidth = sheet.getColumnWidth(index, GC.Spread.Sheets.SheetArea.rowHeader);
+            colWidth = colWidth > col.width ? colWidth : col.width;
+            sheet.setColumnWidth(index, colWidth, GC.Spread.Sheets.SheetArea.rowHeader);
+            cell = sheet.getCell(index, 0).value(col.visible);            
+            sheet.autoFitRow(index);
         });
         });
     },
     },
     initSettingSpread: function () {
     initSettingSpread: function () {
         this.settingSpread = SheetDataHelper.createNewSpread($('#col_setting_spread')[0], {sheetCount: 1});
         this.settingSpread = SheetDataHelper.createNewSpread($('#col_setting_spread')[0], {sheetCount: 1});
-        this.settingSpread.options.showScrollTip = GC.Spread.Sheets.ShowScrollTip.horizontal;
+        this.settingSpread.options.showScrollTip = GC.Spread.Sheets.ShowScrollTip.vertical;
         this.loadSetting(this.settingSpread.getActiveSheet(), projectObj.project.projSetting.main_tree_col);
         this.loadSetting(this.settingSpread.getActiveSheet(), projectObj.project.projSetting.main_tree_col);
     }
     }
 };
 };
@@ -150,9 +150,9 @@ $('#column').on('shown.bs.modal', function () {
 
 
 $('#column').on('hide.bs.modal', function () {
 $('#column').on('hide.bs.modal', function () {
     let sheet = colSettingObj.settingSpread.getActiveSheet();
     let sheet = colSettingObj.settingSpread.getActiveSheet();
-    for (let iCol = 0; iCol < sheet.getColumnCount(); iCol ++) {
-        projectObj.project.projSetting.main_tree_col.cols[iCol].visible = sheet.getValue(0, iCol);
-        projectObj.project.projSetting.mainGridSetting.cols[iCol].visible = sheet.getValue(0, iCol);
+    for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
+        projectObj.project.projSetting.main_tree_col.cols[iRow].visible = sheet.getValue(iRow, 0);
+        projectObj.project.projSetting.mainGridSetting.cols[iRow].visible = sheet.getValue(iRow, 0);
     }
     }
     SheetDataHelper.refreshColumnVisible(projectObj.project.projSetting.mainGridSetting, projectObj.mainSpread.getActiveSheet());
     SheetDataHelper.refreshColumnVisible(projectObj.project.projSetting.mainGridSetting, projectObj.mainSpread.getActiveSheet());
     projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {projectID: projectObj.project.ID(), main_tree_col: projectObj.project.projSetting.main_tree_col});
     projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {projectID: projectObj.project.ID(), main_tree_col: projectObj.project.projSetting.main_tree_col});

+ 2 - 1
web/building_saas/main/js/views/project_property_labour_coe_view.js

@@ -46,7 +46,7 @@ let labourCoeView = {
         sheet.setColumnWidth(0, 180, sheetArea.viewport);
         sheet.setColumnWidth(0, 180, sheetArea.viewport);
         sheet.setRowCount(1, sheetArea.colHeader);
         sheet.setRowCount(1, sheetArea.colHeader);
         sheet.setRowCount(20, sheetArea.viewport);
         sheet.setRowCount(20, sheetArea.viewport);
-        sheet.setRowHeight(0, 30, sheetArea.colHeader);
+        sheet.setRowHeight(0, 40, sheetArea.colHeader);
         sheet.bind(GC.Spread.Sheets.Events.CellChanged, me.onCellChanged);
         sheet.bind(GC.Spread.Sheets.Events.CellChanged, me.onCellChanged);
         sheet.resumeEvent();
         sheet.resumeEvent();
         sheet.resumePaint();
         sheet.resumePaint();
@@ -141,6 +141,7 @@ let labourCoeView = {
                 projectObj.project.labourCoe.refreshData(data);
                 projectObj.project.labourCoe.refreshData(data);
                 me.needUpdateDatas.splice(0, me.needUpdateDatas.length);
                 me.needUpdateDatas.splice(0, me.needUpdateDatas.length);
                 projectObj.project.calcProgram.compileAllTemps();
                 projectObj.project.calcProgram.compileAllTemps();
+                projectObj.project.ration.calcAll();
                 rationPM.buildSheet();
                 rationPM.buildSheet();
                 $("#std_labour_coe_files").val('');
                 $("#std_labour_coe_files").val('');
             });
             });

+ 6 - 4
web/building_saas/main/js/views/project_view.js

@@ -145,7 +145,8 @@ var projectObj = {
             calc.calcNode(node, true);
             calc.calcNode(node, true);
             nodes = getNodes(node);
             nodes = getNodes(node);
             project.Bills.updateNodes(nodes, true);
             project.Bills.updateNodes(nodes, true);
-        } else if (node.sourceType === projectObj.project.VolumePrice.getSourceType()) {
+        }
+        else if (node.sourceType === projectObj.project.VolumePrice.getSourceType()) {
             project.beginUpdate('VolumePrice_QuantityChange');
             project.beginUpdate('VolumePrice_QuantityChange');
             project.VolumePrice.updateField(node.source, fieldName, value, false);
             project.VolumePrice.updateField(node.source, fieldName, value, false);
             calc.calcNode(node.parent, true);
             calc.calcNode(node.parent, true);
@@ -153,14 +154,15 @@ var projectObj = {
             project.Bills.updateNodes(nodes, false);
             project.Bills.updateNodes(nodes, false);
             project.endUpdate();
             project.endUpdate();
             nodes.push(node);
             nodes.push(node);
-        } else if (node.sourceType === projectObj.project.Ration.getSourceType()) {
+        }
+        else if (node.sourceType === projectObj.project.Ration.getSourceType()) {
             project.beginUpdate('Ration_QuantityChange');
             project.beginUpdate('Ration_QuantityChange');
             calcFees.setFee(node.data, fieldName, value);
             calcFees.setFee(node.data, fieldName, value);
             node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);
             node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);
             // calcProgram.calculate的传参必须是cacheNode类型,故无法将计算放在Ration模块中。
             // calcProgram.calculate的传参必须是cacheNode类型,故无法将计算放在Ration模块中。
             project.calcProgram.calculate(node);
             project.calcProgram.calculate(node);
-            project.Ration.updateRation(node.source, false);
-            calc.calcNode(node.parent, true);
+            project.Ration.updateRation(node.source, false);    // 加入待存储队列
+            calc.calcNode(node.parent, true);       //
             nodes = getNodes(node.parent);
             nodes = getNodes(node.parent);
             project.Bills.updateNodes(nodes, false);
             project.Bills.updateNodes(nodes, false);
             project.endUpdate();
             project.endUpdate();

+ 5 - 5
web/building_saas/main/js/views/std_bills_lib.js

@@ -231,7 +231,7 @@ var billsLibObj = {
         ],
         ],
         "defaultRowHeight": 21,
         "defaultRowHeight": 21,
         "cols":[{
         "cols":[{
-            "width":150,
+            "width":160,
             "readOnly": true,
             "readOnly": true,
             "head":{
             "head":{
                 "titleNames":["项目编码"],
                 "titleNames":["项目编码"],
@@ -248,7 +248,7 @@ var billsLibObj = {
                 "font":"Arial"
                 "font":"Arial"
             }
             }
         }, {
         }, {
-            "width":120,
+            "width":150,
             "readOnly": true,
             "readOnly": true,
             "head":{
             "head":{
                 "titleNames":["项目名称"],
                 "titleNames":["项目名称"],
@@ -265,7 +265,7 @@ var billsLibObj = {
                 "font":"Arial"
                 "font":"Arial"
             }
             }
         }, {
         }, {
-            "width":40,
+            "width":50,
             "readOnly": true,
             "readOnly": true,
             "head":{
             "head":{
                 "titleNames":["计量单位"],
                 "titleNames":["计量单位"],
@@ -308,7 +308,7 @@ var billsLibObj = {
         "headRowHeight":[25],
         "headRowHeight":[25],
         "defaultRowHeight": 21,
         "defaultRowHeight": 21,
         "cols":[{
         "cols":[{
-            "width":200,
+            "width":160,
             "readOnly":true,
             "readOnly":true,
             "head":{
             "head":{
                 "titleNames":["工作内容"],
                 "titleNames":["工作内容"],
@@ -332,7 +332,7 @@ var billsLibObj = {
         "headRowHeight":[25],
         "headRowHeight":[25],
         "defaultRowHeight": 21,
         "defaultRowHeight": 21,
         "cols":[{
         "cols":[{
-            "width":200,
+            "width":160,
             "readOnly":true,
             "readOnly":true,
             "head":{
             "head":{
                 "titleNames":["项目特征"],
                 "titleNames":["项目特征"],

+ 5 - 5
web/building_saas/main/js/views/std_ration_lib.js

@@ -131,7 +131,7 @@ var rationLibObj = {
         "defaultRowHeight": 21,
         "defaultRowHeight": 21,
         "treeCol": 0,
         "treeCol": 0,
         "cols":[{
         "cols":[{
-            "width":300,
+            "width":400,
             "readOnly": true,
             "readOnly": true,
             "head":{
             "head":{
                 "titleNames":["名称"],
                 "titleNames":["名称"],
@@ -155,7 +155,7 @@ var rationLibObj = {
         "headRowHeight":[20],
         "headRowHeight":[20],
         "defaultRowHeight": 21,
         "defaultRowHeight": 21,
         "cols":[{
         "cols":[{
-            "width":100,
+            "width":60,
             "readOnly": true,
             "readOnly": true,
             "head":{
             "head":{
                 "titleNames":["编码"],
                 "titleNames":["编码"],
@@ -172,7 +172,7 @@ var rationLibObj = {
                 "font":"Arial"
                 "font":"Arial"
             }
             }
         }, {
         }, {
-            "width":180,
+            "width":220,
             "readOnly": true,
             "readOnly": true,
             "head":{
             "head":{
                 "titleNames":["名称"],
                 "titleNames":["名称"],
@@ -189,7 +189,7 @@ var rationLibObj = {
                 "font":"Arial"
                 "font":"Arial"
             }
             }
         }, {
         }, {
-            "width":50,
+            "width":55,
             "readOnly":true,
             "readOnly":true,
             "head":{
             "head":{
                 "titleNames":["单位"],
                 "titleNames":["单位"],
@@ -206,7 +206,7 @@ var rationLibObj = {
                 "font":"Arial"
                 "font":"Arial"
             }
             }
         }, {
         }, {
-            "width":80,
+            "width":60,
             "readOnly":true,
             "readOnly":true,
             "head":{
             "head":{
                 "titleNames":["基价"],
                 "titleNames":["基价"],

+ 5 - 0
web/building_saas/report/js/jpc_output.js

@@ -123,6 +123,11 @@ let JpcCanvasOutput = {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
                 let font = fonts[cell[JV.PROP_FONT]];
                 let font = fonts[cell[JV.PROP_FONT]];
                 let control = controls[cell[JV.PROP_CONTROL]];
                 let control = controls[cell[JV.PROP_CONTROL]];
+                if (control.ShowZero === "F") {
+                    if (parseFloat(cell[JV.PROP_VALUE]) === 0.0) {
+                        values = [""];
+                    }
+                }
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
                 for (let i = 0; i < values.length; i++) {
                 for (let i = 0; i < values.length; i++) {