热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

预算机制,递归计算

#!usrbinperl##############################################################################

#!/usr/bin/perl

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

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

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

#  1.得到所有的评分卡以及评分卡下的所有的评分组。

#    2.根据评分组ID 得到所有的规则组信息

#     3.根据规则组信息,在check_result基础数据表中得到所有的规则组信息 每一个规则组有一个维度,不同的维度有不同的权重

#  4.从检查结果表check_result中得到规则组得分 insert into rulegroup_score 

#  5.根据规则组得分表中的map_id 计算出 叶子节点的得分,插入到评分卡得分表 estimate_card_score 

#     6.递归计算所有的节点的得分

# Writer  : suhongyun

# 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 TDCconnect(){

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

print "Connection is successful !!\n";

return $dbh;

}

 

 

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

sub calRuleGroupScore{

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

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

print("calRuleGroupScore para : $orgId & $rundate \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&#43;1 from bohz_appmds.tap_c_branch_all a ,temporg c where  c.id &#61; a.par_branch_id and leveld<7)".

"select id from temporg";

 

my $sth &#61; $dbh->prepare($orgInfoSQL) or return -1;

my $ret &#61; $sth->execute() or return -1;  

my $orgInfo &#61; $sth->fetchall_arrayref();

$sth->finish();

my $orgPin ;

for(my $i &#61; 0 ;$i<$#${orgInfo};$i&#43;&#43;){

 

$orgPin &#61; $orgPin."&#39;".$orgInfo->[$i][0]."&#39;,";

}

$orgPin &#61; $orgPin."&#39;".$orgInfo->[$#${orgInfo}][0]."&#39;";

 

#1.通过日期和机构条件锁定数据范围&#xff0c;然后计算得到每条规则的得分情况

#2.关联规则表&#xff0c;得到规则的权重信息&#xff0c;进而求得规则的权重得分&#xff08;ws&#xff09;

#3.group by mapId&#xff0c;再sum&#xff08;ws&#xff09;&#xff0c;求得规则组的得分情况

my $resultSQL &#61; 

"select map_id ,sum(rett) as rg_score from".

"(select main.map_id,main.check_id, ".

"CASE WHEN r.rule_weight &#61;  &#39;0&#39; THEN case when r.CheckDimension &#61; &#39;01&#39; then 0.2

when r.CheckDimension &#61;&#39;05&#39;  then  0.2

when r.CheckDimension &#61;&#39;02&#39;  then 0.2

when r.CheckDimension &#61;&#39;03&#39;  then 0.2

when r.CheckDimension &#61;&#39;04&#39;  then 0.2

when r.CheckDimension &#61;&#39;06&#39; then  0.2

else null end

ELSE r.rule_weight END as weight,score,score*weight as rett ".

"from ".

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

"from appdqc.check_result".

" where rundate&#61;date&#39;$rundate&#39; and org_id in ($orgPin) group by map_id,check_id) main ".

"inner join appdqc.rule r on main.check_id &#61; r.check_id) tt group by map_id" ;

 

my $ruleScoresth &#61; $dbh->prepare($resultSQL) or return -1;

my $ret &#61; $ruleScoresth->execute() or return -1;  

 

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

while (&#64;Fieldrow &#61; $ruleScoresth->fetchrow() ) { # Fieldrow一维数组

 

my $Map_Id &#61; "$Fieldrow[0]"; 

my $score &#61; "$Fieldrow[1]";

print("map_id: $Map_Id,score : $score  \n");

my $insertGroupSQL &#61; "insert into appdqc.rulegroup_score values(date&#39;$rundate&#39;,&#39;$Map_Id&#39;,&#39;$orgId&#39;,&#39;$score&#39;)";

my $sth &#61; $dbh->prepare($insertGroupSQL) or  return -1;

my $ret &#61; $sth->execute() or return -1;  

$sth->finish();

}

$ruleScoresth->finish();

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

return 0;

 

}

 

sub calNodeScore{

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

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

my $ret;

my $broLength;

my $gs;

my $averageGs;

#得到当前评分卡下的节点&#xff08;评分组&#xff09;的信息

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

my $pfkSQL &#61; "select folder_id,isleaf,weight from appdqc.estimate_group where status&#61;1 and par_folder_id&#61;&#39;$curr_folder_id&#39;";

my $Nodesth &#61; $dbh->prepare($pfkSQL) or  return -1;

$broLength &#61; $Nodesth->execute() or return -1;  #broLength直接是结果集的长度

print("length : $broLength\n");

my $nodeCount;

if($broLength &#61;&#61; 0){

print("$curr_folder_id no rulegroup or estimategroup");

}else{

while(my &#64;Fieldrow &#61; $Nodesth->fetchrow()){

my $child_folder_id &#61; "$Fieldrow[0]";

 

my $isleaf &#61; "$Fieldrow[1]";

 

#my $weight &#61; "$Fieldrow[2]";

 

if("0" eq $isleaf ){# &&broLength eq 0  没有下级的节点是没有意义的

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

 

my $ret &#61; calNodeScore($child_folder_id,$orgId,$rundate);

$gs &#43;&#61; $ret;

$averageGs &#61; $gs;

 

}else{

# 当前节点的叶子子节点

print ("$child_folder_id is  leafNode and  broLength &#61; $broLength\n");

# 结果集理论只有一条

# my $leafScoreSQL &#61; "select * from appdqc.estimate_card_score ec inner join estimate_card on ec.folder_id&#61;$child_folder_id "

# ."and ec.org_Id&#61;&#39;3400008888&#39; and and RunDate&#61;&#39;20160530&#39;";

my $leafScoreSQL &#61; "select * from appdqc.estimate_card_score ec inner join estimate_group on ec.folder_id&#61;&#39;$child_folder_id&#39; "

."and ec.org_Id&#61;&#39;$orgId&#39; and rundate &#61; date&#39;$rundate&#39; ";

 

my $Leafsth &#61; $dbh->prepare($leafScoreSQL) or  return -1;

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

my &#64;Fieldrow &#61; $Leafsth->fetchrow();

my  $s &#61; "$Fieldrow[6]";

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

my $w  &#61;  "$Fieldrow[5]";

$gs &#43;&#61; $s ;

#$averageGs &#61; ($gs/$broLength);

print("leaf score average : $gs \n");

$Leafsth ->finish();

}

}

$averageGs &#61; ($gs/$broLength);

}

# print $logFile ("insert into estiamte_card_score  $orgId $rundate $averageGs   $curr_folder_id  \n");

 

my $insertNodeScoreSQL &#61; "insert into appdqc.estimate_card_score  ".

"select &#39;$orgId&#39;,date&#39;$rundate&#39;,folder_id,par_folder_id,folder_name,&#39;&#39;,&#39;$averageGs&#39; from appdqc.estimate_group  ".

" where folder_id &#61; $curr_folder_id";

my $insertNodesth &#61; $dbh->prepare($insertNodeScoreSQL) or return -1;

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

$insertNodesth ->finish();

$Nodesth->finish();

 

 

#my $cardScoreinsert &#61; "select sum(score/3) from estimate_card_score where par_folder_id&#61; &#39;$curr_folder_id&#39;";

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

#计算树形节点的得分&#xff0c;并插入到estimate_card_score树形节点得分信息表中

return $averageGs;

 

}

 

#计算评分卡值得入口

sub calCardscore{

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

my ($nodeId,$runDate,$orgId) &#61; &#64;_;

print(" calCardscore  para :$nodeId,$runDate,$orgId \n");

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

my $cardGroupsql &#61; "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 &#61;&#39;$nodeId&#39; union all ".

" select a.folder_id,a.folder_name,a.par_folder_id,a.isleaf,c.leveld&#43;1 from appdqc.estimate_group a ,temptab c".

" where  c.id &#61; a.par_folder_id and status&#61;&#39;1&#39; and leveld<7)".

" select id from temptab where isleaf &#61; &#39;1&#39; ";

my $cardGroupsqlSth &#61; $dbh->prepare($cardGroupsql) or return -1;

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

 

while(my &#64;Fieldrow &#61; $cardGroupsqlSth->fetchrow()){

my $groupId &#61; "$Fieldrow[0]";

my $gs &#61; "0";

#得到叶子规则组的权重和规则组的得分 

my $groupId_rulegroup_sql &#61; "select er.map_id,er.weight,rgs.score from appdqc.estimate_mapid_relation er ".

" inner join rulegroup_score rgs on er.map_id &#61; rgs.map_id  " . "where group_Id&#61;&#39;$groupId&#39; ".

" and status &#61; &#39;1&#39; "; 

my $groupId_rulegroupsth &#61; $dbh->prepare($groupId_rulegroup_sql) or return -1;

my $length &#61; $groupId_rulegroupsth ->execute() or return -1;

 

my $gs &#61; "0";

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

while(&#64;Fieldrow &#61; $groupId_rulegroupsth->fetchrow()){

my $s &#61; "$Fieldrow[2]";

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

my $w &#61; "$Fieldrow[1]";

$gs &#43;&#61; $s;

}

my $average &#61; ($gs/$length);

$groupId_rulegroupsth ->finish();

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

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

# estiamte_card_score 联合唯一主键  orgId rundate folder_id

my $insertCardScoreSQL  &#61; "insert into appdqc.estimate_card_score ".

"select &#39;$orgId&#39;,date&#39;$runDate&#39;,folder_id,par_folder_id,folder_name,&#39;&#39;,&#39;$average&#39; from appdqc.estimate_group ".

" where folder_id&#61;&#39;$groupId&#39; and status &#61; &#39;1&#39; ";

my $insertCardScoresth &#61; $dbh->prepare($insertCardScoreSQL) or return -1;

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

$insertCardScoresth ->finish();

 

}

$cardGroupsqlSth->finish();

 

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

my $cardScoreinsert &#61; "insert into appdqc.estimate_card_score ".

"select &#39;$orgId&#39;,date&#39;$runDate&#39;,folder_id,par_folder_id,folder_name,&#39;&#39;,&#39;$cardScore&#39; from appdqc.estimate_card ".

" where folder_id&#61;&#39;$nodeId&#39;";

my $cardScoresth &#61; $dbh->prepare($cardScoreinsert) or return -1;

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

$cardScoresth->finish(); 

 

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

 

}

 

sub main{

print "-----------------------------main begin----------------------------- ";

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

TDconnect();

 

# if()

my $rundatesql &#61; "select max(rundate) from appdqc.check_result ";

my $rundateSth &#61; $dbh->prepare($rundatesql) or return -1;

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

my &#64;Fieldrow &#61; $rundateSth->fetchrow();

#my $rundate &#61; "$Fieldrow[0]";

$rundateSth ->finish();

my $rundate &#61; "2016-06-01";

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

my $deleteHistory  &#61; "delete from appdqc.estimate_card_score where rundate &#61; date&#39;$rundate&#39; ;".

"delete from appdqc.rulegroup_score where rundate &#61; date&#39;$rundate&#39; ;";

 

my $deleteHistorySth &#61; $dbh ->prepare($deleteHistory) or return -1;

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

$deleteHistorySth ->finish();

print("deleteHistory : fininsh  \n");

 

#计算规则组得分&#xff0c;并插入到规则组得分信息表中

#传入参数&#xff1a;机构、日期&#xff0c;节点

 

#得到所有的农商行机构信息&#xff08;包含总行机构&#xff09;&#xff0c;使用循环对每一个机构计算评分卡得分

my $getOrg &#61; "select branch_id from  bohz_appmds.tap_c_branch where branch_id in ( &#39;3401020316&#39;,&#39;3401040438&#39;,&#39;3401030216&#39;,&#39;3400008888&#39;,&#39;3401010008&#39;)order by branch_id " ;

my $getOrgsth &#61; $dbh->prepare($getOrg) or return -1;

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

while(my &#64;Fieldrow &#61; $getOrgsth->fetchrow()){

my $branchId &#61; "$Fieldrow[0]";

calRuleGroupScore($branchId,$rundate);

my $cardInfo &#61; "select folder_id from appdqc.estimate_card where status &#61; &#39;1&#39;";

my $cardInfoSth &#61; $dbh ->prepare($cardInfo) or return -1;

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

while(my &#64;Fieldrow &#61; $cardInfoSth->fetchrow()){

my $cardId &#61; "$Fieldrow[0]";

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

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

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

}

 

}

$getOrgsth ->finish();

print "-----------------------------main end -------------------------------";

}

 

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

sub GetNowDate{

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

$mon &#61; sprintf("%02d", $mon&#43;1);

$day &#61; sprintf("%02d", $day);

my $stime &#61; ($year&#43;1900).$mon.$day;

return $stime;

}

 

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

exit($rc);

 



推荐阅读
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
author-avatar
萱筱璧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有