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

树形节点层次得分计算

 
阅读更多

#!/usr/bin/perl

###############################################################################

# Program : estimateScore.pl 计算评分卡的得分

# Scrpition: 执行本数据字段批量检查需要以下几个步骤

# Version :

###############################################################################

use strict;#对语法做严格限制,如变量必须先用my声明

use DBI;

use Time::Local;

 

my $dbh;#与数据库的连接

my @Fieldrow;

# my $logFile;

# #日志文件目录

# #一个大于号,表示覆盖原有文件的内容

# #两个大于号表示在原有文件内容之后添加

# my $lfnowtime =GetNowDate();

# open $logFile,">checkLog$lfnowtime.txt";

# select $logFile;

 

 

#连接TD数据库

sub TDconnect(){

$dbh = DBI->connect("dbi:ODBC:mds_192.168.174.129", "dbc", "dbc") or "Can't connect to sample database: $DBI::errstr";

print "Connection is successful !!\n";

return $dbh;

}

 

 

#当前机构及其下属机构检查涉及的规则得分

sub calRuleScore{

print("-----------------------------calRuleScore begin-----------------------------\n");

my ($orgId,$rundate,$cardId )= @_; 

print("calRuleScore para : $orgId  \n");

my $orgInfoSQL = " WITH  recursive temporg(id,name,pid,leveld) as( ".

" select a.branch_id,a.branch_name,a.par_branch_id,0 from  bohz_appmds.tap_c_branch_all  a where branch_id = $orgId union all ".

"select a.branch_id,a.branch_name,a.par_branch_id,c.leveld+1 from bohz_appmds.tap_c_branch_all a ,temporg c where  c.id = a.par_branch_id and leveld<7)".

"select id from temporg";

 

my $sth = $dbh->prepare($orgInfoSQL) or return -1;

my $ret = $sth->execute() or return -1;  

my $orgInfo = $sth->fetchall_arrayref();

$sth->finish();

my $orgPin ;

for(my $i = 0 ;$i<$#${orgInfo};$i++){

 

$orgPin = $orgPin."'".$orgInfo->[$i][0]."',";

}

$orgPin = $orgPin."'".$orgInfo->[$#${orgInfo}][0]."'";

# print("orgPin: $orgPin  \n");

 

#1.当前机构的通过率,应该是包含所有下级的统计值

my $resultSQL = 

"select main.check_id, weight,main.pass_rate,main.pass_rate*weight*100 as score ".

"from ".

"(select check_id,cast(sum(passcount) as DEC(8,2))/sum(effect_count) as pass_rate ".

"from appdqc.check_result where rundate=date'$rundate' and org_id in ($orgPin) group by check_id) main ".

"inner join appdqc.estimate_checkid_relation r on main.check_id = r.check_id" ;

 

 

my $ruleScoresth = $dbh->prepare($resultSQL) or return -1;

my $ret = $ruleScoresth->execute() or return -1;  

 

#将每一个规则的得分,按照机构,日期的维度进行存储

while (@Fieldrow = $ruleScoresth->fetchrow() ) { # Fieldrow一维数组

 

my $check_id = "$Fieldrow[0]"; 

my $score = "$Fieldrow[3]";

print("check_id: $check_id,org_id: $orgId,score : $score  \n");

my $insertGroupSQL = "insert into appdqc.rule_score values(date'$rundate','$check_id','$orgId','$score','$cardId')";

my $sth = $dbh->prepare($insertGroupSQL) or  return -1;

my $ret = $sth->execute() or return -1;  

$sth->finish();

}

$ruleScoresth->finish();

print("-----------------------------calRuleScore   end -----------------------------\n");

return 0;

 

}

 

sub calNodeScore{

print("-----------------------------calNodeScore  begin-----------------------------\n");

my ($curr_folder_id,$orgId,$rundate) = @_;#定义的变量需要用括号括起来,因为@_得到的是一个数组

my $currNodeScore;

my $maxScore;

print("curr_folder_id:$curr_folder_id \n");

 

#计算当前节点的得分(需要递归计算所有下级的得分)

my $pfkSQL = "select folder_id,isleaf,weight from appdqc.estimate_group where status=1 and par_folder_id='$curr_folder_id'";

my $Nodesth = $dbh->prepare($pfkSQL) or  return -1;

$Nodesth->execute() or return -1; 

while(my @Fieldrow = $Nodesth->fetchrow()){

my $child_folder_id = "$Fieldrow[0]";

my $isleaf = "$Fieldrow[1]";

if("0" eq $isleaf ){

#当前节点的非叶子子节点的计算结果

my $scoreAndMaxScore = calNodeScore($child_folder_id,$orgId,$rundate);

my @childNodeScoreArr = split("#",$scoreAndMaxScore);

my $childNodeScore = @childNodeScoreArr[0];

my $childNodeMaxScore = @childNodeScoreArr[1];

$currNodeScore += $childNodeScore;

$maxScore += $childNodeMaxScore;

}else{

# 当前节点的叶子子节点

print ("$child_folder_id is  leafNode \n");

# 结果集理论只有一条

my $leafScoreSQL = "select ec.score,ec.weight from appdqc.estimate_card_score ec inner join estimate_group eg on ec.folder_id='$child_folder_id' "

."and ec.org_Id='$orgId' and rundate = date'$rundate' ";

 

my $Leafsth = $dbh->prepare($leafScoreSQL) or  return -1;

$Leafsth->execute() or return -1;  

my @Fieldrow = $Leafsth->fetchrow();

my $s = "$Fieldrow[0]";

my $ms = "$Fieldrow[1]";

print("leaf score   :$s  \n");

$currNodeScore += $s ;

$maxScore += $ms;

$Leafsth ->finish();

}

}

my $insertNodeScoreSQL = "insert into appdqc.estimate_card_score  ".

"select '$orgId',date'$rundate',folder_id,par_folder_id,folder_name,'$maxScore','$currNodeScore' from appdqc.estimate_group  ".

" where folder_id = $curr_folder_id";

my $insertNodesth = $dbh->prepare($insertNodeScoreSQL) or return -1;

$insertNodesth  ->execute() or return -1;

$insertNodesth ->finish();

$Nodesth->finish();

 

print("-------------------------------calNodeScore  End  ---------------------------\n");

return $currNodeScore."#".$maxScore;

}

 

#计算评分卡值得入口

sub calCardscore{

print("--------------------------------calCardscore begin --------------------------\n");

my ($nodeId,$runDate,$orgId) = @_;

my $cardScoreStr = calNodeScore($nodeId,$orgId,$runDate);#通过调用递归的计算节点的得分,最终求得评分卡最终的得分

my @cardScoreArr = split("#",$cardScoreStr);

my $cardScore = @cardScoreArr[0];

my $cardScoreMax = @cardScoreArr[1];

 

my $cardScoreinsert = "insert into appdqc.estimate_card_score ".

"select '$orgId',date'$runDate',folder_id,par_folder_id,folder_name,'$cardScoreMax','$cardScore' from appdqc.estimate_card ".

" where folder_id='$nodeId' and status='1' ";

 

my $cardScoresth = $dbh->prepare($cardScoreinsert) or return -1;

$cardScoresth ->execute() or return -1;

$cardScoresth->finish(); 

 

print("--------------------------------calCardscore end   --------------------------\n");

 

}

 

sub calLeafNodeScore{

my ($nodeId,$runDate,$orgId) = @_;

print("--------------------------------calLeafNodeScore begin --------------------------\n");

#递归计算评分卡下所有的叶子评分组

my $cardGroupsql = "WITH  recursive temptab(id,name,pid,isleaf,leveld) as(".

" select a.folder_id,a.folder_name,a.par_folder_id,a.isleaf,0 from appdqc.estimate_group a where par_folder_id ='$nodeId' union all ".

" select a.folder_id,a.folder_name,a.par_folder_id,a.isleaf,c.leveld+1 from appdqc.estimate_group a ,temptab c".

" where  c.id = a.par_folder_id and status='1' and leveld<7)".

" select id from temptab where isleaf = '1' ";

my $cardGroupsqlSth = $dbh->prepare($cardGroupsql) or return -1;

$cardGroupsqlSth ->execute() or return -1;

 

while(my @Fieldrow = $cardGroupsqlSth->fetchrow()){

my $groupId = "$Fieldrow[0]";

my $gs = "0";

my $groupId_rule_sql = "select er.check_id,er.weight*100,rs.score from appdqc.estimate_checkid_relation er ".

" inner join rule_score rs on er.check_id = rs.check_id  " . "where folder_id='$groupId' ".

" and status = '1' and org_id = '$orgId' and rundate = date'$runDate'"; 

my $groupId_rulegroupsth = $dbh->prepare($groupId_rule_sql) or return -1;

my $length = $groupId_rulegroupsth ->execute() or return -1;

 

my $maxScore="0";

my $gs = "0";

# 在评分组下的规则的权重和得分加权求和之后得到叶子评分组的得分

while(@Fieldrow = $groupId_rulegroupsth->fetchrow()){

my $s = "$Fieldrow[2]";

my $max = "$Fieldrow[1]";

$gs += $s;

$maxScore += $max;

}

$groupId_rulegroupsth ->finish();

# print(" folder_id : $groupId ,average : $average ");

#将每一个叶子节点的得分插入到estimate_card_score 节点得分表中,变量中不加单引号,会出现插入数据表中的数据结尾出现‘.’

# estiamte_card_score 联合唯一主键  orgId rundate folder_id

my $insertCardScoreSQL  = "insert into appdqc.estimate_card_score ".

"select '$orgId',date'$runDate',folder_id,par_folder_id,folder_name,'$maxScore','$gs' from appdqc.estimate_group ".

" where folder_id='$groupId' and status = '1' ";

# print "$insertCardScoreSQL \n";

my $insertCardScoresth = $dbh->prepare($insertCardScoreSQL) or return -1;

$insertCardScoresth ->execute() or return -1;

$insertCardScoresth ->finish();

 

}

$cardGroupsqlSth->finish();

print("--------------------------------calLeafNodeScore end  --------------------------\n");

}

 

sub main{

print "--------------------------------------------main begin--------------------------------------------\n ";

#得到数据库连接----TD库连接

TDconnect();

 

my $rundatesql = "select max(rundate) from appdqc.check_result ";

my $rundateSth = $dbh->prepare($rundatesql) or return -1;

$rundateSth ->execute() or return -1;

my @Fieldrow = $rundateSth->fetchrow();

#my $rundate = "$Fieldrow[0]";

$rundateSth ->finish();

my $rundate = $ARGV[0];

 

my $deleteHistory  = "delete from appdqc.estimate_card_score where rundate = date'$rundate' ;".

"delete from appdqc.rule_score where rundate = date'$rundate' ;";

 

my $deleteHistorySth = $dbh ->prepare($deleteHistory) or return -1;

$deleteHistorySth ->execute() or return -1;

$deleteHistorySth ->finish();

print("deleteHistory : succeed  \n");

print("rundate : $rundate  \n");

 

#需要计算到三级机构的得分

 

my $getOrg = "select branch_id from  bohz_appmds.tap_c_branch where branch_id in ( '3401020316','3401040438','3401030216','3400008888','3401010008')order by branch_id " ;

my $getOrgsth = $dbh->prepare($getOrg) or return -1;

$getOrgsth ->execute() or return -1;

while(my @Fieldrow = $getOrgsth->fetchrow()){

my $branchId = "$Fieldrow[0]";

#print "*****一次只能计算一个评分卡 *********\n";

my $cardInfo = "select folder_id from appdqc.estimate_card where status = '1' and folder_id='1' ";

my $cardInfoSth = $dbh ->prepare($cardInfo) or return -1;

$cardInfoSth->execute() or return -1;

while(my @Fieldrow = $cardInfoSth->fetchrow()){

my $cardId = "$Fieldrow[0]";

#递归计算树形节点的得分,并插入到estimate_card_score树形节点得分信息表中

calRuleScore($branchId,$rundate,$cardId);

calLeafNodeScore($cardId ,$rundate,$branchId);

calCardscore($cardId ,$rundate,$branchId);#参数为用户的输入节点ID

}

 

}

$getOrgsth ->finish();

print "--------------------------------------------main end --------------------------------------------\n ";

}

 

#找到当前的日期,月份要加1,年份是从1900开始算的

sub GetNowDate{

my ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(); 

$mon = sprintf("%02d", $mon+1);

$day = sprintf("%02d", $day);

my $stime = ($year+1900).$mon.$day;

return $stime;

}

 

my $rc = main();#函数的入口

exit($rc);

 

分享到:
评论

相关推荐

    VB6采用分数维思想画树的源码

    7. **颜色和样式**:为了使树形结构更具视觉吸引力,源码可能包含对节点颜色、线条样式和粗细的设置,以体现层次感和结构差异。 8. **用户交互**:用户可能可以控制树的展开、折叠,甚至调整分数维参数,以观察不同...

    运动会分数统计课程设计

    3. **树**:如果需要对学校进行层次化的管理,比如按照地区划分,可以使用树形结构,每个节点代表一个学校,子节点代表下属的分校或其他分类。 4. **哈希表**:为了实现按学校名称快速查找和排序,可以使用哈希表,...

    MFC 二叉树应用 数据结构 心理测验

    在MFC中,`CTreeCtrl` 类提供了树形控件的功能,它允许开发者创建一个可以展开和折叠的层次结构,非常适合用来展示具有层级关系的数据,如文件系统目录、组织架构等。二叉树可以被映射到`CTreeCtrl` 中,每个节点...

    中国大学MOOC浙江大学数据结构课程____数据结构作业

    2. 树形结构:树是数据结构中的非线性结构,用于模拟具有层次关系的数据。二叉树、二叉搜索树、平衡树(如AVL树和红黑树)都是常见的树形结构。掌握树的遍历(前序、中序、后序)和基本操作对于解决复杂问题至关重要...

    数据结构实验报告(3).docx

    表达式树是一种直观的数据结构,它通过树形结构表示运算的层次关系。每个非叶节点代表一个运算符,而叶节点则代表操作数。从根节点开始,通过遍历树来计算整个表达式的值。对于含有括号的表达式,需要先解决括号内的...

    2021-2022计算机二级等级考试试题及答案No.15563.docx

    19. 数据库模型:层次模型是一种用树形结构表示实体间联系的数据模型。 20. 循环语句:双层循环中,内层循环S语句的执行次数为n(n+1)/2,这里是组合计数问题。 21. Excel图表:条形图用于比较各个项目的数量或值,...

    单位分数和表1解的树结构 (2003年)

    具体到文章所描述的问题,在k=3、k=4、k=5时,问题的解被分析并发现具有类似树形结构的特性,从而提出了一种结构化的解法。例如,当k=3时,方程(1)有一个解,而当k=4时,通过计算发现有6个解。这些解的结构化排列被...

    数据结构课程设计——2048游戏闯关版

    比如,设计一个层次结构来表示不同的关卡,每个关卡是一个节点,包含特定的目标分数和初始布局。链表则可用于追踪玩家的进度,每当达到一定分数就将他们链接到下一个关卡。 文件操作在本项目中也扮演着关键角色。读...

    2021-2022计算机二级等级考试试题及答案No.1494.docx

    - 层次模型用树形结构表示实体及其关系。 18. Java输入/输出流: - FileInputStream和FileOutputStream处理字节流,Reader和Writer处理字符流。 - RandomAccessFile支持随机读写文件。 - File类用于文件和目录...

    具有选择性局部注意力和前序信息解码器的代码生成模型.docx

    AST是一种用于表示源代码结构的树形表示,它能捕获代码的语法和语义信息。本文所提出的模型引入了AST,并结合选择性局部注意力机制,以增强解码过程中的上下文理解和单词间的相关性。这种选择性局部注意力允许模型在...

    计算机二级Access历年笔试真题及答案.pdf

    6. 二叉树遍历:后序遍历顺序为左子树-右子树-根节点,所以对于给定的二叉树,后序遍历结果为D) DEBFCA。 7. 满二叉树的叶子节点数:满二叉树中,第n层的叶子节点数是2^(n-1),深度为7的满二叉树叶子节点数为2^6=64...

    2023年全国计算机等级考试二级数据库程序设计.doc

    6. 二叉树遍历:后序遍历顺序为左子树-右子树-根节点。 7. 满二叉树:深度为7的满二叉树有2的7次方减1,即127个叶节点。 8. 实体关系模型:在ER图中,"商品"和"顾客"之间的联系通常为多对多关系。 9. ER图元素:...

    九月全国计算机等级考试二级ACCESS笔试试题及答案.pdf

    6. 二叉树遍历:后序遍历顺序是左子树-右子树-根节点。 7. 深度为7的满二叉树:满二叉树的叶子结点数量可以通过公式2^(h+1) - 1计算,其中h为高度,所以是2^8 - 1 = 255。 8. 实体集联系:在关系数据库中,“商品...

    acm竞赛常用算法模板,数据结构常用算法

    - 通过维护一个树形结构来表示元素之间的关系。 - 提供高效的合并和查找操作。 #### 数论(Number Theory) 数论问题在ACM竞赛中也非常常见,掌握基本的数论知识能够帮助我们解决很多有趣的问题。 ##### 1. ...

    数据结构课程设计110

    2. **一元多项式计算**:要求实现多项式的存储(如数组、链表或树形结构)、排序、加减乘运算以及算法的时间复杂度分析。这涉及到了线性结构和高级数据结构的运用,例如二项式树或线性时间排序算法。 3. **运动会...

    人工智能机器学习常用算法总结及各个常用算法精确率对比

    决策树模型是一棵倒立的树形结构,通过从根节点到叶节点的路径来表示分类的决策过程。决策树可以通过特征选择和分割来创建,并具有易于理解和解释的特性,因此在实际中被广泛使用。然而,决策树容易出现过拟合现象,...

    那年4月全国计算机等级考试二级ACCESS笔试试卷及答案.pdf

    6. **二叉树遍历**:后序遍历顺序是“左子树-右子树-根节点”。 7. **满二叉树**:深度为7的满二叉树有2^7 - 1 = 127个叶子节点。 8. **实体关系**:“商品”与“顾客”之间通常存在多对多的关系,因为一个顾客...

    pat甲级单词pat甲级单词pat甲级单词

    - **定义**: 二叉树是一种树形数据结构,其中每个节点最多有两个子节点。 - **用途**: 广泛应用于搜索、排序、表达式解析等领域。 #### 5. **自顶向下(Top Down)** - **定义**: 自顶向下是一种解决问题的方法,先从...

    《《数据结构基础教程》》

    逻辑结构描述了数据元素之间的关系,如集合、线性结构、树形结构和图状结构。存储结构则是这些逻辑结构在计算机内存中的实际表现,常见的有顺序存储和链式存储。例如,用C语言的结构体数组可以实现一个线性结构,将...

    2021-2022计算机二级等级考试试题及答案No.12149.docx

    - **详细解释**:层次模型以树形结构表示数据间的层次关系;关系模型采用二维表格的形式表示数据及其之间的联系;网状模型则允许多个节点之间存在多对多的关系。这些模型各有特点,适用于不同的应用场景。 ### 7. ...

Global site tag (gtag.js) - Google Analytics