Browse Source

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

zhangenping 8 năm trước cách đây
mục cha
commit
a250cbabe7

+ 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 - 0
web/main/js/main.js

@@ -0,0 +1,44 @@
+/**
+ * Created by Mai on 2017/3/10.
+ */
+
+var Project, pm = '<a href="/pm">项目管理</a>', angleRight = '<i class="fa fa-angle-right fa-fw"></i>';
+
+var GetQueryString = function (name) {
+    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+    var r = window.location.search.substr(1).match(reg);
+    if (r != null) return unescape(r[2]); return null;
+};
+
+var LoadFullPath = function (proj) {
+    var fullPath = [], i;
+    fullPath.push(pm);
+    for (i = 0; i < proj.fullFolder.length; i++) {
+        fullPath.push(angleRight, proj.fullFolder[i]);
+    }
+    fullPath.push(angleRight, proj.name)
+    return fullPath;
+};
+
+var LoadData = function () {
+    var fullPath;
+    GetProject(GetQueryString('project'), function (data) {
+        Project = data;
+        fullPath = LoadFullPath(Project);
+        $('#fullpath').html(fullPath.join(''));
+    });
+};
+
+LoadData();
+
+var setting = {
+    columns: [
+        {
+            data: '',
+            hAlign: '',
+            vAlign: ''
+        },
+    ]
+}
+
+$('#warp-p2')

+ 24 - 0
web/main/js/main_ajax.js

@@ -0,0 +1,24 @@
+/**
+ * Created by Mai on 2017/3/10.
+ */
+
+var GetProject = function (proj_id, callback) {
+    $.ajax({
+        type:"POST",
+        url: '/getProject',
+        data: {'data': JSON.stringify({"user_id": userID, "proj_id": proj_id})},
+        dataType: 'json',
+        cache: false,
+        timeout: 50000,
+        success: function(result){
+            if (result.error === 0) {
+                callback(result.data);
+            } else {
+                alert('error: ' + result.message);
+            }
+        },
+        error: function(jqXHR, textStatus, errorThrown){
+            alert('error ' + textStatus + " " + errorThrown);
+        }
+    });
+}

+ 44 - 67
web/scripts/treeDataHelper.js

@@ -1,81 +1,58 @@
 /**
  * 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 = {
-    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;
-        });
-    },
-
-    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;
     }
-
 }

+ 6 - 5
web/scripts/tree_table.js

@@ -10,7 +10,8 @@
  			pid: 'parentId',
  			nid: 'nextId',
  			btnColumn: 1,
- 			iconCol: 'projType'
+ 			iconCol: 'projType',
+			nullId: -1
  		},
  		columns: [
  		{
@@ -236,7 +237,7 @@
 				that.newNodeId(node.id());
 
 				if (!parent){
-					if (data[setting.tree.pid] === -1) {
+					if (data[setting.tree.pid] === setting.tree.nullId) {
  						parent = that._root;
  					} else {
  						parent = createTempNode(data[setting.tree.pid], setting);
@@ -249,7 +250,7 @@
  				}
  				node.parent = parent;
 
- 				if (!next && data[setting.tree.nid] !== -1) {
+ 				if (!next && data[setting.tree.nid] !== setting.tree.nullId) {
  					next = createTempNode(data[setting.tree.nid], setting);
  					next.parent = parent;
  				}
@@ -337,7 +338,7 @@
  					if (node.row) {
  						if (pre) {
  							_view._moveRowDom(node, pre.deepestRow());
- 						} else if (parent.id() !== -1) {
+ 						} else if (parent.id() !== setting.tree.nullId) {
                             _view._moveRowDom(node, parent.row);
                         } else if (nextSibling) {
  							_view._moveRowDomBefore(node, nextSibling.row);
@@ -348,7 +349,7 @@
                     }
  				}
  			} else {
- 				this.e.throw('Error(information of moving node has mistake).');
+ 				this.e.throw('Error: information of moving node has mistake.');
  			}
  		};