Pārlūkot izejas kodu

sync report controller and add treeUtil

TonyKang 8 gadi atpakaļ
vecāks
revīzija
91430d3cb6

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

@@ -0,0 +1,60 @@
+/**
+ * Created by Tony on 2017/3/13.
+ */
+
+var JV = require('../rpt_component/Jpc_ValueDefine');
+var Template = require('../models/rpt_template');
+var TemplateData = require('../models/rpt_temp_data');
+var JpcEx = require('../rpt_component/JpcEx');
+var cacheController = require('./cacheController');
+
+//统一回调函数
+var callback = function(req, res, err, data){
+    if(err){
+        //res.send({success: false, error: err});
+        res.json({success: false, error: err});
+    }
+    else{
+        //res.send({success: true, data: data});
+        res.json({success:true, data: data});
+    }
+}
+
+module.exports = {
+    getReportAllPages: function(req, res){
+        var grp_id = req.body.grp_id;
+        var tpl_id = req.body.tpl_id;
+        var pageSize = req.body.pageSize;
+        Template.get(grp_id, tpl_id, function(err, rptTpl){
+            if (rptTpl) {
+                TemplateData.get(tpl_id, function(err, tplData){
+                    if (tplData) {
+                        var printCom = JpcEx.createNew();
+                        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                        var dftControls = cacheController.getCache("common_ctrls");
+                        var dftFonts = cacheController.getCache("common_fonts");
+                        var dftStyles = cacheController.getCache("common_styles");
+                        var defProperties = {ctrls: dftControls, fonts: dftFonts, styles: dftStyles};
+                        printCom.initialize(rptTpl);
+                        printCom.analyzeData(rptTpl, tplData, defProperties);
+                        var maxPages = printCom.totalPages;
+                        var pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                        if (pageRst) {
+                            callback(req, res, err, pageRst);
+                        } else {
+                            callback(req, res, "Have errors while on going...", null);
+                        }
+                        //callback(req, res, err, tplData);
+                    } else {
+                        callback(req, res, err, null);
+                    }
+                })
+            } else {
+                callback(req, res, err, null);
+            }
+        });
+    },
+    remove: function(req, res){
+    }
+
+}

+ 34 - 0
modules/reports/models/rpt_temp_data.js

@@ -0,0 +1,34 @@
+/**
+ * Created by Tony on 2016/12/28.
+ */
+var mongoose = require('mongoose');
+var smartcostdb = require('./../db/smartcostdb');
+//var Schema = smartcostdb.mongoose.Schema;
+var Schema = mongoose.Schema;
+var RptTemplateDataSchema = new Schema({
+    "Data_Key": String,
+    "discrete_data": Array,
+    "master_data": Array,
+    "detail_data": Array
+});
+
+var TemplateData = smartcostdb.mongoose.model("temp_tpl_datas", RptTemplateDataSchema);
+//var TemplateData = smartcostdb.model("temp_tpl_datas", RptTemplateDataSchema);
+
+var RplTplDataDAO = function(){};
+
+//根据id获取临时数据
+RplTplDataDAO.prototype.get = function(tpl_id, callback){
+    //TemplateData.find({"Data_Key": tpl_id}, function(err, templates){
+    //TemplateData.find({}, function(err, templates){
+    TemplateData.find({"Data_Key": tpl_id}, function(err, templates){
+        if(templates.length){
+            callback(false, templates[0]);
+        }
+        else{
+            callback('查找不到模板临时数据!');
+        }
+    })
+}
+
+module.exports = new RplTplDataDAO();

+ 38 - 0
modules/reports/models/rpt_template.js

