`
zengshaotao
  • 浏览: 753244 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

树形节点设权重,叶子节点设权重

 
阅读更多

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html lang="en">

<head>

<base href="<%=basePath%>">

    <title></title>

    

    <meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

 

    <!-- 组织机构树插件的引入文件 -->

    <link rel="stylesheet" href="<%=request.getContextPath()%>/jsp/jorgchart/css/jquery.jOrgChart.css"/>

    <link rel="stylesheet" href="<%=request.getContextPath()%>/jsp/jorgchart/css/custom.css"/>

    <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-easyui-1.2.6/jquery-1.7.2.min.js"></script>

    <script type="text/javascript" src="<%=request.getContextPath()%>/jsp/jorgchart/jquery.jOrgChart.js"></script>

 

<!-- jquery easy ui 需要的引入文件 -->

<!-- <link rel="stylesheet" type="text/css" href="css/common.css" /> -->

<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/default/easyui.css" />

<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/icon.css" />

<script type="text/javascript" src="js/jquery-easyui-1.2.6/jquery.easyui.min.js"></script>

<script type="text/javascript" src="js/jquery-easyui-1.2.6/locale/easyui-lang-zh_CN.js"></script>

 

    <script type="text/javascript">

 

var nodeInfoContainer= [];//存储所有评分组所有的节点

 

//存储规则的分配权重,要注意不同的叶子评分组设置规则的问题

//第一位存储的是叶子评分组的id和实际权重,之后存储的是规则的权重和分配权重信息

var ruleWeightArr= [];

 

    $(document).ready(function () {

queryCardTree();

$('#searchbtn').click(function(){

            checkGroupWeight();

});

        });

        

        function clickLeafNode(nodeId){

        var obj = event.srcElement;

        //第一次点击某个叶子评分组

        if(ruleWeightArr.length==0){

        ruleWeightArr[0] = nodeId+"@"+obj.id;

        }else{

        if(ruleWeightArr[0].split("@")[0]==nodeId){

        //多次点击了同一个叶子评分组,准备重新设置该节点下的规则权重

        }else{

        //设置不同的叶子评分组下的规则权重,这个时候要清除之前保存的其他评分组的规则的分配权重信息

        ruleWeightArr = [];

        ruleWeightArr[0] = nodeId+"@"+obj.id;

        }

        }

       

        $("#estimate_group_map_id").dialog("open").dialog("setTitle",obj.title);

        //加载数据

    $('#ruleWeight').datagrid({

                width: 'auto',  

                height: "380",//auto的话表格高度会随着数据的变化而变化               

                striped: true,  

                singleSelect : true,  

                url:'<%=request.getContextPath()%>/EstimateGroupManage.do?method=searchRuleWeightByGroupId&nodeId='+nodeId ,

                //queryParams:{},  

                loadMsg:'数据加载中请稍后……',  

                pagination: true,  

                rownumbers: true,     

                columns:[[

                    {field:'GROUP_ID',title: '评分组ID',align: 'center',width: 80,hidden:true},

                    {field:'FOLDER_NAME',title: '评分组名称',align: 'center',width: 140,hidden:true},  

                    {field:'CHECK_ID',title: '规则ID',align: 'center',width: 80},

                    {field:'SYS_ID',title: 'schema',align: 'center',width: 80},  

                    {field:'TABLE_NAME',title: '表名',align: 'center',width: 120},

                    {field:'CHECK_COLUMN_NAME',title: '字段名',align: 'center',width: 80},

                    {field:'WEIGHT',title: '实际权重',align: 'center',width: 50},

                    {field:'DIS_WEIGHT',title: '分配权重',align: 'center',width: 50,formatter:function(value , record , index){

var str = "<input type='text' id='"+record.CHECK_ID+"' value='"+value+"' onblur='modifyDisWeight(this)' />";

return str;

}},  

                    {field:'START_DT',title: '创建日期',align: 'center',width:200,formatter:function(value , record , index){

var str = value.substring(0,19);

return str;

}}, 

                    {field:'CREATE_OPER',title: '创建人',align: 'center',width: 100}                                                          

                ]],

                pagination: true , 

pageSize: 100 ,

                pageList:[100,150,200,500]

            }); 

        }

        //权重最终分配之后进行归一化的校验

        function checkGroupWeight(){

       

        //单独加入评分卡这一根节点信息

        for(var i = 0;i<nodeInfoContainer.length;i++){

        var nodeStr = nodeInfoContainer[i];

        var nodeArr = nodeStr.split("@");

        var parId = nodeArr[2];

        if(parId=="-1"){

        //评分卡这一根节点信息的权重默认是1

        nodeArr = nodeArr.join("@")+"@"+1;

        nodeInfoContainer[i] = nodeArr;

        break;

        }

        }

       

        var nodeStr = "";

        //id@name@parId@isleaf@weight

        //对每一个设置过权重的节点进行归一化校验

        for(var i = 0;i<nodeInfoContainer.length;i++){

        nodeStr = nodeInfoContainer[i];

        var nodeArr = nodeStr.split("@");

        var leaf = nodeArr[3];

        //对每一个节点,只要检查自身下级节点的权重是否归一就行

        var nodeId = nodeArr[0];

        if(leaf=="1"){

        //叶子节点不做检查

        continue;

        }else{

        var parId="";

        var nodeChild=[];

        //找出每一个非叶子节点的子节点

        for(var k = 0;k<nodeInfoContainer.length;k++){

        parId = nodeInfoContainer[k].split("@")[2];

        if(parId==nodeId){

        nodeChild.push(nodeInfoContainer[k]);

        }

       }

var weightCheck = 0;

var childWeight=0;

 

//还有未设置子节点权重的节点

if(nodeChild.length==0){

alert("还有未设置子节点权重的节点!");

return;

}else{

for(var k = 0;k<nodeChild.length;k++){

       childWeight = nodeChild[k].split("@")[4];

       weightCheck = parseFloat(weightCheck) + parseFloat(childWeight);

       }

       //容易出现0.9999999999这样的计数问题

       weightCheck = parseFloat(weightCheck.toFixed(4));

       if(weightCheck !=1.0000){

       alert("【"+nodeArr[1]+"】节点下的所有子节点的权重之和应该为1,目前是:"+weightCheck);

       return;

       }

}

        }//non leaf node

        }// for every set weight

       

        var rootNode = getRootNode();

        //从根节点开始,自顶向下递归计算每一个节点的实际权重

        calChildOfCurrNode(rootNode);

        //alert(nodeInfoContainerWeight);

        //将最新的权重分配信息更新到数据库

        updateGroupWeight(nodeInfoContainer);

        }

        

        function updateGroupWeight(nodeInfoContainerWeight){

           //这里传入json参数格式为{issueNoParams:issueNos.join(",")},issuesNos是数组,一定要拼接成字符串

           $.post('<%=request.getContextPath()%>/EstimateGroupManage.do?method=updateWeight',{estimateGroupWeight:nodeInfoContainerWeight.join(",")},

           function(result){

           $.messager.alert("提示",result.resultInfo,"icon-ok");

               },'json');

        }

        

        function getRootNode(){

        var rootNode;

        for(var k = 0;k<nodeInfoContainer.length;k++){

    parId = nodeInfoContainer[k].split("@")[2];

    if(parId=="-1"){

    nodeInfoContainer[k] = nodeInfoContainer[k]+"@"+1;

    rootNode = nodeInfoContainer[k];

    break;

    }

       }

       return rootNode;

        }

        

        //id@name@parId@isleaf@dis_weight@actureWeight

        function calChildOfCurrNode(currObj){

       

        var parId = "";

        var leaf = "";

        var childWeight;

        var currNodeId = currObj.split("@")[0];

        var currNodeWeight = currObj.split("@")[5];//当前节点的实际权重

        for(var k = 0;k<nodeInfoContainer.length;k++){

        var currNodeChild = nodeInfoContainer[k];

        var nodeInfoArr = currNodeChild.split("@");

    parId = nodeInfoArr[2];

    leaf = nodeInfoArr[3];

    childWeight = nodeInfoArr[4];//当前节点的孩子节点的分配权重

    if(parId==currNodeId){

    if(leaf=="0"){

    //非叶子节点开始计算

    var newWeight = (parseFloat(currNodeWeight)*parseFloat(childWeight)).toFixed(4);

    nodeInfoArr[5] = newWeight;

    nodeInfoContainer[k] = nodeInfoArr.join("@");

    //需要将最新的节点信息进行传递

    calChildOfCurrNode(nodeInfoContainer[k]);

    }else if(leaf=="1"){

    var newWeight = (parseFloat(currNodeWeight)*parseFloat(childWeight)).toFixed(4);

    nodeInfoArr[5] = newWeight;

    nodeInfoContainer[k] = nodeInfoArr.join("@");

    }

    }

       }//for block

       

       //alert(nodeInfoContainer);

        }

        //每个节点的blur事件

        function setNodeWeight(obj){

        var nodeStr;

        //id@name@parId@isleaf@weight@actureWeight

for(var i = 0;i<nodeInfoContainer.length;i++){

//先拿到还未设置权重的节点信息

        nodeStr = nodeInfoContainer[i];

        var nodeArr = nodeStr.split("@");

        var nodeId = nodeArr[0];

        //更新刚刚设置过的节点权重

        if(obj.id==nodeId){

        //设置了权重之后的节点信息:分配权重

        nodeArr[4] = obj.value;

        nodeInfoContainer[i] = nodeArr.join("@");

        break;

        }else{

        continue;

        }

        }//for every node

 

        }

        function queryCardTree(){

       

        $("#estimateGroupEditForm").form('submit',{

       url: '<%=request.getContextPath()%>/EstimateGroupManage.do?method=weightSetTree',

       onSubmit: function(param){

       //除了表单的元素,再提交自定义的参数

           return true;

       },

       success: function(result){

       var result = eval('('+result+')');

       

         //这里直接定义,那么每次加载时都会创建

         var html = $("#org").html();//得到ul里面的html代码

         if(html !=null){

         $("#org").html("");//这里对org里面的标签内容进行了清空

         var showlist = $("#org");

         showall(result, showlist);

          $("#bodyId").append(showlist);

         $("div.jOrgChart").html("");//清除了里面的内容,但是div对象本身还是存在,会占用默认的页面空间

         $("div.jOrgChart").remove();//真正清除页面上生成的div

         //每次都会生成div

                   $("#org").jOrgChart();

         }else{

         //第一次查询,需要生成一定的数据结构对象

         var showlist = $("<ul id='org' style='display:none'></ul>");

                   showall(result, showlist);

                   //将生成好的固定格式的ul拼接到body,ul必须要依赖容器才能存在

                   $("#bodyId").append(showlist);

                   $("#org").jOrgChart();

         }

       }

   });

        }

        

         //menu_list为json数据

        //parent为要组合成html的容器

        function showall(menu_list, parent) {

            for (var menu in menu_list) {

            //已经将所有的节点信息都保存起来了

            nodeInfoContainer.push(menu_list[menu].id+"@"+menu_list[menu].name+

            "@"+menu_list[menu].parId+"@"+menu_list[menu].isLeaf

            +"@"+menu_list[menu].disWeight+"@"+menu_list[menu].weight);

                if (menu_list[menu].children.length > 0) {

                //有子节点

                var li = $("<li></li>");

                if(menu_list[menu].parId=="-1"){

                //评分卡的权重是1,并且不可输入

                    $(li).append(" <a  href='javascript:void(0)' style='width:50px;text-decoration:none' >" 

                   + menu_list[menu].name

                   +"<br>权重:<input type='text' value='1' readonly style='text-align:center;width:50px;border:0px' /></a>")

                    .append("<ul></ul>")

                    .appendTo(parent);

                }else{

                //将li的文本设置好,并马上添加一个空白的ul子节点,并且将这个li添加到父亲节点中

                    $(li).append(" <a  href='javascript:void(0)' style='width:50px;text-decoration:none' >" 

                   + "<font size='2' color='black'>"+ menu_list[menu].name+"</font>"

                   +"<br><font size='0.6'>分配权重</font>:<input type='text' value='"+menu_list[menu].disWeight+"' id='"+menu_list[menu].id+"' onblur='setNodeWeight(this)' style='width:50px'/>"

                   +"<font size='0.6'>实际权重</font>:<input type='text' value='"+menu_list[menu].weight+"' style='width:50px;border:0px'/></a>")

                    .append("<ul></ul>")

                    .appendTo(parent);

                }

                    //将空白的ul作为下一个递归遍历的父亲节点传入

                    showall(menu_list[menu].children, $(li).children().eq(1));

                }else {

                //如果该节点没有子节点,则直接将该节点li以及文本创建好直接添加到父亲节点中

                    $("<li></li>")

                    .append(" <a href='javascript:void(0)' id='"+menu_list[menu].weight+"' title='"+menu_list[menu].name+"' onclick='clickLeafNode("+ menu_list[menu].id+ ")' style='width:50px;text-decoration:none'>" 

                    + "<font size='2' id='"+menu_list[menu].weight+"' color='black'>"+ menu_list[menu].name+"</font>"

                    +"<br><font size='0.6'>分配权重</font>:<input type='text' onclick='stopPop()' value='"+menu_list[menu].disWeight+"' id='"+menu_list[menu].id+"' style='width:50px' onblur='setNodeWeight(this)'/>"

                    +"<font size='0.6'>实际权重</font>:<input type='text' onclick='stopPop()' value='"+menu_list[menu].weight+"' style='width:50px;border:0px'/></a>")

                    .appendTo(parent);

                }

            }

        }

        

        //阻止事件的冒泡,防止点击输入框时执行了a里的onclick方法

        function stopPop(){

        //IE阻止事件冒泡的机制

        window.event.cancelBubble = true; 

        //event.stopPropagation();

        }

        //点击 权重确认时进行归一化校验

       function ruleWeightCheck(){

       var weight=0;

       for(var k = 1;k<ruleWeightArr.length;k++){

       weight = parseFloat(weight) + parseFloat(ruleWeightArr[k].split("@")[1]);

   }

   weight = parseFloat(weight.toFixed(4));

   if(weight >1){

   $.messager.alert("提示","规则的分配权重之和不能超过1!","icon-ok");

   return ;

   }

   //校验通过后,前端计算规则的实际权重

   calRuleWeight();

   updateRuleWeight();

       }

       

       function calRuleWeight(){

       

       var groupWeight = ruleWeightArr[0].split("@")[1];

       //ruleWeightArr只存储了设置过的规则权重,而不是全部的

       var tmp;

       for(var k = 1;k<ruleWeightArr.length;k++){

       tmp = parseFloat(ruleWeightArr[k].split("@")[1])*parseFloat(groupWeight);

       tmp = parseFloat(tmp.toFixed(4));

       ruleWeightArr[k] = ruleWeightArr[k]+"@"+tmp;

   }

   //alert(ruleWeightArr);

       }

       

       //校验通过后更新规则的权重和分配权重数据

       function updateRuleWeight(){

       $.post('<%=request.getContextPath()%>/EstimateGroupManage.do?method=updateRuleWeight',{ruleWeight:ruleWeightArr.join(",")},

           function(result){

           $.messager.alert("提示",result.resultInfo,"icon-ok");

           $("#ruleWeight").datagrid('reload');

           ruleWeightArr = [];//更新了权重之后需要置空已经修改过的规则权重

               },'json');

       }

       

       //前端修改和存储规则的分配权重

       function modifyDisWeight(obj){

       

       var nodeArr = obj.id+"@"+obj.value;

       var exist = false;

     var index;

     //需要遍历所有的节点,才知道当前校验的节点是否已经设置过权重

     //id@disweight

     //数据第一位存储的是评分组的id,所以要从第二位开始校验

     for(var k = 1;k<ruleWeightArr.length;k++){

     if(ruleWeightArr[k].split("@")[0]==obj.id){

exist = true;

index = k;

   }

   }

if(exist){

//已经设置过节点的权重信息,这里就要覆盖,而不是重新添加

ruleWeightArr[index] = nodeArr;

}else{

ruleWeightArr.push(nodeArr);

}

       //alert(ruleWeightArr);

       }

    </script>

  </head>

 

<body id="bodyId">

 

<div id="estimate_group_map_id" class="easyui-dialog" closed="true"

   style="width:700px;height:450px;" buttons="#ruleWeight_buttons">

<div class="ftitle"><!-- title信息,根据增加和修改按钮动态变化 --></div>

<table id="ruleWeight"></table> 

</div>

  <div id="ruleWeight_buttons" style="text-align:center">

        <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-ok" onclick="ruleWeightCheck()" style="">权重确认</a>

    </div>

   

<form id="estimateGroupEditForm" method="post">

 

<input name="check_date" type="hidden" id="check_date" value="" style="width:120px" />

   <a id="searchbtn" class="easyui-linkbutton" style="margin-left:20px">权重确认</a>

   

</form>

       

 

</body>

</html>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics