Jelajahi Sumber

报表模板拖放(copy及移动),考虑用户定制功能,code sync

TonyKang 7 tahun lalu
induk
melakukan
446f98aa44

+ 32 - 1
modules/reports/util/rpt_construct_data_util.js

@@ -396,6 +396,18 @@ function filterData(sourceData, handleCfg, prjData) {
         }
         return rst;
     };
+    let private_chkArrVal = function(arr, key, compVal, compStr){
+        let rst = false;
+        for (let arrItem of arr) {
+            if (arrItem[key]) {
+                rst = private_chkVal(arrItem[key], compVal, compStr);
+            }
+            if (rst) {
+                break;
+            }
+        }
+        return rst;
+    };
     let compareObj = {};
     for (let item of tempRstArr) {
         let compRst = true;
@@ -404,7 +416,26 @@ function filterData(sourceData, handleCfg, prjData) {
         for (let cfg of handleCfg[JV.PROP_FILTER_KEYS]) {
             if (cfg[JV.PROP_FILTER_COMPARE_VAL]) {
                 //比较key值
-                compRst = private_chkVal(item[cfg.key], cfg[JV.PROP_FILTER_COMPARE_VAL], cfg[JV.PROP_FILTER_CONDITION]);
+                let keys = cfg.key.split(".");
+                if (keys.length > 1) {
+                    let lastObj = item;
+                    for (let i = 0; i < keys.length - 1; i++) {
+                        lastObj = item[keys[i]];
+                        if (!(lastObj)) {
+                            compRst = false;
+                            break;
+                        }
+                    }
+                    if (lastObj) {
+                        if (lastObj instanceof Array) {
+                            compRst = private_chkArrVal(lastObj, keys[keys.length - 1], cfg[JV.PROP_FILTER_COMPARE_VAL], cfg[JV.PROP_FILTER_CONDITION]);
+                        } else {
+                            compRst = private_chkVal(lastObj[keys[keys.length - 1]], cfg[JV.PROP_FILTER_COMPARE_VAL], cfg[JV.PROP_FILTER_CONDITION]);
+                        }
+                    }
+                } else {
+                    compRst = private_chkVal(item[cfg.key], cfg[JV.PROP_FILTER_COMPARE_VAL], cfg[JV.PROP_FILTER_CONDITION]);
+                }
             } else if (cfg[JV.PROP_FILTER_COMPARE_OBJ] && cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]){
                 //通过其他对象来过滤
                 if (!curComparePrjData) {

+ 8 - 2
web/maintain/report/js/cfg_const.js

@@ -50,7 +50,11 @@ let setting = {
         showRemoveBtn: true,
         showRenameBtn: true,
         removeTitle: "删除节点",
-        renameTitle: "更改名称"
+        renameTitle: "更改名称",
+        drag: {
+            isCopy: true,
+            isMove: true
+        }
     },
     check: {
         enable: true
@@ -75,7 +79,9 @@ let setting = {
         onRemove: zTreeOprObj.onRemove,
         onRename: zTreeOprObj.onRename,
         onCheck: zTreeOprObj.oncheck,
-        beforeDrag: function() {return false;}
+        beforeDrag: zTreeOprObj.onBeforeDrag,
+        beforeDrop: zTreeOprObj.onBeforeDrop,
+        onDrop: zTreeOprObj.onDrop
     }
 };
 

+ 5 - 0
web/maintain/report/js/rpt_tpl_helper.js

@@ -73,6 +73,11 @@ let tplHelper = {
             preHandleObj.hide_all_dom();
             //6. 计算式
             calculationTreeOprObj.iniTree(rptTpl);
+            //9. 刷白预览区域
+            let canvas = $('#tplCanvas')[0];
+            JpcCanvasOutput.cleanCanvas(canvas);
+            preview_util.drawBorder(canvas);
+            // JpcCanvasOutput.drawBorderLine(canvas);
         }
     },
 

+ 100 - 1
web/maintain/report/js/rpt_tpl_main.js

@@ -15,6 +15,7 @@ let rptTplObj = {
 let zTreeOprObj = {
     treeObj: null,
     currentNode: null,
+    moveSrcTopNode: null,
     iniEngineerIdList: function() {
         for (let item of engineeringList) {
             $("#engineerIds").append("<option value='" + item.value + "'>" + item.name + "</option>");
@@ -247,10 +248,108 @@ let zTreeOprObj = {
             }
         });
     },
+    onBeforeDrag: function (treeId, treeNodes) {
+        let rst = true;
+        for (let node of treeNodes) {
+            if (node.level === 0 || node.nodeType !== RT.NodeType.TEMPLATE) {
+                rst = false;
+                break;
+            }
+        }
+        return rst;
+    },
+    onBeforeDrop: function (treeId, treeNodes, targetNode, moveType, isCopy) {
+        let me = zTreeOprObj, rst = true;
+        let srcNode = treeNodes[0];
+        let sourceTopNode = me.getTopNodeByCurrentNode(srcNode);
+        let targetTopNode = me.getTopNodeByCurrentNode(targetNode);
+        me.moveSrcTopNode = null;
+        if (moveType === 'inner') {
+            if (targetNode.nodeType === RT.NodeType.TEMPLATE) {
+                //模板节点不能成为另一个模板节点的子节点。不过zTree控件默认会处理,这里的代码应该走不到,放在这里以防万一
+                rst = false;
+            } else {
+                if (sourceTopNode !== targetTopNode) {
+                    if (!isCopy) {
+                        if (!confirm("是否真的要把报表模板移动到另一个工程类型?")) {
+                            rst = false;
+                        }
+                    }
+                } else {
+                    //同一根节点下,可以随便移动或copy
+                }
+            }
+        } else {
+            if (targetNode.level === 0 || targetNode.nodeType !== RT.NodeType.TEMPLATE) {
+                //模板节点不能与类型节点或目录节点同级!
+                rst = false;
+            } else {
+                if (sourceTopNode !== targetTopNode) {
+                    if (!isCopy) {
+                        if (!confirm("是否真的要把报表模板移动到另一个工程类型?")) {
+                            rst = false;
+                        }
+                    }
+                } else {
+                    //同一根节点下,可以随便移动或copy
+                }
+            }
+        }
+        if (rst && !isCopy && sourceTopNode !== targetTopNode) {
+            me.moveSrcTopNode = sourceTopNode;
+        }
+        return rst;
+    },
+    onDrop: function (event, treeId, treeNodes, targetNode, moveType, isCopy) {
+        let me = zTreeOprObj;
+        let targetTopNode = me.getTopNodeByCurrentNode(targetNode);
+        let newTopNode = me.buildRootNodeDoc(targetTopNode);
+        let canContinue = false;
+        me.updateTreeRootNode(newTopNode, false, function(rst){
+            if (!(rst)) {
+                $("#id_after_saved_lbl")[0].style.color = "red";
+                $("#id_after_saved_lbl")[0].innerHTML = "移动请求失败!";
+                setTimeout(function(){
+                    $("#id_after_saved_lbl")[0].innerHTML = "";
+                }, 1000);
+            } else {
+                canContinue = true;
+            }
+        });
+        if (canContinue && !isCopy && me.moveSrcTopNode) {
+            let newSrcTopNode = me.buildRootNodeDoc(me.moveSrcTopNode);
+            me.updateTreeRootNode(newSrcTopNode, true, function(rst){
+                if (!(rst)) {
+                    $("#id_after_saved_lbl")[0].style.color = "red";
+                    $("#id_after_saved_lbl")[0].innerHTML = "移动请求失败!";
+                    setTimeout(function(){
+                        $("#id_after_saved_lbl")[0].innerHTML = "";
+                    }, 1000);
+                }
+            });
+            //
+        }
+        me.moveSrcTopNode = null;
+    },
+    changeUser: function (dom) {
+        if (dom.id === "custRptOpt") {
+            //用户定制
+            $("#rpt_user_input")[0].disabled = false;
+            $("#rpt_user_find_btn")[0].disabled = false;
+        } else {
+            //公用
+            $("#rpt_user_input")[0].disabled = true;
+            $("#rpt_user_find_btn")[0].disabled = true;
+        }
+    },
     getReportTemplateTree: function(compilationSelect) {
         let me = zTreeOprObj, params = {};
         params.compilationId = compilationSelect.value;
-        params.userId = (userAccount ===  'admin')?("-100"):userID;
+        if ($("#custRptOpt")[0].checked) {
+            params.userId = (userAccount ===  'admin')?("-100"):userID;
+        } else {
+            params.userId = (userAccount ===  'admin')?("-100"):userID;
+        }
         let allEngIds = [];
         for (let item of engineeringList) {
             allEngIds.push(item.value);

+ 32 - 31
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -7,39 +7,40 @@ const condition_types = ["==", "===", ">", ">=", "<", "<=", "!=", "in", "not in"
 const pre_handle_data_objects = ["bills", "ration", "ration_glj"];
 const pre_handle_data_objects_name = ["清单", "定额", "定额工料机"];
 const exposed_bills_properties = [
-    {Name: "清单_ID", Title: "", Key: "ID", Order: "ascend"},
-    {Name: "清单_所属项目ID", Title: "", Key: "projectID", Order: "ascend"},
-    {Name: "清单_层次", Title: "", Key: "treeLevel", Order: "ascend"}
-    // {Name: "清单_项目编码", Title: "", Key: "code", Order: "ascend"},
-    // {Name: "清单_项目名称", Title: "", Key: "name", Order: "ascend"},
-    // {Name: "清单_项目特征", Title: "", Key: "itemCharacterText", Order: "ascend"},
-    // {Name: "清单_计量单位", Title: "", Key: "unit", Order: "ascend"},
-    // {Name: "清单_工程量", Title: "", Key: "quantity", Order: "ascend"},
-    // {Name: "清单_综合单价", Title: "", Key: "unitFee", Order: "ascend"},
-    // {Name: "清单_综合合价", Title: "", Key: "totalFee", Order: "ascend"},
-    // {Name: "清单_暂估价", Title: "", Key: "tenderUnitFee", Order: "ascend"}
+    {Name: "清单_ID", Title: "", Key: "ID", Order: "ascend"}
+    ,{Name: "清单_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
+    ,{Name: "清单_层次", Title: "", Key: "treeLevel", Order: "ascend"}
+    ,{Name: "清单_标记", Title: "", Key: "flags.flag", Order: "ascend"}
+    // ,{Name: "清单_项目编码", Title: "", Key: "code", Order: "ascend"}
+    // ,{Name: "清单_项目名称", Title: "", Key: "name", Order: "ascend"}
+    // ,{Name: "清单_项目特征", Title: "", Key: "itemCharacterText", Order: "ascend"}
+    // ,{Name: "清单_计量单位", Title: "", Key: "unit", Order: "ascend"}
+    // ,{Name: "清单_工程量", Title: "", Key: "quantity", Order: "ascend"}
+    // ,{Name: "清单_综合单价", Title: "", Key: "unitFee", Order: "ascend"}
+    // ,{Name: "清单_综合合价", Title: "", Key: "totalFee", Order: "ascend"}
+    // ,{Name: "清单_暂估价", Title: "", Key: "tenderUnitFee", Order: "ascend"}
 ];
 const exposed_ration_properties = [
-    {Name: "定额_工程内部ID", Title: "", Key: "ID", Order: "ascend"},
-    {Name: "定额_所属清单ID", Title: "", Key: "billsItemID", Order: "ascend"},
-    {Name: "定额_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
-    // {Name: "定额_编号", Title: "", Key: "code", Order: "ascend"},
-    // {Name: "定额_项目名称", Title: "", Key: "caption", Order: "ascend"},
-    // {Name: "定额_单位", Title: "", Key: "unit", Order: "ascend"},
-    // {Name: "定额_数量", Title: "", Key: "quantity", Order: "ascend"},
-    // {Name: "定额_人工费", Title: "", Key: "labour", Order: "ascend"},
-    // {Name: "定额_材料费", Title: "", Key: "material", Order: "ascend"},
-    // {Name: "定额_机械费", Title: "", Key: "machine", Order: "ascend"},
-    // {Name: "定额_机上人工费", Title: "", Key: "machineLabour", Order: "ascend"},
-    // {Name: "定额_人工费调整", Title: "", Key: "adjustLabour", Order: "ascend"},
-    // {Name: "定额_材料费调整", Title: "", Key: "'adjustMaterial'", Order: "ascend"},
-    // {Name: "定额_机械费调整", Title: "", Key: "adjustMachine", Order: "ascend"},
-    // {Name: "定额_机上人工费调整", Title: "", Key: "adjustMachineLabour", Order: "ascend"},
-    // {Name: "定额_人工价差", Title: "", Key: "labourDiff", Order: "ascend"},
-    // {Name: "定额_材料价差", Title: "", Key: "materialDiff", Order: "ascend"},
-    // {Name: "定额_机械价差", Title: "", Key: "machineDiff", Order: "ascend"},
-    // {Name: "定额_风险费用", Title: "", Key: "risk", Order: "ascend"}
-    // {Name: "定额_管理费率", Title: "", Key: ""}
+    {Name: "定额_工程内部ID", Title: "", Key: "ID", Order: "ascend"}
+    ,{Name: "定额_所属清单ID", Title: "", Key: "billsItemID", Order: "ascend"}
+    ,{Name: "定额_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
+    // ,{Name: "定额_编号", Title: "", Key: "code", Order: "ascend"}
+    // ,{Name: "定额_项目名称", Title: "", Key: "caption", Order: "ascend"}
+    // ,{Name: "定额_单位", Title: "", Key: "unit", Order: "ascend"}
+    // ,{Name: "定额_数量", Title: "", Key: "quantity", Order: "ascend"}
+    // ,{Name: "定额_人工费", Title: "", Key: "labour", Order: "ascend"}
+    // ,{Name: "定额_材料费", Title: "", Key: "material", Order: "ascend"}
+    // ,{Name: "定额_机械费", Title: "", Key: "machine", Order: "ascend"}
+    // ,{Name: "定额_机上人工费", Title: "", Key: "machineLabour", Order: "ascend"}
+    // ,{Name: "定额_人工费调整", Title: "", Key: "adjustLabour", Order: "ascend"}
+    // ,{Name: "定额_材料费调整", Title: "", Key: "'adjustMaterial'", Order: "ascend"}
+    // ,{Name: "定额_机械费调整", Title: "", Key: "adjustMachine", Order: "ascend"}
+    // ,{Name: "定额_机上人工费调整", Title: "", Key: "adjustMachineLabour", Order: "ascend"}
+    // ,{Name: "定额_人工价差", Title: "", Key: "labourDiff", Order: "ascend"}
+    // ,{Name: "定额_材料价差", Title: "", Key: "materialDiff", Order: "ascend"}
+    // ,{Name: "定额_机械价差", Title: "", Key: "machineDiff", Order: "ascend"}
+    // ,{Name: "定额_风险费用", Title: "", Key: "risk", Order: "ascend"}
+    // ,{Name: "定额_管理费率", Title: "", Key: ""}
 ];
 const exposed_prj_glj_properties = [
     {Name: "工料机_ID", Title: "", Key: "ID"},

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

@@ -7,7 +7,10 @@
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>报表模板编辑器</title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
-    <!-- <link rel="stylesheet" href="css/bootstrap/themes.css">-->
+    <!--
+    <link rel="stylesheet" href="/web/users/css/bootstrap.min.css">
+    <link rel="stylesheet" href="css/bootstrap/themes.css">
+    -->
     <link rel="stylesheet" href="/web/maintain/report/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <!--zTree-->
@@ -28,7 +31,8 @@
             <span class="header-logo px-2">Smartcost</span>
             <div class="navbar-text"><a>报表模板库</a> > <a id="rpt_tpl_display_label">...</a></div>
         </nav>
-        <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
+        <nav class="navbar navbar-toggleable-lg navbar-light p-0">
+            <div>
             <ul class="nav nav-tabs" role="tablist">
                 <li class="nav-item">
                     <a class="nav-link px-3" href="#"><i class="fa fa-sign-out fa-flip-horizontal" aria-hidden="true"></i></a>
@@ -37,12 +41,31 @@
                     <a class="nav-link px-3" href="#"><i class="fa fa-sign-out" aria-hidden="true"></i></a>
                 </li>
                 <li class="nav-item">
-                    <a class="nav-link active px-3" ><select class="form-control form-control-sm" id="compilations" onchange="zTreeOprObj.getReportTemplateTree(this)"></select></a>
+                    <a class="nav-link px-3" ><select class="form-control form-control-sm" id="compilations" onchange="zTreeOprObj.getReportTemplateTree(this)"></select></a>
                 </li>
                 <li class="nav-item">
-                    <a class="nav-link active px-3" ><select class="form-control form-control-sm" id="engineerIds"></select></a>
+                    <a class="nav-link px-3" ><select class="form-control form-control-sm" id="engineerIds"></select></a>
                 </li>
             </ul>
+            </div>
+            <div>
+                <label class="form-check-label">
+                    <input class="form-check-input" type="radio" name="rpt_templates_type_grp" id="commonRptOpt" checked="true" onchange="zTreeOprObj.changeUser(this)"> 公共类型
+                </label>
+                <label class="form-check-label"> </label>
+                <label class="form-check-label">
+                    <input class="form-check-input" type="radio" name="rpt_templates_type_grp" id="custRptOpt" onchange="zTreeOprObj.changeUser(this)"> 定制类型
+                </label>
+                <label class="form-check-label"> </label>
+            </div>
+            <div class="btn-group">
+                <div class="input-group">
+                    <input type="text" class="form-control input-sm" id="rpt_user_input" placeholder="手机/邮箱/姓名/公司" disabled="true">
+                    <span class="input-group-btn">
+                        <button class="btn btn-primary" id="rpt_user_find_btn" onclick="" disabled="true">查询</button>
+                    </span>
+                </div>
+            </div>
         </nav>
     </div>
     <div class="main">