@@ -0,0 +1,38 @@
+/**
+ * Created by Tony on 2016/12/23.
+ */
+var mongoose = require('mongoose');
+var smartcostdb = require('./../db/smartcostdb');
+//var Schema = smartcostdb.mongoose.Schema;
+var Schema = mongoose.Schema;
+var RptTemplateSchema = new Schema({
+    "GROUP_KEY": String,
+    "ID_KEY": String,
+    "主信息": Schema.Types.Mixed,
+    "指标_数据_映射": Schema.Types.Mixed,
+    "布局框_集合": Array,
+    "流水式表_信息": Schema.Types.Mixed,
+    "交叉表_信息": Schema.Types.Mixed,
+    "无映射离散指标_集合": Schema.Types.Mixed,
+    "离散参数_集合": Schema.Types.Mixed,
+    "计算式_集合": Array
+});
+
+var Template = smartcostdb.mongoose.model("rpt_templates", RptTemplateSchema);
+//var Template = smartcostdb.model("rpt_templates", RptTemplateSchema);
+
+var RplTplDAO = function(){};
+
+//根据id获取试卷
+RplTplDAO.prototype.get = function(grpId, id, callback){
+    Template.find({GROUP_KEY: grpId, ID_KEY: id}, function(err, templates){
+        if(templates.length){
+            callback(false, templates[0]);
+        }
+        else{
+            callback('查找不到报表模板!');
+        }
+    })
+}
+
+module.exports = new RplTplDAO();

+ 24 - 0
modules/reports/routes/report_router.js

@@ -0,0 +1,24 @@
+/**
+ * Created by Tony on 2017/3/13.
+ */
+
+var express = require('express');
+var rptRouter = express.Router();
+var pmController = require('./../controllers/pm_controller');
+
+rptRouter.get('/pm', function(req, res){
+    if(!req.session.userAccount){
+        res.redirect('/login');
+    }
+    else{
+        res.render('pm/html/project-management.html',
+            {userAccount: req.session.userAccount,
+                userID: req.session.userID});
+    }
+});
+
+rptRouter.post('/getProjects', pmController.getProjects);
+rptRouter.post('/updateProjects', pmController.updateProjects);
+rptRouter.post('/renameProject', pmController.rename);
+
+module.exports = rptRouter;

+ 59 - 0
public/treeUtil.js

@@ -0,0 +1,59 @@
+/**
+ * Created by Tony on 2017/3/14.
+ */
+
+const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1;
+
+module.exports = {
+    buildTreeNodeDirectly: function(data) {
+        var me = this, topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
+        private_getTopNode = function (idArr) {
+            var rst = null;
+            for (var i = 0; i < idArr.length; i++) {
+                if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] == EMPTY_ID_VAL) {
+                    rst = tmpNodes[prefix + idArr[i]];
+                    break;
+                }
+            }
+            return rst;
+        }
+        private_buildNodeData = function(parentItem, idArr) {
+            var iter = [], nextNode = private_getTopNode(idArr);
+            while (nextNode != null && nextNode != undefined ) {
+                if (parentItem) {
+                    parentItem[CHILDREN_NODE].push(nextNode);
+                } else {
+                    rst.push(nextNode);
+                }
+                iter.push(nextNode);
+                nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
+            }
+            for (var i = 0; i < iter.length; i++) {
+                private_buildNodeData(iter[i], iter[i][SUB_ID]);
+            }
+        }
+
+        for (var i = 0; i < data.length; i++) {
+            tmpNodes[prefix + data[i][NODE_ID]] = data[i];
+            data[i][ADHOC_PRE_ID] = EMPTY_ID_VAL;
+            data[i][SUB_ID] = [];
+            data[i][CHILDREN_NODE] = [];
+            if (data[i][P_ID] == EMPTY_ID_VAL) {
+                topArr.push(data[i][NODE_ID]);
+            }
+        }
+        for (var i = 0; i < data.length; i++) {
+            if (data[i][NEXT_ID] != EMPTY_ID_VAL) {
+                tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
+            }
+            if (data[i][P_ID] != EMPTY_ID_VAL) {
+                tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
+            }
+        }
+        private_buildNodeData(null, topArr);
+        //try to release and return
+        tmpNodes = null;
+        topArr.length = 0;
+        return rst;
+    }
+}

+ 44 - 67
web/scripts/treeDataHelper.js

@@ -1,81 +1,58 @@
 /**
 /**
  * Created by Tony on 2017/1/23.
  * Created by Tony on 2017/1/23.
  */
  */
