浏览代码

report template update + ration item tuning

TonyKang 8 年之前
父节点
当前提交
7730be81c1

+ 2 - 1
modules/ration_repository/controllers/ration_controller.js

@@ -20,10 +20,11 @@ module.exports = {
     },
     mixUpdateRationItems: function(req, res){
         var sectionId = req.body.sectionID,
+            rationLibId = req.body.rationLibId,
             updateItems = JSON.parse(req.body.updateItems),
             addItems = JSON.parse(req.body.addItems),
             removeIds = JSON.parse(req.body.removeIds);
-        rationItem.mixUpdateRationItems(sectionId, updateItems, addItems, removeIds, function(err, message, rst){
+        rationItem.mixUpdateRationItems(rationLibId, sectionId, updateItems, addItems, removeIds, function(err, message, rst){
             if (err) {
                 callback(req, res, err, message, null);
             } else {

+ 14 - 9
modules/ration_repository/models/ration_item.js

@@ -14,12 +14,12 @@ var rationGljItemSchema = mongoose.Schema({
 }, { _id: false });
 var rationItemSchema = mongoose.Schema({
     ID:Number,
-    //以下是基于已有access库
     code: String,
     name: String,
     unit: String,
     basePrice: Number,
     sectionId: Number,
+    rationRepId: Number,
     caption: String,
     feeType: Number,
     rationGljList: [rationGljItemSchema]
@@ -35,21 +35,21 @@ rationItemDAO.prototype.getRationItemsBySection = function(sectionId,callback){
         else callback(false,"Get items successfully", data);
     })
 };
-rationItemDAO.prototype.mixUpdateRationItems = function(sectionId, updateItems, addItems, rIds, callback){
+rationItemDAO.prototype.mixUpdateRationItems = function(rationLibId, sectionId, updateItems, addItems, rIds, callback){
     var me = this;
     if (updateItems.length == 0 && rIds.length == 0) {
-        me.addRationItems(sectionId, addItems, callback);
+        me.addRationItems(rationLibId, sectionId, addItems, callback);
     } else {
         me.removeRationItems(rIds, function(err, message, docs) {
             if (err) {
                 callback(true, "Fail to remove", false);
             } else {
-                me.updateRationItems(sectionId, updateItems, function(err, results){
+                me.updateRationItems(rationLibId, sectionId, updateItems, function(err, results){
                     if (err) {
                         callback(true, "Fail to save", false);
                     } else {
                         if (addItems && addItems.length > 0) {
-                            me.addRationItems(sectionId, addItems, callback);
+                            me.addRationItems(rationLibId, sectionId, addItems, callback);
                         } else {
                             callback(false, "Save successfully", results);
                         }
@@ -74,11 +74,14 @@ rationItemDAO.prototype.removeRationItems = function(rIds,callback){
     }
 };
 
-rationItemDAO.prototype.getRationItemsByCode = function(code,callback){
-    //
+rationItemDAO.prototype.getRationItemsByCode = function(repId, code,callback){
+    rationItemModel.find({"rationRepId": repId, "code": /code/, "$or": [{"isDeleted": null}, {"isDeleted": false}]},function(err,data){
+        if(err) callback(true, "Fail to get items", "")
+        else callback(false,"Get items successfully", data);
+    })
 };
 
-rationItemDAO.prototype.addRationItems = function(sectionId, items,callback){
+rationItemDAO.prototype.addRationItems = function(rationLibId, sectionId, items,callback){
     if (items && items.length > 0) {
         counter.counterDAO.getIDAfterCount(counter.moduleName.rations, items.length, function(err, result){
             var maxId = result.value.sequence_value;
@@ -87,6 +90,7 @@ rationItemDAO.prototype.addRationItems = function(sectionId, items,callback){
                 var obj = new rationItemModel(items[i]);
                 obj.ID = (maxId - (items.length - 1) + i);
                 obj.sectionId = sectionId;
+                obj.rationRepId = rationLibId;
                 arr.push(obj);
             }
             rationItemModel.collection.insert(arr, null, function(err, docs){
@@ -102,7 +106,7 @@ rationItemDAO.prototype.addRationItems = function(sectionId, items,callback){
     }
 };
 
-rationItemDAO.prototype.updateRationItems = function(sectionId, items,callback){
+rationItemDAO.prototype.updateRationItems = function(rationLibId, sectionId, items,callback){
     var functions = [];
     for (var i=0; i < items.length; i++) {
         functions.push((function(doc) {
@@ -112,6 +116,7 @@ rationItemDAO.prototype.updateRationItems = function(sectionId, items,callback){
                     filter.ID = doc.ID;
                 } else {
                     filter.sectionId = sectionId;
+                    if (rationLibId) filter.rationRepId = rationLibId;
                     filter.code = doc.code;
                 }
                 rationItemModel.update(filter, doc, cb);

+ 6 - 12
modules/reports/controllers/rpt_tpl_controller.js

@@ -5,21 +5,15 @@
 var TplNode = require('../models/tpl_tree_node');
 
 //统一回调函数
-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});
-    }
-};
+var callback = function(req, res, err, message, data){
+    res.json({error: err, message: message, data: data});
+}
 
 module.exports = {
     createTplTreeNode: function(req, res){
-        var lastNodeId = req.body.lastNodeId;
-        var nodeData = JSON.parse(req.body.rawNodeData);
+        var params = JSON.parse(req.body.params),
+            lastNodeId = params.lastNodeId,
+            nodeData = params.rawNodeData;
         TplNode.createTplTreeNode(nodeData, lastNodeId, function(err, data){
             callback(req,res,err,"", data);
         })

+ 4 - 4
modules/reports/models/tpl_tree_node.js

@@ -9,11 +9,11 @@ var TreeNodeSchema = new Schema({
     ID:Number,
     ParentID:Number,
     NextSiblingID:Number,
-    grp_type: Number, //建筑(const : 1)/公路(const 2)/其他 etc...
-    node_type: Number,//节点类型:树节点(枝) 或 模板节点(叶)
-    tpl_type: Number, //概算、预算、招投标 etc...
+    grpType: Number, //建筑(const : 1)/公路(const 2)/其他 etc...
+    nodeType: Number,//节点类型:树节点(枝) 或 模板节点(叶)
+    tplType: Number, //概算、预算、招投标 etc...
     userId: String,   //用户自定义模板用
-    ref_ID: Number,   //
+    refId: Number,   //
     name: String,
     isDeleted: Boolean
 });

+ 0 - 9
public/rpt_tpl_def.js

@@ -1,9 +0,0 @@
-/**
- * Created by Tony on 2017/6/1.
- */
-
-rptTplDefObj = {
-    Grp_Type: {CONSTRUCT: 1, ROAD: 2},
-    Node_Type: {NODE: 'node', TEMPLATE: 'rptTpl'},
-    Tpl_Type: {ALL: 1, TENDER: 2, BILLS: 3, BUDGET: 4, OTHERS: 99}
-}

+ 28 - 0
public/web/common_ajax.js

@@ -58,5 +58,33 @@ var CommonAjax = {
                 }
             }
         });
+    },
+    postEx: function(url, params, dftTimeOutMilSec, successCallback, failCallback, exceptionCallback){
+        $.ajax({
+            type:"POST",
+            url: url,
+            data: {'params': JSON.stringify(params)},
+            dataType: 'json',
+            cache: false,
+            timeout: dftTimeOutMilSec,
+            success: function(result){
+                if (result.error) {
+                    if (successCallback) {
+                        successCallback(result.data);
+                    }
+                } else {
+                    alert('error: ' + result.message);
+                    if (failCallback) {
+                        failCallback();
+                    }
+                }
+            },
+            error: function(jqXHR, textStatus, errorThrown){
+                alert('url: ' + url +' error ' + textStatus + " " + errorThrown);
+                if (exceptionCallback) {
+                    exceptionCallback();
+                }
+            }
+        });
     }
 };

+ 9 - 0
public/web/rpt_tpl_def.js

@@ -0,0 +1,9 @@
+/**
+ * Created by Tony on 2017/6/1.
+ */
+
+var RT = {
+    GrpType: {CONSTRUCT: 1, ROAD: 2},
+    NodeType: {NODE: 'node', TEMPLATE: 'rptTpl'},
+    TplType: {ALL: 1, TENDER: 2, BILLS: 3, BUDGET: 4, OTHERS: 99}
+}

+ 1 - 1
web/maintain/ration_repository/js/ration.js

@@ -204,7 +204,7 @@ var rationOprObj = {
         $.ajax({
             type:"POST",
             url:"api/mixUpdateRationItems",
-            data:{"sectionID": me.currentSectionId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr), "removeIds": JSON.stringify(removeIds)},
+            data:{"rationLibId": getQueryString("repository"), "sectionID": me.currentSectionId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr), "removeIds": JSON.stringify(removeIds)},
             dataType:"json",
             cache:false,
             timeout:5000,

+ 130 - 9
web/maintain/report/js/rpt_tpl_main.js

@@ -2,12 +2,42 @@
  * Created by Tony on 2017/6/1.
  */
 var rptTplObj = {
-    treeObj: null,
     iniPage: function() {
-        //
+        var me = this
+        zTreeOprObj.getReportTemplateTree(RT.GrpType.CONSTRUCT);
+    }
+}
+
+var zTreeOprObj = {
+    treeObj: null,
+    getReportTemplateTree: function(grpType) {
+        var me = this, params = {};
+        params.grpType = grpType;
+        CommonAjax.postEx("api/getRptTplTree", params, 20000, function(result){
+                zTreeHelper.createTree(result.data, setting, "rationChapterTree", me);
+            }, null, null
+        );
     },
     addRootNode: function() {
-        //
+        var me = this, rawNode = me.createIniRootNode(), lastNodeId = -1;
+        if (me.treeObj) {
+            var rootNodes = me.treeObj.getNodes();
+            if (rootNodes.length > 0) {
+                lastNodeId = rootNodes[rootNodes.length - 1].ID;
+            }
+            me.addNewNode(rawNode, lastNodeId, function(rst){
+                var newNodes = [], isSilent = false;
+                rawNode.ID = rst.data.ID;
+                rawNode.isParent = false;
+                rawNode.items = [];
+                newNodes.push(rawNode);
+                if (me.treeObj) {
+                    me.treeObj.addNodes(null, -1, newNodes, isSilent);
+                } else {
+                    me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
+                }
+            }, null);
+        }
     },
     addSubNode: function() {
         //
@@ -15,18 +45,109 @@ var rptTplObj = {
     addTplNode: function (){
         //
     },
+    addNewNode: function(rawNode, lastNodeId, callback, failcallback) {
+        var params = {};
+        params.lastNodeId = lastNodeId;
+        params.rawNodeData = rawNode;
+        CommonAjax.postEx("api/createTplTreeNode", params, 5000, callback, failcallback, null);
+    },
     createIniRootNode: function() {
         var rst = {
             ID: -1,
             ParentID: -1,
             NextSiblingID: -1,
-            grp_type: rptTplDefObj.Grp_Type.CONSTRUCT,
-            node_type: rptTplDefObj.Node_Type.NODE,
-            tpl_type: rptTplDefObj.Tpl_Type.ALL,
-            userId: null,
-            ref_ID: -1,
-            name: '新节点'
+            grpType: RT.GrpType.CONSTRUCT,
+            nodeType: RT.NodeType.NODE,
+            tplType: RT.TplType.ALL,
+            userId: userID,
+            refId: -1,
+            name: '新节点'
         };
         return rst;
+    },
+    addHoverDom: function(treeId, treeNode) {
+        var me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
+        var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
+        sObj.after(addStr);
+        var btn = $("#addBtn_"+treeNode.tId);
+        if (btn) btn.bind("click", function(){
+            var rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, name: "新增子节点"}, lastNodeId = -1;
+            if (treeNode.items.length > 0) {
+                lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
+            }
+            //zTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
+            //    if (!(err)) {
+            //        var newNodes = [], isSilent = false;
+            //        newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, name:"新增子节点",isParent:false, items:[]});
+            //        treeNode.isParent = true;
+            //        if (me.treeObj) {
+            //            me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
+            //        } else {
+            //            me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
+            //        }
+            //    }
+            //});
+        });
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
+        if (preNode) {
+            preNodeId = preNode.ID;
+        }
+        private_fetchAllSubItems = function(pItem){
+            nodeIds.push(pItem.ID);
+            if (pItem.items && pItem.items.length > 0) {
+                for (var i = 0; i < pItem.items.length; i++) {
+                    private_fetchAllSubItems(pItem.items[i]);
+                }
+            }
+        };
+        nodeIds.push(treeNode.ID);
+        for (var i = 0; i < treeNode.items.length; i++) {
+            private_fetchAllSubItems(treeNode.items[i]);
+        }
+        //$.ajax({
+        //    type:"POST",
+        //    url:"api/deleteNodes",
+        //    data:{"nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
+        //    dataType:"json",
+        //    cache:false,
+        //    timeout:5000,
+        //    success:function(result,textStatus,status){
+        //        var pNode = treeNode.getParentNode();
+        //        if (pNode && pNode.items && pNode.items.length == 1) {
+        //            pNode.isParent = false;
+        //        }
+        //    },
+        //    error:function(){
+        //    }
+        //});
+        return true;
+    },
+    onRemove: function(e, treeId, treeNode){
+        var me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
+        if (pNode && pNode.items && pNode.items.length == 0) {
+            pNode.isParent = false;
+            me.treeObj.refresh();
+            //me.treeObj.updateNode(pNode, false); //这方法有后遗症,多次操作后会造成节点新增子节点时,父节点icon显示不正确
+        }
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        if (newName.length == 0) {
+            return false;
+        }
+        return true;
+    },
+    onRename : function(e, treeId, treeNode, isCancel) {
+        var nodes = [];
+        nodes.push(treeNode);
+        //zTreeOprObj.updateNodes(nodes);
+    },
+    onClick: function(event,treeId,treeNode) {
+        var sectionID = treeNode.ID;
     }
 }

+ 47 - 4
web/maintain/report/rpt_tpl_main.html

@@ -12,6 +12,11 @@
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <!--zTree-->
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
+    <script>
+        // 这里的变量供页面调用
+        var userAccount = '<%- userAccount %>';
+        var userID = '<%- userID %>';
+    </script>
 </head>
 
 <body>
@@ -34,8 +39,7 @@
             <div class="row">
                 <div class="main-side col-lg-3 p-0">
                     <div class="tab-bar">
-                        <a onclick="rptTplObj.addRootNode()" class="btn btn-secondary btn-sm">增加根节点</a>
-                        <a onclick="rptTplObj.addSubNode()" class="btn btn-secondary btn-sm">增加子节点</a>
+                        <a onclick="zTreeOprObj.addRootNode()" class="btn btn-secondary btn-sm">增加根节点</a>
                     </div>
                     <div class="tab-content">
                         <ul id="rationChapterTree" class="ztree"></ul>
@@ -56,10 +60,49 @@
 <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/storageUtil.js"></script>
-<script type="text/javascript" src="/public/rpt_tpl_def.js"></script>
+<script type="text/javascript" src="/public/web/rpt_tpl_def.js"></script>
+<script type="text/javascript" src="/public/web/common_ajax.js"></script>
 </body>
 <script type="text/javascript">
-
+    var setting = {
+        view: {
+            addHoverDom: zTreeOprObj.addHoverDom,
+            removeHoverDom: zTreeOprObj.removeHoverDom,
+            expandSpeed: "",
+            selectedMulti: false
+        },
+        edit: {
+            enable: true,
+            editNameSelectAll: true,
+            showRemoveBtn: true,
+            showRenameBtn: true,
+            removeTitle: "删除节点",
+            renameTitle: "更改名称"
+        },
+        data: {
+            keep: {
+                parent:true,
+                leaf:true
+            },
+            key: {
+                children: "items"
+            },
+            simpleData: {
+                enable: true,
+                idKey: "ID",
+                pIdKey: "ParentID",
+                rootPId: -1
+            }
+        },
+        callback:{
+            onClick: zTreeOprObj.onClick,
+            beforeRename: zTreeOprObj.beforeRename,
+            beforeRemove: zTreeOprObj.onBeforeRemove,
+            onRemove: zTreeOprObj.onRemove,
+            onRename: zTreeOprObj.onRename
+        }
+    };
+    autoFlashHeight();
 </script>
 
 </html>