浏览代码

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

zhangweicheng 7 年之前
父节点
当前提交
722e65e2cd

+ 1 - 1
modules/main/models/project.js

@@ -147,7 +147,7 @@ Project.prototype.getFilterData = function (projectID, filter, callback) {
         functions.push(getModuleData(itemName));
     }
     asyncTool.parallel(functions, function (err, results) {
-        console.log(results);
+        //console.log(results);
         if (err) {
             throw '获取项目数据出错';
         } else {

+ 3 - 0
modules/reports/controllers/rpt_tpl_controller.js

@@ -52,6 +52,9 @@ let mExport = {
             compilationId = params.compilationId,
             userId = params.userId,
             engineerId = params.engineerId;
+        if (!compilationId) {
+            compilationId = req.session.sessionCompilation._id;
+        }
         rttFacade.findTplTree(compilationId, engineerId, userId).then(function(result) {
             if (result) {
                 callback(req,res,false,"", result);

+ 114 - 72
modules/reports/util/rpt_construct_data_util.js

@@ -13,19 +13,57 @@ let projectConst = consts.projectConst;
 let projectConstList = consts.projectConstList;
 
 class Rpt_Common{
-    initialize(Projects) {
-        this.Projects = Projects;
+    initialize(rpt_tpl, currentDataObj) {
+        this.template = rpt_tpl;
+        this.currentDataObj = currentDataObj;
     };
-
-    getSerialNo(fieldId, $CURRENT_RPT, $CURRENT_DATA){
-        let itemSerialNoRec = $JE.F(fieldId, $CURRENT_RPT);
-        if (itemSerialNoRec) {
-            itemSerialNoRec[JV.PROP_AD_HOC_DATA] = [];
-            for (var innerFmlIdx = 0; innerFmlIdx < $CURRENT_DATA[JV.DATA_DETAIL_DATA][0].length; innerFmlIdx++) {
-                itemSerialNoRec[JV.PROP_AD_HOC_DATA][innerFmlIdx] = (innerFmlIdx + 1);
-            }
-            itemSerialNoRec = null;
+    Multiply(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) * ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
+        }
+        return rst;
+    };
+    Divide(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) / ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
+        }
+        return rst;
+    };
+    Plus(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) + ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
         }
+        return rst;
+    };
+    Minus(val1, val2, fixFormat) {
+        let rst = [], maxLen = val1.length, minLen = val2.length;
+        if (minLen > maxLen) {
+            maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
+        }
+        for (let i = 0; i < maxLen; i++) {
+            let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) - ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (fixFormat) value = value.toFixed(fixFormat);
+            rst.push(value);
+        }
+        return rst;
     };
 }
 
@@ -38,6 +76,7 @@ class Rpt_Data_Extractor {
         this.rptTpl = tpl;
     };
 
+    //-- 根据报表模板映射指标(非离散指标)的定义,罗列出所有需要用到的data对象key,作为数据请求的过滤依据
     getDataRequestFilter() {
         let rst = [];
         let tpl = this.rptTpl;
@@ -48,7 +87,7 @@ class Rpt_Data_Extractor {
                         if (field[JV.PROP_FIELD_EXP_MAP].indexOf('.' + key + '.') >= 0) {
                             rst.push(key);
                             if (key === projectConst.RATION_GLJ && (rst.indexOf(projectConst.PROJECTGLJ) < 0)) {
-                                //rst.push(projectConst.PROJECTGLJ);
+                                rst.push(projectConst.PROJECTGLJ);
                             }
                             if (key === projectConst.PROJECTGLJ && (rst.indexOf(projectConst.RATION_GLJ) < 0)) {
                                 rst.push(projectConst.RATION_GLJ);
@@ -58,42 +97,30 @@ class Rpt_Data_Extractor {
                 }
             }
         };
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX]) {
-                pri_func_chk_filter(field);
-            }
-        }
-        if (tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX]) {
-            for (let field of tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX]) {
-                pri_func_chk_filter(field);
+        let pri_setup_filter = function (FIELD_LIST_KEY) {
+            if (tpl[JV.NODE_FIELD_MAP][FIELD_LIST_KEY]) {
+                for (let field of tpl[JV.NODE_FIELD_MAP][FIELD_LIST_KEY]) {
+                    pri_func_chk_filter(field);
+                }
             }
-        }
+        };
+        pri_setup_filter(JV.NODE_DISCRETE_FIELDS);
+        pri_setup_filter(JV.NODE_MASTER_FIELDS);
+        pri_setup_filter(JV.NODE_DETAIL_FIELDS);
+        pri_setup_filter(JV.NODE_MASTER_FIELDS_EX);
+        pri_setup_filter(JV.NODE_DETAIL_FIELDS_EX);
         return rst;
     };
 
     //--- 装配数据(把收集到的数据,依据报表模板的指示,预处理(如:排序、过滤、合计)及装配到相关指标) ---//
     assembleData(rawDataObj) {
-        let $PROJECT = {"COMMON": {}, "MAIN": {}, "DETAIL": {}};
+        let $PROJECT = {"COMMON": null, "MAIN": {}, "DETAIL": {}};
         let tpl = this.rptTpl;
+        this.COMMON.initialize(tpl, rawDataObj);
+        $PROJECT.COMMON = this.COMMON;
         $PROJECT.MAIN["myOwnRawDataObj"] = rawDataObj.prj._doc;
         $PROJECT.MAIN.getProperty = ext_mainGetPropety;
         $PROJECT.MAIN.getFee = ext_mainGetFee;
-        $PROJECT.DETAIL.getRationPropertyByID = ext_getRationPropertyByID;
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
             for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
                 let srcData = getModuleDataByKey(rawDataObj.prjData, preHandle[JV.PROP_DATA_KEY]);
@@ -134,8 +161,8 @@ class Rpt_Data_Extractor {
         // console.log(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);
-        // 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;
     };
 
@@ -316,6 +343,7 @@ function setupFunc(obj, prop, ownRawObj) {
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
     obj[prop].getProperty = ext_getPropety;
     obj[prop].getFee = ext_getFee;
+    obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
 }
 
 function assembleFields(fieldList, rstDataArr, $PROJECT) {
@@ -333,11 +361,9 @@ function shielded_exec_env($PROJECT, $ME, rptDataItemObj) {
 }
 
 function ext_mainGetPropety(propKey) {
-    let rst = [];
-    let parentObj = this;
-    //console.log(this);
+    let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
-    if ((dtObj) && (propKey)) {
+    if (propKey && dtObj) {
         if (dtObj.hasOwnProperty("property")) {
             rst.push(dtObj["property"][propKey]);
         } else  {
@@ -347,6 +373,24 @@ function ext_mainGetPropety(propKey) {
     return rst;
 }
 
+function ext_getPropety(propKey) {
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (propKey && dtObj) {
+        for (let dItem of dtObj.data) {
+            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
+            if (doc.hasOwnProperty("property")) {
+                rst.push(doc["property"][propKey]);
+            } else if (doc.hasOwnProperty(propKey)) {
+                rst.push(doc[propKey]);
+            } else {
+                rst.push('');
+            }
+        }
+    }
+    return rst;
+}
+
 function ext_mainGetFee(feeKey, dtlFeeKey) {
     let rst = [];
     let parentObj = this;
@@ -372,24 +416,6 @@ function ext_mainGetFee(feeKey, dtlFeeKey) {
     return rst;
 }
 
-function ext_getPropety(propKey) {
-    let rst = [], parentObj = this;
-    let dtObj = parentObj["myOwnRawDataObj"];
-    if (propKey && dtObj) {
-        for (let dItem of dtObj.data) {
-            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
-            if (doc.hasOwnProperty("property")) {
-                rst.push(doc["property"][propKey]);
-            } else if (doc.hasOwnProperty(propKey)) {
-                rst.push(doc[propKey]);
-            } else {
-                rst.push('');
-            }
-        }
-    }
-    return rst;
-}
-
 function ext_getFee(feeKey, dtlFeeKey) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
@@ -423,16 +449,32 @@ function ext_getFee(feeKey, dtlFeeKey) {
     return rst;
 }
 
-function ext_getRationPropertyByID(IdVal, propKey) {
-    let rst = [], me = this;
-    if (IdVal !== null && IdVal !== undefined && me[projectConst.RATION]) {
+function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey) {
+    let rst = [], parentObj = this;
+    let IdKey = (adHocIdKey)?adHocIdKey:"ID";
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (foreignIdVal !== null && foreignIdVal !== undefined) {
         let isFound = false;
-        if (IdVal instanceof Array) {
-            for (let id of IdVal) {
+        if (foreignIdVal instanceof Array) {
+            for (let idVal of foreignIdVal) {
                 isFound = false;
-                for (let item of me[projectConst.RATION]["myOwnRawDataObj"].data) {
-                    if (item.ID === id) {
-                        rst.push(item[propKey]);
+                for (let i = 0; i < dtObj.data.length; i++) {
+                    let item = (dtObj.data[i]._doc)?dtObj.data[i]._doc:dtObj.data[i];
+                    if (item[IdKey] === idVal) {
+                        let splitPKey = propKey.split(".");
+                        if (splitPKey.length > 1) {
+                            let rstP = null;
+                            for (let i = 0; i < splitPKey.length; i++) {
+                                if (i === 0) {
+                                    rstP = item[splitPKey[i]];
+                                } else {
+                                    rstP = rstP[splitPKey[i]];
+                                }
+                            }
+                            rst.push(rstP);
+                        } else {
+                            rst.push(item[propKey]);
+                        }
                         isFound = true;
                         break;
                     }
@@ -440,8 +482,8 @@ function ext_getRationPropertyByID(IdVal, propKey) {
                 // if (!isFound) rst.push[null];
             }
         } else {
-            for (let item of me[projectConst.RATION]["myOwnRawDataObj"].data) {
-                if (item.ID === IdVal) {
+            for (let item of dtObj.data) {
+                if (item[IdKey] === foreignIdVal) {
                     rst.push(item[propKey]);
                     isFound = true;
                     break;

+ 13 - 0
test/calculation/testArrayCalc.js

@@ -0,0 +1,13 @@
+/**
+ * Created by Tony on 2017/10/31.
+ */
+
+var test = require('tape');
+
+test('测试数组运算', function(t){
+    let demo = [1, 2, 3];
+    let rst = demo*3; //failed!
+    console.log(rst);
+    t.pass('just pass');
+    t.end('just end');
+});

+ 7 - 165
web/building_saas/main/html/main.html

@@ -20,8 +20,8 @@
     <!-- endinject -->
     <script>
         // 这里的变量供页面调用
-        var userAccount = '<%- userAccount %>';
-        var userID = '<%- userID %>';
+        let userAccount = '<%- userAccount %>';
+        let userID = '<%- userID %>';
     </script>
 </head>
 
@@ -80,7 +80,7 @@
                 <li class="nav-item"><a data-toggle="tab" href="#gongliaoji" id="tab_gongliaoji" role="tab">工料机</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#fee_rates" id="tab_fee_rate" role="tab" >费率</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#calc_program_manage" id="tab_calc_program_manage" role="tab">计算程序</a></li>
-                <li class="nav-item"><a data-toggle="tab" href="#baobiao" role="tab" id="tab_baobiao" onclick="">报表</a></li>
+                <li class="nav-item"><a data-toggle="tab" href="#reports" role="tab" id="tab_report" onclick="rptTplObj.iniPage();">报表</a></li>
             </ul>
         </div>
         <div class="content">
@@ -232,160 +232,10 @@
             <div class="tab-pane" id="gongliaoji" role="tabpanel">
                 <%include ../../glj/html/glj_index.html %>
             </div>
-            <div class="tab-pane" id="baobiao" role="tabpanel">
-              <!--报表-->
-              <div class="container-fluid">
-                <div class="row">
-                  <div class="col-lg-2 p-0">
-                    <div class="print-list">
-                    <div class="list-tools d-flex justify-content-center">
-                      <button class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#editForm"><i class="fa fa-cog"></i> 管理报表</button>
-                    </div>
-                      <div class="form-list">
-                        <ul id="rptTplTree" class="ztree"></ul>
-                      </div>
-                    </div>
-                  </div>
-                  <div class="col-lg-10 p-0">
-                    <div class="toolsbar">
-                      <div class="print-toolsbar">
-                        <div class="panel">
-                          <div class="panel-body">
-                            <button class="btn btn-secondary btn-sm" type="button">
-                              <i class="fa fa-print"></i><br>
-                              打印 <span id="checkCount" class="badge badge-primary">5</span>
-                            </button>
-                          </div>
-                        </div>
-                        <div class="panel">
-                            <div class="panel-body">
-                              <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
-                                <div class="btn-group" role="group">
-                                  <button id="btnGroupDrop1" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                    纵向
-                                  </button>
-                                  <div class="dropdown-menu" aria-labelledby="btnGroupDrop1">
-                                    <a class="dropdown-item" href="#">横向</a>
-                                  </div>
-                                </div>
-                                <div class="btn-group" role="group">
-                                  <button id="btnGroupDrop1" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                    A4
-                                  </button>
-                                  <div class="dropdown-menu" aria-labelledby="btnGroupDrop1">
-                                    <a class="dropdown-item" href="#">A3</a>
-                                  </div>
-                                </div>
-                              </div>
-                            </div>
-                            <div class="panel-foot text-muted">
-                              预览设置
-                            </div>
-                        </div>
-                        <div class="panel">
-                            <div class="panel-body">
-                              <div class="btn-group" role="group">
-                                <button type="button" class="btn btn-secondary btn-sm">-</button>
-                                <a class="btn btn-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="重置默认大小">1000%</a>
-                                <button type="button" class="btn btn-secondary btn-sm">+</button>
-                              </div>
-                            </div>
-                            <div class="panel-foot text-muted">
-                              缩放
-                            </div>
-                        </div>
-                        <div class="panel">
-                            <div class="panel-body">
-                              <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
-                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#paper"><i class="fa fa-file-o"></i> 纸张</button>
-                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#format"><i class="fa fa-bold"></i> 格式</button>
-                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#content"><i class="fa fa-file-text-o"></i> 内容</button>
-                              </div>
-                            </div>
-                            <div class="panel-foot text-muted">
-                              报表设置
-                            </div>
-                        </div>
-                      </div>
-                    </div>
-                      <div class="print-view poj-list">
-                        <div class="pageContainer">
-                          <div class="page">
-                            <img src="/web/building_saas/img/baobiao.png">
-                          </div>
-                          <div class="page">
-                            <img src="/web/building_saas/img/baobiao.png">
-                          </div>
-                          <div class="page">
-                            <img src="/web/building_saas/img/baobiao.png">
-                          </div>
-                          <div class="page">
-                            <img src="/web/building_saas/img/baobiao.png">
-                          </div>
-                        </div>
-                      </div>
-                  </div>
-                </div>
-              </div>
-              <!--报表的弹窗-->
-              <!--1弹出纸张-->
-              <div class="modal fade" id="paper" data-backdrop="static">
-                  <div class="modal-dialog" role="document">
-                      <div class="modal-content">
-                          <div class="modal-header">
-                              <h5 class="modal-title">纸张</h5>
-                              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                                <span aria-hidden="true">&times;</span>
-                              </button>
-                          </div>
-                          <div class="modal-body">
-                          </div>
-                          <div class="modal-footer">
-                              <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                              <a href="" class="btn btn-primary">确定</a>
-                          </div>
-                      </div>
-                  </div>
-              </div>
-              <!--2弹出页面-->
-              <div class="modal fade" id="format" data-backdrop="static">
-                  <div class="modal-dialog" role="document">
-                      <div class="modal-content">
-                          <div class="modal-header">
-                              <h5 class="modal-title">格式</h5>
-                              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                                <span aria-hidden="true">&times;</span>
-                              </button>
-                          </div>
-                          <div class="modal-body">
-                          </div>
-                          <div class="modal-footer">
-                              <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                              <a href="" class="btn btn-primary">确定</a>
-                          </div>
-                      </div>
-                  </div>
-              </div>
-              <!--3弹出格式-->
-              <div class="modal fade" id="content" data-backdrop="static">
-                  <div class="modal-dialog" role="document">
-                      <div class="modal-content">
-                          <div class="modal-header">
-                              <h5 class="modal-title">内容</h5>
-                              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                                <span aria-hidden="true">&times;</span>
-                              </button>
-                          </div>
-                          <div class="modal-body">
-                          </div>
-                          <div class="modal-footer">
-                              <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                              <a href="" class="btn btn-primary">确定</a>
-                          </div>
-                      </div>
-                  </div>
-              </div>
+            <div class="tab-pane" id="reports" role="tabpanel">
+                <%include ../../report/html/rpt_main.html %>
             </div>
+
             <div class="tab-pane" id="fee_rates" role="tabpanel">
                 <%include ../../fee_rates/fee_rate.html %>
             </div>
@@ -661,8 +511,6 @@
     </div>
 
     <!-- JS. -->
-    <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
-    <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
     <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 
     <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
@@ -756,12 +604,6 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/glj_view_contextMenu.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_view.js"></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/confirm_modal.js'></script>
-    <!-- reports -->
-    <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
-    <script type="text/javascript" src="/public/web/ztree_common.js"></script>
-    <script type="text/javascript" src="/public/web/rpt_tpl_def.js"></script>
-    <script type="text/javascript" src="/web/building_saas/main/js/rpt/rpt_main.js"></script>
-    <script type="text/javascript" src="/web/building_saas/main/js/rpt/rpt_cfg_const.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/character_content_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/glj_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/sub_view.js"></script>
@@ -827,7 +669,7 @@
                 location.href = '/web/building_saas/main/html/calc_program.html';
             });*/
 
-            rptTplObj.iniPage();
+            //rptTplObj.iniPage();
   		});
   		//-->
   	</SCRIPT>

+ 0 - 30
web/building_saas/main/js/rpt/rpt_cfg_const.js

@@ -1,30 +0,0 @@
-/**
- * Created by Tony on 2017/6/26.
- */
-
-let setting = {
-    view: {
-        selectedMulti: false
-    },
-    check: {
-        enable: true
-    },
-    data: {
-        keep: {
-            parent:true,
-            leaf:true
-        },
-        key: {
-            children: "items"
-        },
-        simpleData: {
-            enable: true,
-            idKey: "ID",
-            pIdKey: "ParentID",
-            rootPId: -1
-        }
-    },
-    callback: {
-        onCheck: zTreeOprObj.onCheck
-    }
-};

+ 151 - 0
web/building_saas/report/html/rpt_main.html

@@ -0,0 +1,151 @@
+<!--报表-->
+<script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
+<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
+<script type="text/javascript" src="/public/web/rpt_tpl_def.js"></script>
+<script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
+<script type="text/javascript" src="/public/web/ztree_common.js"></script>
+<script type="text/javascript" src="/web/building_saas/report/js/rpt_main.js"></script>
+<script type="text/javascript" src="/web/building_saas/report/js/rpt_cfg_const.js"></script>
+
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-2 p-0">
+            <div class="print-list">
+                <div class="list-tools d-flex justify-content-center">
+                    <button class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#editForm"><i class="fa fa-cog"></i> 管理报表</button>
+                </div>
+                <div class="form-list">
+                    <ul id="rptTplTree" class="ztree"></ul>
+                </div>
+            </div>
+        </div>
+        <div class="col-lg-10 p-0">
+            <div class="toolsbar">
+                <div class="print-toolsbar">
+                    <div class="panel">
+                        <div class="panel-body">
+                            <button class="btn btn-secondary btn-sm" type="button">
+                                <i class="fa fa-print"></i><br>
+                                打印 <span id="checkCount" class="badge badge-primary">5</span>
+                            </button>
+                        </div>
+                    </div>
+                    <div class="panel">
+                        <div class="panel-body">
+                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
+                                <div class="btn-group" role="group">
+                                    <button id="btnGroupDrop1" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                                        纵向
+                                    </button>
+                                    <div class="dropdown-menu" aria-labelledby="btnGroupDrop1">
+                                        <a class="dropdown-item" href="#">横向</a>
+                                    </div>
+                                </div>
+                                <div class="btn-group" role="group">
+                                    <button id="btnGroupDrop2" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                                        A4
+                                    </button>
+                                    <div class="dropdown-menu" aria-labelledby="btnGroupDrop2">
+                                        <a class="dropdown-item" href="#">A3</a>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="panel-foot text-muted">
+                            预览设置
+                        </div>
+                    </div>
+                    <div class="panel">
+                        <div class="panel-body">
+                            <div class="btn-group" role="group">
+                                <button type="button" class="btn btn-secondary btn-sm">-</button>
+                                <a class="btn btn-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="重置默认大小">1000%</a>
+                                <button type="button" class="btn btn-secondary btn-sm">+</button>
+                            </div>
+                        </div>
+                        <div class="panel-foot text-muted">
+                            缩放
+                        </div>
+                    </div>
+                    <div class="panel">
+                        <div class="panel-body">
+                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
+                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#paper"><i class="fa fa-file-o"></i> 纸张</button>
+                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#format"><i class="fa fa-bold"></i> 格式</button>
+                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#content"><i class="fa fa-file-text-o"></i> 内容</button>
+                            </div>
+                        </div>
+                        <div class="panel-foot text-muted">
+                            报表设置
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="print-view poj-list">
+                <div class="pageContainer">
+                    <div class="page">
+                        <img src="/web/building_saas/img/baobiao.png">
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--报表的弹窗-->
+<!--1弹出纸张-->
+<div class="modal fade" id="paper" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">纸张</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="" class="btn btn-primary">确定</a>
+            </div>
+        </div>
+    </div>
+</div>
+<!--2弹出页面-->
+<div class="modal fade" id="format" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">格式</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="" class="btn btn-primary">确定</a>
+            </div>
+        </div>
+    </div>
+</div>
+<!--3弹出格式-->
+<div class="modal fade" id="content" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">内容</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="" class="btn btn-primary">确定</a>
+            </div>
+        </div>
+    </div>
+</div>

+ 76 - 0
web/building_saas/report/js/rpt_cfg_const.js

@@ -0,0 +1,76 @@
+/**
+ * Created by Tony on 2017/6/26.
+ */
+
+let rpt_tpl_setting = {
+    view: {
+        selectedMulti: false
+    },
+    check: {
+        enable: true
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: "items"
+        },
+        simpleData: {
+            enable: true,
+            rootPId: -1
+        }
+    },
+    callback: {
+        //onCheck: zTreeOprObj.onCheck
+    }
+};
+
+const engineering = {
+    // 建筑工程
+    ARCHITECTURE: 1,
+    // 装饰工程
+    DECORATE: 2,
+    // 仿古建筑工程
+    ANTIQUE_ARCHITECTURE: 3,
+    // 安装工程
+    BUILD_IN: 4,
+    // 市政土建工程
+    MUNICIPAL_CONSTRUCTION: 5,
+    // 市政安装工程
+    MUNICIPAL_BUILD_IN: 6,
+    // 人工土石方工程
+    ARTIFICIAL_EARTHWORK: 7,
+    // 机械土石方工程
+    MECHANICAL_EARTHWORK: 8,
+    // 炉窖砌筑工程
+    KILN_MASONRY: 9,
+    // 园林工程
+    GARDEN: 10,
+    // 绿化工程
+    PLANTING: 11,
+    // 单拆除工程
+    DISMANTLE: 12,
+    // 建筑修缮工程
+    BUILDING_REPAIR: 13,
+    // 安装修缮工程
+    BUILD_IN_REPAIR: 14
+};
+
+const engineeringList = [
+    {name: "建筑工程", value: engineering.ARCHITECTURE},
+    {name: "装饰工程", value: engineering.DECORATE},
+    {name: "仿古建筑工程", value: engineering.ANTIQUE_ARCHITECTURE},
+    {name: "安装工程", value: engineering.BUILD_IN},
+    {name: "市政土建工程", value: engineering.MUNICIPAL_CONSTRUCTION},
+    {name: "市政安装工程", value: engineering.MUNICIPAL_BUILD_IN},
+    {name: "人工土石方工程", value: engineering.ARTIFICIAL_EARTHWORK},
+    {name: "机械土石方工程", value: engineering.MECHANICAL_EARTHWORK},
+    {name: "炉窖砌筑工程", value: engineering.KILN_MASONRY},
+    {name: "园林工程", value: engineering.GARDEN},
+    {name: "绿化工程", value: engineering.PLANTING},
+    {name: "单拆除工程", value: engineering.DISMANTLE},
+    {name: "建筑修缮工程", value: engineering.BUILDING_REPAIR},
+    {name: "安装修缮工程", value: engineering.BUILD_IN_REPAIR},
+];

+ 19 - 24
web/building_saas/main/js/rpt/rpt_main.js

@@ -4,22 +4,31 @@
 'use strict'
 
 let rptTplObj = {
+    hasInitialized: false,
     iniPage: function() {
-        let me = this
-        zTreeOprObj.getReportTemplateTree(RT.GrpType.CONSTRUCT);
+        let me = this;
+        if (!me.hasInitialized) {
+            zTreeOprObj.getReportTemplateTree(userID);
+            me.hasInitialized = true;
+        }
     }
 }
 
 let zTreeOprObj = {
     treeObj: null,
     currentNode: null,
-    getReportTemplateTree: function(grpType) {
+    getReportTemplateTree: function(userId) {
         let me = zTreeOprObj, params = {};
-        params.grpType = grpType;
-        params.userId = userID;
-        params.tplType = RT.TplType.ALL;
+        params.userId = [];
+        params.userId.push(userId);
+        params.userId.push(-100);
+        let allEngIds = [];
+        for (let item of engineeringList) {
+            allEngIds.push(item.value);
+        }
+        params.engineerId = allEngIds;
         CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
-                zTreeHelper.createTree(result, setting, "rptTplTree", me);
+                zTreeHelper.createTreeDirectly(result, rpt_tpl_setting, "rptTplTree", me);
                 me.refreshNodes();
             }, null, null
         );
@@ -27,11 +36,7 @@ let zTreeOprObj = {
     refreshNodes: function() {
         let me = this;
         let private_setupIsParent = function(node){
-            if (node.nodeType == RT.NodeType.NODE) {
-                node.isParent = true;
-            } else {
-                node.isParent = false;
-            }
+            node.isParent = (node.nodeType === RT.NodeType.NODE || node.level === 0);
             if (node.items && node.items.length) {
                 for (let i = 0; i < node.items.length; i++) {
                     private_setupIsParent(node.items[i]);
@@ -51,16 +56,6 @@ let zTreeOprObj = {
         //}
     },
     onClick: function(event,treeId,treeNode) {
-        let me = zTreeOprObj;
-        if (treeNode.nodeType == RT.NodeType.NODE) {
-            me.currentNode = treeNode;
-            $("#rpt_tpl_display_label")[0].innerText = "...";
-        } else if (treeNode.nodeType == RT.NodeType.TEMPLATE) {
-            me.currentNode = null;
-            $("#rpt_tpl_display_label")[0].innerText = treeNode.name;
-            if (treeNode.refId < 0) {
-                //创建新报表模板
-            }
-        }
+        //
     }
-}
+};