+const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1;
+
 var tree_Data_Helper = {
 var tree_Data_Helper = {
-    sortDataBySerial: function (data) {
-        data.sort(function(item1, item2) {
-            var rst = 0;
-            if (item1["SerialNo"] > item2["SerialNo"]) {
-                rst = 1;
-            } else if (item1["SerialNo"] < item2["SerialNo"]) {
-                rst = -1;
+    buildTreeNodeDirectly: function(data) {
+        var me = this, topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
+        private_getTopNode = function (idArr) {
+            var rst = null;
+            for (var i = 0; i < idArr.length; i++) {
+                if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] == EMPTY_ID_VAL) {
+                    rst = tmpNodes[prefix + idArr[i]];
+                    break;
+                }
             }
             }
             return rst;
             return rst;
-        });
-    },
-
-    buildTreeData: function (data) {
-        var rst = [], idArr = [], me = this;
-        var distIdx = -1, distinctIdx = 0;
-        for (var i = 0; i < data.length; i++) {
-            idArr.push(i);
-        }
-        me.distinctByCustId(data, idArr, "ParentID", distIdx);
-        distinctIdx = me.getDistinctId(data, idArr, distIdx);
-        for (var i = 0; i < distinctIdx; i++) {
-            rst[i] = data[idArr[i]];
-        }
-        for (var i = 0; i < rst.length; i++) {
-            idArr = idArr.slice(distinctIdx);
-            me.buildBranchData(rst[i], data, idArr);
         }
         }
-        return rst;
-    },
-
-    getDistinctId: function (data, idArr, compareVal) {
-        var rst = 0, me = this;
-        for (var i = 0; i < idArr.length; i++) {
-            if (data[idArr[i]]["ParentID"] != compareVal) {
-                rst = i;
-                break;
+        private_buildNodeData = function(parentItem, idArr) {
+            var iter = [], nextNode = private_getTopNode(idArr);
+            while (nextNode != null && nextNode != undefined ) {
+                if (parentItem) {
+                    parentItem[CHILDREN_NODE].push(nextNode);
+                } else {
+                    rst.push(nextNode);
+                }
+                iter.push(nextNode);
+                nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
+            }
+            for (var i = 0; i < iter.length; i++) {
+                private_buildNodeData(iter[i], iter[i][SUB_ID]);
             }
             }
         }
         }
-        return rst;
-    },
 
 
-    buildBranchData: function (parentItem, orgData, idArr) {
-        var distinctIdx = 0, distVal = parentItem["ID"], me = this;
-        me.distinctByCustId(orgData, idArr, "ParentID", distVal);
-        distinctIdx = me.getDistinctId(orgData, idArr, distVal);
-        parentItem["items"] = [];
-        for (var i = 0; i < distinctIdx; i++) {
-            parentItem["items"][i] = orgData[idArr[i]];
-        }
-        for (var i = 0; i < parentItem["items"].length; i++) {
-            idArr = idArr.slice(distinctIdx);
-            me.buildBranchData(parentItem["items"][i], orgData, idArr);
-            distinctIdx = me.getDistinctId(orgData, idArr, parentItem["items"][i]["ID"]);
+        for (var i = 0; i < data.length; i++) {
+            tmpNodes[prefix + data[i][NODE_ID]] = data[i];
+            data[i][ADHOC_PRE_ID] = EMPTY_ID_VAL;
+            data[i][SUB_ID] = [];
+            data[i][CHILDREN_NODE] = [];
+            if (data[i][P_ID] == EMPTY_ID_VAL) {
+                topArr.push(data[i][NODE_ID]);
+            }
         }
         }
-    },
-
-    distinctByCustId: function (data, idArray, IdStr, IdVal) {
-        idArray.sort(function(idx1, idx2) {
-            var rst = 0;
-            if (data[idx1][IdStr] == IdVal) {
-                if (data[idx2][IdStr] == data[idx1][IdStr]) {
-                    if (data[idx1]["SerialNo"] > data[idx2]["SerialNo"]) {
-                        rst = 1;
-                    } else {
-                        rst = -1;
-                    }
-                } else {
-                    rst = -1;
-                }
-            } else if (data[idx2][IdStr] == IdVal) {
-                rst = 1;
+        for (var i = 0; i < data.length; i++) {
+            if (data[i][NEXT_ID] != EMPTY_ID_VAL) {
+                tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
             }
             }
-            return rst;
-        });
+            if (data[i][P_ID] != EMPTY_ID_VAL) {
+                tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
+            }
+        }
+        private_buildNodeData(null, topArr);
+        //try to release and return
+        tmpNodes = null;
+        topArr.length = 0;
+        return rst;
     }
     }
-
 }
 }