Browse Source

code sync : tune report template construct

TonyKang 7 năm trước cách đây
mục cha
commit
d69cbea84b

+ 4 - 2
modules/reports/controllers/rpt_tpl_controller.js

@@ -23,7 +23,7 @@ let callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
 };
 
-module.exports = {
+let mExport = {
     getDftTemplates(req, res) {
         let filter = {"userId": -100, "$or": [{"isDeleted": null}, {"isDeleted": false} ]};
         TreeNodeModel.find(filter, '-_id', function(err, data){
@@ -176,4 +176,6 @@ module.exports = {
             }
         });
     }
-};
+};
+
+export default mExport;

+ 77 - 0
modules/reports/facade/rpt_tpl_tree_node_facade.js

@@ -0,0 +1,77 @@
+/**
+ * Created by Tony on 2017/9/14.
+ */
+
+import mongoose from "mongoose";
+
+let rpt_tpl_tree_mdl = mongoose.model("rpt_tpl_tree");
+
+const SYSTEM_USER_ID = -100;
+
+function validate(doc) {
+    let rst = true;
+    if (doc) {
+        if (!(doc.hasOwnProperty("comilationId") && doc.hasOwnProperty("engineerId") && doc.hasOwnProperty("userId"))) {
+            rst = false;
+        }
+    } else {
+        rst = false;
+    }
+    return rst;
+}
+
+async function createNewTree(doc) {
+    if (validate(doc)) {
+        return await rpt_tpl_tree_mdl.create(doc)
+    } else {
+        return null;
+    }
+}
+
+async function updateTree(comilationId, engineerId, userId, doc) {
+    let filter = {"comilationId": comilationId, "engineerId": engineerId, "userId": userId};
+    return await rpt_tpl_tree_mdl.update(filter, doc);
+}
+
+async function removeTree(comilationId, engineerId, userId, cb) {
+    let filter = {"comilationId": comilationId, "engineerId": engineerId, "userId": userId};
+    return await rpt_tpl_tree_mdl.findAndModify(filter, [], { $set: { "isDeleted": true } }, {'new':true}, cb);
+}
+
+async function removeTreePhycically(comilationId, engineerId, userId) {
+    let filter = {"comilationId": comilationId, "engineerId": engineerId, "userId": userId};
+    return await rpt_tpl_tree_mdl.remove(filter);
+}
+
+async function findTplTree(comilationId, engineerIds, userIds) {
+    //let filter = {"comilationId": comilationId, "engineerId": engineerIds, "userId": userIds};
+    let filter = {"comilationId": comilationId, "engineerId": engineerIds, "userId": userIds, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+    if (engineerIds instanceof Array) {
+        filter.engineerId = {$in: engineerIds};
+    }
+    if (userIds instanceof Array) {
+        filter.userId = {$in: userIds};
+    }
+    return await rpt_tpl_tree_mdl.find(filter);
+}
+
+async function findTplTreeByOid(objectId) {
+    if (objectId) {
+        //let filter = {"_id": ObjectId(objectId)};
+        let id = mongoose.Types.ObjectId(objectId);
+        let filter = {_id: id};
+        return await rpt_tpl_tree_mdl.findOne(filter);
+    } else return null;
+}
+
+
+let expObj = {
+    createNewTree:  createNewTree,
+    updateTree:     updateTree,
+    removeTree:     removeTree,
+    removeTreePhycically: removeTreePhycically,
+    findTplTree:    findTplTree,
+    findTplTreeByOid: findTplTreeByOid
+};
+
+export {expObj as default};

+ 1 - 1
modules/reports/models/rpt_cfg.js

@@ -45,4 +45,4 @@ let RptCfgSchema = new Schema({
 
 let Rpt_Cfg_Mdl = mongoose.model("rpt_cfg", RptCfgSchema, "rpt_cfg");
 
-module.exports = Rpt_Cfg_Mdl;
+export {Rpt_Cfg_Mdl as default};

+ 1 - 1
modules/reports/models/rpt_mapping_field.js

@@ -19,4 +19,4 @@ let MapFieldSchema = new mongoose.Schema({
 
 let Rpt_Map_Field_Mdl = mongoose.model("rpt_mapping_field", MapFieldSchema, "rpt_mapping_field");
 
-module.exports = Rpt_Map_Field_Mdl;
+export {Rpt_Map_Field_Mdl as default};

+ 1 - 1
modules/reports/models/rpt_template.js

@@ -28,4 +28,4 @@ let RptTemplateSchema = new Schema({
 
 let Template = mongoose.model("rpt_templates", RptTemplateSchema, "rpt_templates");
 
-module.exports = Template;
+export {Template as default};

+ 1 - 1
modules/reports/models/rpt_tpl_data_demo.js

@@ -35,4 +35,4 @@ let TemplateData = mongoose.model("rpt_temp_tpl_data", RptTemplateDataSchema, "r
 //
 // module.exports = new RplTplDataDAO();
 
-module.exports = TemplateData;
+export {TemplateData as default};

+ 26 - 1
modules/reports/models/tpl_tree_node.js

@@ -18,6 +18,31 @@ let TreeNodeSchema = new Schema({
     isDeleted: Boolean
 });
 
+let TplNodeSchema = new Schema({
+    nodeType: Number,   //节点类型:树节点(枝) 或 模板节点(叶)
+    refId: Number,      //引用报表模板id (引用 collection: rpt_templates)
+    name: String,       //显示名称
+    items: []           //子节点
+});
+
+let RptTplTreeSchema = new Schema({
+    comilationId: String,   //编办的ObjectId
+    engineerId: Number,     //工程专业Id(参考 /modules/common/const/engineering.js)
+    userId: Number,         //userId,如果是标准模板,则为-100
+    properties: [],         //这是一个预留的属性,假定未来还会有不同的划分细节(如:招标/投标/清单 ... etc)
+    name: String,           //显示名称
+    released: Boolean,      //是否已发布
+    isDeleted: Boolean,     //删除标记
+    items: []               //TplNodeSchema entity
+});
+RptTplTreeSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
+    return this.collection.findAndModify(query, sort, doc, options, callback);
+};
+
+/*
 let TreeNodeModel = mongoose.model("rpt_tpl_tree", TreeNodeSchema, "rpt_tpl_tree");
+/*/
+let TreeNodeModel = mongoose.model("rpt_tpl_tree", RptTplTreeSchema, "rpt_tpl_tree");
+//*/
 
-module.exports = TreeNodeModel;
+export {TreeNodeModel as default};

+ 5 - 7
modules/reports/rpt_component/jpc_ex.js

@@ -25,7 +25,7 @@ JpcExSrv.prototype.createNew = function(){
             if (rptTpl && rptTpl[nodeName] && rptTpl[nodeName].length > 0) {
                 for (let i = 0; i < rptTpl[nodeName].length; i++) {
                     let rptDftItem = rptTpl[nodeName][i];
-                    if (rst[rptDftItem[JV.PROP_ID]] == undefined) {
+                    if (rst[rptDftItem[JV.PROP_ID]] === undefined) {
                         let item = {};
                         for (let j = 0; j < propArray.length; j++) {
                             item[propArray[j]] = rptDftItem[propArray[j]];
@@ -38,12 +38,10 @@ JpcExSrv.prototype.createNew = function(){
         return rst;
     }
     function private_buildDftControls(rptTpl, dftControlCollection) {
-        let rst = private_buildDftItems(rptTpl,dftControlCollection, JV.CONTROL_PROPS, JV.NODE_CONTROL_COLLECTION);
-        return rst;
+        return private_buildDftItems(rptTpl,dftControlCollection, JV.CONTROL_PROPS, JV.NODE_CONTROL_COLLECTION);
     }
     function private_buildDftFonts(rptTpl, dftFontCollection) {
-        let rst = private_buildDftItems(rptTpl,dftFontCollection, JV.FONT_PROPS, JV.NODE_FONT_COLLECTION);
-        return rst;
+        return private_buildDftItems(rptTpl,dftFontCollection, JV.FONT_PROPS, JV.NODE_FONT_COLLECTION);
     }
     function private_buildDftStyles(rptTpl, dftStyleCollection) {
         let rst = {};
@@ -64,7 +62,7 @@ JpcExSrv.prototype.createNew = function(){
             if (rptTpl && rptTpl[JV.NODE_STYLE_COLLECTION] && rptTpl[JV.NODE_STYLE_COLLECTION].length > 0) {
                 for (let i = 0; i < rptTpl[JV.NODE_STYLE_COLLECTION].length; i++) {
                     let rptDftItem = rptTpl[JV.NODE_STYLE_COLLECTION][i];
-                    if (rst[rptDftItem[JV.PROP_ID]] == undefined) {
+                    if (rst[rptDftItem[JV.PROP_ID]] === undefined) {
                         let item = {};
                         for (let j = 0; j < rptDftItem[JV.PROP_BORDER_STYLE].length; j++) {
                             let borderItem = {};
@@ -231,4 +229,4 @@ JpcExSrv.prototype.createNew = function(){
     return JpcResult;
 };
 
-module.exports = new JpcExSrv();
+export default new JpcExSrv();

+ 148 - 0
test/unit/reports/rpt_tpl_tree_test.js

@@ -0,0 +1,148 @@
+/**
+ * Created by Tony on 2017/9/15.
+ */
+import test from "tape";
+import mongoose from "mongoose";
+let config = require("../../../config/config.js");
+//config.setupDb(process.env.NODE_ENV);
+config.setupDb('qa');
+import dbm from "../../../config/db/db_manager";
+import mdl from "../../../modules/reports/models/tpl_tree_node";
+import rttFacade from "../../../modules/reports/facade/rpt_tpl_tree_node_facade";
+
+dbm.connect();
+
+/*
+test('测试 - 创建dummy报表树: ', function (t) {
+    let tprTplTree = {};
+    tprTplTree.comilationId = "598d239605cdd825682925d1";
+    tprTplTree.engineerId = 1;
+    tprTplTree.userId = -100;
+    tprTplTree.properties = [{"isZhaoBiao": false}, {"isBills": true}];
+    tprTplTree.name = "重庆市建筑工程";
+    tprTplTree.released = true;
+    tprTplTree.isDeleted = false;
+    tprTplTree.items = [];
+
+    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【封-1】招标工程量清单", items: null} );
+    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
+
+    let results = rttFacade.createNewTree(tprTplTree);
+    results.then(function(rst) {
+        console.log(rst);
+        t.pass('just pass!');
+        t.end();
+    });
+});
+ //*/
+
+/*
+test('测试 - 创建dummy报表树2: ', function (t) {
+    let tprTplTree = {};
+    tprTplTree.comilationId = "598d239605cdd825682925d1";
+    tprTplTree.engineerId = 2;
+    tprTplTree.userId = -100;
+    tprTplTree.properties = [{"isZhaoBiao": false}, {"isBills": true}];
+    tprTplTree.name = "重庆市装饰工程";
+    tprTplTree.released = true;
+    tprTplTree.isDeleted = false;
+    tprTplTree.items = [];
+
+    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【封-1】招标工程量清单", items: null} );
+    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
+
+    let results = rttFacade.createNewTree(tprTplTree);
+    results.then(function(rst) {
+        console.log(rst);
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+/*
+test('测试 - 更新 dummy报表树2: ', function (t) {
+    let tprTplTree = {};
+    tprTplTree.comilationId = "598d239605cdd825682925d1";
+    tprTplTree.engineerId = 2;
+    tprTplTree.userId = -100;
+    tprTplTree.properties = [{"isZhaoBiao": false}, {"isBills": true}];
+    tprTplTree.name = "重庆市装饰工程";
+    tprTplTree.released = false;
+    tprTplTree.isDeleted = false;
+    tprTplTree.items = [];
+
+    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【封-1】招标工程量清单", items: null} );
+    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
+    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09-1】分部分项工程/施工技术措施项目清单计价表(一)", items: null} );
+
+    let results = rttFacade.updateTree(tprTplTree.comilationId, tprTplTree.engineerId, tprTplTree.userId, tprTplTree);
+    results.then(function(rst) {
+        console.log(rst);
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+/*
+test('测试 - 真正删除 dummy报表树2: ', function (t) {
+    let results = rttFacade.removeTreePhycically("598d239605cdd825682925d1", 2, -100);
+    results.then(function(rst) {
+        console.log(rst);
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+/*
+test('测试 - 删除 dummy 报表树: ', function (t) {
+    let results = rttFacade.removeTree("598d239605cdd825682925d1", 2, -100, function(err, rst){
+        console.log(err);
+        console.log(rst);
+    });
+    results.then(function(err, rst) {
+        //mongoose.disconnect();
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+/*
+test('测试 - find dummy 报表树 by ObjectId: ', function (t) {
+    let results = rttFacade.findTplTreeByOid("59bb7fbbbe61c629c0b2bea6");
+    results.then(function(rst) {
+        console.log(rst);
+        //mongoose.disconnect();
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+//*
+test('测试 - find dummy 报表树 ', function (t) {
+    let results = rttFacade.findTplTree("598d239605cdd825682925d1", [1], -100);
+    results.then(function(rst) {
+        console.log(rst);
+        //mongoose.disconnect();
+        t.pass('just pass!');
+        t.end();
+    });
+});
+//*/
+
+//*
+test('close the connection', function (t) {
+    setTimeout(function () {
+        mongoose.disconnect();
+        t.pass('closing db connection');
+        t.end();
+    }, 500);
+    // mongoose.disconnect();
+    // t.pass('closing db connection');
+    // t.end();
+});
+//*/