<%@ 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>
相关推荐
本文提出的“多重链接微博网络节点权重计算方法”是针对这一需求的一种解决方案。该方法考虑了微博网络的特殊性,即用户间的互动不仅限于单向关注,还可能包括转发、评论等多种形式的连接,这些被称为多重链接。通过...
在二叉树问题中,寻找两个叶子节点之间的最长路径是一个典型的图论问题,可以转换为在树中找到具有最大权重的路径。这个问题的关键在于非递归的解决方案,它通常涉及广度优先搜索(BFS)或深度优先搜索(DFS)算法。...
通过JavaScript,我们可以轻松地实现树形菜单的交互效果,如节点的展开、折叠、动态加载以及根据权重动态排序等。JavaScript库和框架,如jQuery、React、Vue等,提供了丰富的工具和方法,简化了树形菜单的开发工作。...
本主题将深入探讨如何利用 Chebfun 系统来计算高斯-Legendre 正交节点和权重,这对于数值积分、插值以及求解偏微分方程等应用至关重要。 高斯-Legendre 正交节点和权重是数值分析中的基本概念,它们在多项式插值和...
它通过构造一个带权重的二叉树,使得从根节点到每个叶子节点的路径上的权值之和(路径长度)达到最小,从而实现高效的数据存储和传输。 建立哈夫曼树的过程通常分为以下几个步骤: 1. **创建哈夫曼节点**:首先,...
此脚本计算 Legendre-Gauss-Radau 正交的节点和权重以及光谱搭配方法的 LGR-vandermonde 矩阵。 节点是 P_N(x)+P_{N+1}(x) 的零点,其中包括 x=-1 处的固定横坐标。 另请参阅我使用 Legendre 多项式的 Gauss 和 ...
接着根据边的权重大小将其分成两组,再利用 `spring_layout()` 方法计算节点的位置。最后通过 `draw_networkx_nodes()` 和 `draw_networkx_edges()` 方法绘制节点和边,并通过 `draw_networkx_labels()` 添加节点...
2. **合并节点**:在所有节点中选择两个权重最小的节点,将它们合并为一个新节点,并且新节点的权重为其两个子节点权重之和。 3. **重复步骤2**:直到所有节点合并成一个根节点,此时形成的树即为哈夫曼树。 #### ...
高斯积分的核心思想是找到一组特定的节点(Gauss points)和相应的权重(weights),使得对于所有在节点处连续的二次多项式,积分的近似值与真实值相等。在三角形上进行高斯积分时,我们需要找到这些特定的节点位置...
此脚本计算 Legendre-Gauss-Lobatto 正交的节点和权重,以及光谱方法的 LGL-vandermonde 矩阵。 节点是 (1-x^2)*P_N(x) 的零点,其中包括端点。 对于纯高斯正交,Chebyshev 在数值上更好,并且 Lebesgue 常数低于 ...
% 输入待定位节点与各个锚节点的距离、锚节点位置、权重(可选),输出待测点位置 % Ver2:输入添加气压高度值用于校正距离 % Evand/2024年3月19日 % airghight 由气压高度计算的锚节点-待测节点的相对高度,按行...
3. **合并节点**:每次从堆中取出两个最小的节点,创建一个新的内部节点,该节点的权重为两个子节点权重之和,然后将新节点插入到堆中。 4. **重复步骤3**:直到堆中只剩下一个节点,这个节点就是哈夫曼树的根节点。...
算法的核心是将实际问题转化为树形网络,其中边的权重表示衰减量。这里采用后序遍历(Post-Order Traversal)策略,因为我们需要先处理子节点再处理父节点。遍历过程中,对于每个节点,我们检查其左右子节点是否需要...
Bogaert的“高斯-勒格德式正交节点和权重的无迭代计算”中开发的公式计算高斯-勒格德式正交节点和权重,该公式发表在SIAM科学计算杂志上(永久链接:http:// dx (doi.org/10.1137/140954969)。 关键特征是:-...
它通常涉及到树的遍历、节点的权重以及通过一系列决策达到最优解的过程。在朱全民的讲座中,他介绍了两个典型的树形动态规划问题:加分二叉树和选课问题。 1. 加分二叉树: 这个问题的目标是构建一个中序遍历为1,2,...
对于一个无权网络,先考虑网络全局信息,计算出每个节点的特征中心向量值,将边两端节点值的和作为边的权重,从而构成一个加权网络;然后根据加权网络的局部信息求出加权网络的度。基于SIR模型的四个实证网络,实验...
哈夫曼树的构建过程是从叶子节点开始,逐渐构建树形结构,直到根节点。 哈夫曼树的节点结构体中包括三个成员变量:weight、parent、lchild和rchild。其中,weight表示节点的权重,parent表示节点的父节点,lchild和...
而“点权”可能是指树上每个节点赋予一定权重,树形DP需要根据这些权重来求解问题。 此外,“能选则选V”可能指的是在树形DP中对于某些选择题目的决策过程,需要根据某种原则来确定是否选择一个节点;“D66”可能是...
例如,在解决树的最短路径问题时,我们可以定义节点的状态为该节点到根节点的最短距离,然后设计一个转移方程,将子节点的最短距离加起来,加上从当前节点到子节点的边的权重,得到当前节点的最短距离。在实际编程...