diff --git a/module/bi/config/pivots.php b/module/bi/config/pivots.php index 1bdf697009..de1cc38402 100644 --- a/module/bi/config/pivots.php +++ b/module/bi/config/pivots.php @@ -7,43 +7,42 @@ $config->bi->builtin->pivots[] = array 'name' => array('zh-cn' => '完成项目工期透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'code' => 'finishedProjectDuration', 'dimension' => '2', + 'driver' => 'mysql', 'group' => '86', 'sql' => << array ( 'columns' => array @@ -57,23 +56,22 @@ EOT array('field' => 'duration_deviation', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), array('field' => 'rate', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow') ), - 'group3' => 'program1', - 'group6' => 'name', + 'group1' => 'program1', + 'group2' => 'name', 'lastStep' => '4' ), - 'filters' => array(), 'fields' => array ( - 'name' => array('name' => '项目名称', 'object' => 'project', 'field' => 'name', 'type' => 'string'), - 'program1' => array('name' => 'program1', 'object' => 'project', 'field' => 'program1', 'type' => 'string'), - 'begin' => array('name' => '计划开始日期', 'object' => 'project', 'field' => 'begin', 'type' => 'date'), - 'end' => array('name' => '计划完成日期', 'object' => 'project', 'field' => 'end', 'type' => 'date'), - 'realBegan' => array('name' => '实际开始日期', 'object' => 'project', 'field' => 'realBegan', 'type' => 'date'), - 'realEnd' => array('name' => '实际完成日期', 'object' => 'project', 'field' => 'realEnd', 'type' => 'date'), - 'closedDate' => array('name' => '关闭日期', 'object' => 'project', 'field' => 'closedDate', 'type' => 'date'), - 'realduration' => array('name' => 'realduration', 'object' => 'project', 'field' => 'realduration', 'type' => 'number'), - 'duration_deviation' => array('name' => 'duration_deviation', 'object' => 'project', 'field' => 'duration_deviation', 'type' => 'number'), - 'rate' => array('name' => 'rate', 'object' => 'project', 'field' => 'rate', 'type' => 'number') + 'name' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'program1' => array('object' => 'project', 'field' => 'program1', 'type' => 'string'), + 'begin' => array('object' => 'project', 'field' => 'begin', 'type' => 'date'), + 'end' => array('object' => 'project', 'field' => 'end', 'type' => 'date'), + 'realBegan' => array('object' => 'project', 'field' => 'realBegan', 'type' => 'date'), + 'realEnd' => array('object' => 'project', 'field' => 'realEnd', 'type' => 'date'), + 'closedDate' => array('object' => 'project', 'field' => 'closedDate', 'type' => 'date'), + 'realduration' => array('object' => 'project', 'field' => 'realduration', 'type' => 'number'), + 'duration_deviation' => array('object' => 'project', 'field' => 'duration_deviation', 'type' => 'number'), + 'rate' => array('object' => 'project', 'field' => 'rate', 'type' => 'number') ), 'langs' => array ( @@ -98,88 +96,93 @@ $config->bi->builtin->pivots[] = array 'name' => array('zh-cn' => '完成项目工时透视表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'code' => 'finishedProjectHour', 'dimension' => '2', + 'driver' => 'mysql', 'group' => '85', 'sql' => << array ( 'columns' => array ( - array('field' => '预计工时', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '消耗工时', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '工时偏差', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '工时偏差率', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '完成需求数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '完成需求规模数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '单位时间交付需求规模数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow') + array('field' => 'estimate', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'consumed', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'deviation', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'deviationrate', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'finishedstorys', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'finishedstorysmate', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'demandsizesperunittime', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow') ), 'columnTotal' => 'noShow', - 'group1' => '一级项目集', - 'group2' => '项目名称', + 'group1' => 'topprogram', + 'group2' => 'projectname', 'lastStep' => '4' ), 'filters' => array ( array ( - 'field' => 'closedDate', + 'field' => 'closeddate', 'type' => 'date', 'name' => '关闭日期', 'default' => array('begin' => '', 'end' => '') @@ -187,16 +190,29 @@ EOT ), 'fields' => array ( - '项目名称' => array('name' => '项目名称', 'object' => 'project', 'field' => '项目名称', 'type' => 'string'), - '一级项目集' => array('name' => '一级项目集', 'object' => 'project', 'field' => '一级项目集', 'type' => 'string'), - '预计工时' => array('name' => '预计工时', 'object' => 'project', 'field' => '预计工时', 'type' => 'number'), - '消耗工时' => array('name' => '消耗工时', 'object' => 'project', 'field' => '消耗工时', 'type' => 'number'), - '工时偏差' => array('name' => '工时偏差', 'object' => 'project', 'field' => '工时偏差', 'type' => 'number'), - '工时偏差率' => array('name' => '工时偏差率', 'object' => 'project', 'field' => '工时偏差率', 'type' => 'number'), - '完成需求数' => array('name' => '完成需求数', 'object' => 'project', 'field' => '完成需求数', 'type' => 'string'), - '完成需求规模数' => array('name' => '完成需求规模数', 'object' => 'project', 'field' => '完成需求规模数', 'type' => 'number'), - '单位时间交付需求规模数' => array('name' => '单位时间交付需求规模数', 'object' => 'project', 'field' => '单位时间交付需求规模数', 'type' => 'number'), - 'closedDate' => array('name' => '关闭日期', 'object' => 'project', 'field' => 'closedDate', 'type' => 'date') + 'projectname' => array('object' => 'project', 'field' => 'projectname', 'type' => 'string'), + 'topprogram' => array('object' => 'project', 'field' => 'topprogram', 'type' => 'string'), + 'estimate' => array('object' => 'project', 'field' => 'estimate', 'type' => 'number'), + 'consumed' => array('object' => 'project', 'field' => 'consumed', 'type' => 'number'), + 'deviation' => array('object' => 'project', 'field' => 'deviation', 'type' => 'number'), + 'deviationrate' => array('object' => 'project', 'field' => 'deviationrate', 'type' => 'number'), + 'finishedstorys' => array('object' => 'project', 'field' => 'deviationrate', 'type' => 'string'), + 'finishedstorysmate' => array('object' => 'project', 'field' => 'finishedstorysmate', 'type' => 'number'), + 'demandsizesperunittime' => array('object' => 'project', 'field' => 'demandsizesperunittime', 'type' => 'number'), + 'closeddate' => array('object' => 'project', 'field' => 'closeddate', 'type' => 'date') + ), + 'langs' => array + ( + 'projectname' => array('zh-cn' => '项目名称', 'zh-tw' => '项目名称', 'en' => 'projectname'), + 'topprogram' => array('zh-cn' => '一级项目集', 'zh-tw' => '一级项目集', 'en' => 'topprogram'), + 'estimate' => array('zh-cn' => '预计工时', 'zh-tw' => '预计工时', 'en' => 'estimate'), + 'consumed' => array('zh-cn' => '消耗工时', 'zh-tw' => '消耗工时', 'en' => 'consumed'), + 'deviation' => array('zh-cn' => '工时偏差', 'zh-tw' => '工时偏差', 'en' => 'deviation'), + 'deviationrate' => array('zh-cn' => '工时偏差率', 'zh-tw' => '工时偏差率', 'en' => 'deviationrate'), + 'finishedstorys' => array('zh-cn' => '完成需求数', 'zh-tw' => '完成需求数', 'en' => 'finishedstorys'), + 'finishedstorysmate' => array('zh-cn' => '完成需求规模数', 'zh-tw' => '完成需求规模数', 'en' => 'finishedstorysmate'), + 'demandsizesperunittime' => array('zh-cn' => '单位时间交付需求规模数', 'zh-tw' => '单位时间交付需求规模数', 'en' => 'demandsizesperunittime'), + 'closeddate' => array('zh-cn' => '关闭日期', 'zh-tw' => '关闭日期', 'en' => 'closeddate') ), 'stage' => 'published', 'builtin' => '1' @@ -208,98 +224,131 @@ $config->bi->builtin->pivots[] = array 'name' => array('zh-cn' => '产品缺陷数据汇总表', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'code' => 'productBugSummary', 'dimension' => '3', + 'driver' => 'mysql', 'group' => '100', 'sql' => << array ( 'columns' => array ( - array('field' => '研发完成需求数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '研发完成需求规模数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '需求用例数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '用例密度', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '用例覆盖率', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => 'Bug数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '有效Bug数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '优先级为1,2的Bug数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => 'Bug密度', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => '修复Bug数', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), - array('field' => 'Bug修复率', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow') + array('field' => 'exfixedstorys', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'exfixedstorysmate', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'storycases', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'casedensity', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'casecoveragerate', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'bugs', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'effectivebugs', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'pri12bugs', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'bugdensity', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'fixedbugs', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow'), + array('field' => 'fixedbugsrate', 'stat' => 'sum', 'slice' => 'noSlice', 'showMode' => 'default', 'monopolize' => '0', 'showTotal' => 'noShow') ), 'columnTotal' => 'noShow', - 'group1' => '一级项目集', - 'group3' => '产品线', - 'group2' => '产品', + 'group1' => 'topprogram', + 'group2' => 'productline', + 'group3' => 'product', 'lastStep' => '4' ), - 'filters' => array(), 'fields' => array ( - '产品' => array('name' => '产品', 'object' => 'story', 'field' => '产品', 'type' => 'string'), - '一级项目集' => array('name' => '一级项目集', 'object' => 'story', 'field' => '一级项目集', 'type' => 'string'), - '产品线' => array('name' => '产品线', 'object' => 'story', 'field' => '产品线', 'type' => 'string'), - '研发完成需求数' => array('name' => '研发完成需求数', 'object' => 'story', 'field' => '研发完成需求数', 'type' => 'string'), - '研发完成需求规模数' => array('name' => '研发完成需求规模数', 'object' => 'story', 'field' => '研发完成需求规模数', 'type' => 'number'), - '需求用例数' => array('name' => '需求用例数', 'object' => 'story', 'field' => '需求用例数', 'type' => 'string'), - '用例密度' => array('name' => '用例密度', 'object' => 'story', 'field' => '用例密度', 'type' => 'number'), - '用例覆盖率' => array('name' => '用例覆盖率', 'object' => 'story', 'field' => '用例覆盖率', 'type' => 'number'), - 'Bug数' => array('name' => 'Bug数', 'object' => 'story', 'field' => 'Bug数', 'type' => 'string'), - '有效Bug数' => array('name' => '有效Bug数', 'object' => 'story', 'field' => '有效Bug数', 'type' => 'number'), - '优先级为1,2的Bug数' => array('name' => '优先级为1,2的Bug数', 'object' => 'story', 'field' => '优先级为1,2的Bug数', 'type' => 'number'), - 'Bug密度' => array('name' => 'Bug密度', 'object' => 'story', 'field' => 'Bug密度', 'type' => 'number'), - '修复Bug数' => array('name' => '修复Bug数', 'object' => 'story', 'field' => '修复Bug数', 'type' => 'number'), - 'Bug修复率' => array('name' => 'Bug修复率', 'object' => 'story', 'field' => 'Bug修复率', 'type' => 'number') + 'product' => array('object' => 'story', 'field' => 'product', 'type' => 'string'), + 'topprogram' => array('object' => 'story', 'field' => 'topprogram', 'type' => 'string'), + 'productline' => array('object' => 'story', 'field' => 'productline', 'type' => 'string'), + 'exfixedstorys' => array('object' => 'story', 'field' => 'exfixedstorys', 'type' => 'string'), + 'exfixedstorysmate' => array('object' => 'story', 'field' => 'exfixedstorysmate', 'type' => 'number'), + 'storycases' => array('object' => 'story', 'field' => 'storycases', 'type' => 'string'), + 'casedensity' => array('object' => 'story', 'field' => 'casedensity', 'type' => 'number'), + 'casecoveragerate' => array('object' => 'story', 'field' => 'casecoveragerate', 'type' => 'number'), + 'bugs' => array('object' => 'story', 'field' => 'bugs', 'type' => 'string'), + 'effectivebugs' => array('object' => 'story', 'field' => 'effectviebugs', 'type' => 'number'), + 'pri12bugs' => array('object' => 'story', 'field' => 'pri12bugs', 'type' => 'number'), + 'bugdensity' => array('object' => 'story', 'field' => 'bugdensity', 'type' => 'number'), + 'fixedbugs' => array('object' => 'story', 'field' => 'fixedbugs', 'type' => 'number'), + 'fixedbugsrate' => array('object' => 'story', 'field' => 'fixedbugsrate', 'type' => 'number') + ), + 'langs' => array + ( + 'product' => array('zh-cn' => '产品', 'zh-tw' => '产品', 'en' => 'product'), + 'topprogram' => array('zh-cn' => '一级项目集', 'zh-tw' => '一级项目集', 'en' => 'topprogram'), + 'productline' => array('zh-cn' => '产品线', 'zh-tw' => '产品线', 'en' => 'productline'), + 'exfixedstorys' => array('zh-cn' => '研发完成需求数', 'zh-tw' => '研发完成需求数', 'en' => 'exfixedstorys'), + 'exfixedstorysmate' => array('zh-cn' => '研发完成需求规模数', 'zh-tw' => '研发完成需求规模数', 'en' => 'exfixedstorysmate'), + 'storycases' => array('zh-cn' => '需求用例数', 'zh-tw' => '需求用例数', 'en' => 'storycases'), + 'casedensity' => array('zh-cn' => '用例密度', 'zh-tw' => '用例密度', 'en' => 'casedensity'), + 'casecoveragerate' => array('zh-cn' => '用例覆盖率', 'zh-tw' => '用例覆盖率', 'en' => 'casecoveragerate'), + 'bugs' => array('zh-cn' => 'Bug数', 'zh-tw' => 'Bug数', 'en' => 'bugs'), + 'effectivebugs' => array('zh-cn' => '有效Bug数', 'zh-tw' => '有效Bug数', 'en' => 'effectviebugs'), + 'pri12bugs' => array('zh-cn' => '优先级为1,2的Bug数', 'zh-tw' => '优先级为1,2的Bug数', 'en' => 'pri12bugs'), + 'bugdensity' => array('zh-cn' => 'Bug密度', 'zh-tw' => 'Bug密度', 'en' => 'bugdensity'), + 'fixedbugs' => array('zh-cn' => '修复Bug数', 'zh-tw' => '修复Bug数', 'en' => 'fixedbugs'), + 'fixedbugsrate' => array('zh-cn' => 'Bug修复率', 'zh-tw' => 'Bug修复率', 'en' => 'fixedbugsrate') ), 'stage' => 'published', 'builtin' => '1' @@ -308,93 +357,73 @@ EOT $config->bi->builtin->pivots[] = array ( 'id' => 1003, - 'name' => array('zh-cn' => '产品完成度统计表', 'zh-tw' => '產品完成度統計表', 'en' => 'Product Progress', 'de' => 'Product Progress', 'fr' => 'Product Progress'), + 'name' => array('zh-cn' => '产品需求交付统计表', 'zh-tw' => '產品完成度統計表', 'en' => 'Product Progress', 'de' => 'Product Progress', 'fr' => 'Product Progress'), 'code' => 'productProgress', - 'desc' => array('zh-cn' => '按照产品列出需求总数,完成的总数(状态是关闭,或者研发阶段是发布),完成的百分比。', 'zh-tw' => '按照產品列出需求總數,完成的總數(狀態是關閉,或者研發階段是發布),完成的百分比。', 'en' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'de' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'fr' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.'), + 'desc' => array('zh-cn' => '按照产品列出需求总数,交付的需求总数(状态是关闭且关闭原因为已完成,或者研发阶段是已发布的需求)。', 'zh-tw' => '按照產品列出需求總數,完成的總數(狀態是關閉,或者研發階段是發布),完成的百分比。', 'en' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'de' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.', 'fr' => 'Number of total stories,done stories(state is closed, or stage is released), percent of completion.'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '59', 'sql' => << array ( - 'group1' => 'name', - 'group2' => '', - 'columnTotal' => 'sum', + 'summary' => 'use', + 'group1' => 'product', 'columns' => array ( - array('field' => 'count', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'done', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '1') - ) + array('field' => 'done', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'count', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum' ), + 'filters' => array(), 'fields' => array ( - 'id' => array('object' => 'story', 'field' => 'id', 'type' => 'string'), - 'vision' => array('object' => 'project', 'field' => 'vision', 'type' => 'string'), - 'parent' => array('object' => 'story', 'field' => 'parent', 'type' => 'string'), - 'product' => array('object' => 'story', 'field' => 'product', 'type' => 'string'), - 'branch' => array('object' => 'story', 'field' => 'branch', 'type' => 'string'), - 'module' => array('object' => 'story', 'field' => 'module', 'type' => 'string'), - 'plan' => array('object' => 'story', 'field' => 'plan', 'type' => 'string'), - 'source' => array('object' => 'story', 'field' => 'source', 'type' => 'string'), - 'sourceNote' => array('object' => 'story', 'field' => 'sourceNote', 'type' => 'string'), - 'fromBug' => array('object' => 'story', 'field' => 'fromBug', 'type' => 'string'), - 'feedback' => array('object' => 'story', 'field' => 'feedback', 'type' => 'string'), - 'title' => array('object' => 'story', 'field' => 'title', 'type' => 'string'), - 'keywords' => array('object' => 'story', 'field' => 'keywords', 'type' => 'string'), - 'type' => array('object' => 'story', 'field' => 'type', 'type' => 'string'), - 'category' => array('object' => 'story', 'field' => 'category', 'type' => 'string'), - 'pri' => array('object' => 'story', 'field' => 'pri', 'type' => 'string'), - 'estimate' => array('object' => 'story', 'field' => 'estimate', 'type' => 'string'), - 'status' => array('object' => 'story', 'field' => 'status', 'type' => 'string'), - 'subStatus' => array('object' => 'story', 'field' => 'subStatus', 'type' => 'string'), - 'color' => array('object' => 'story', 'field' => 'color', 'type' => 'string'), - 'stage' => array('object' => 'story', 'field' => 'stage', 'type' => 'string'), - 'stagedBy' => array('object' => 'story', 'field' => 'stagedBy', 'type' => 'string'), - 'mailto' => array('object' => 'story', 'field' => 'mailto', 'type' => 'string'), - 'lib' => array('object' => 'project', 'field' => 'lib', 'type' => 'string'), - 'fromStory' => array('object' => 'project', 'field' => 'fromStory', 'type' => 'string'), - 'fromVersion' => array('object' => 'project', 'field' => 'fromVersion', 'type' => 'string'), - 'openedBy' => array('object' => 'story', 'field' => 'openedBy', 'type' => 'string'), - 'openedDate' => array('object' => 'story', 'field' => 'openedDate', 'type' => 'string'), - 'assignedTo' => array('object' => 'story', 'field' => 'assignedTo', 'type' => 'string'), - 'assignedDate' => array('object' => 'story', 'field' => 'assignedDate', 'type' => 'string'), - 'approvedDate' => array('object' => 'project', 'field' => 'approvedDate', 'type' => 'string'), - 'lastEditedBy' => array('object' => 'story', 'field' => 'lastEditedBy', 'type' => 'string'), - 'lastEditedDate' => array('object' => 'story', 'field' => 'lastEditedDate', 'type' => 'string'), - 'changedBy' => array('object' => 'story', 'field' => 'changedBy', 'type' => 'string'), - 'changedDate' => array('object' => 'story', 'field' => 'changedDate', 'type' => 'string'), - 'reviewedBy' => array('object' => 'story', 'field' => 'reviewedBy', 'type' => 'string'), - 'reviewedDate' => array('object' => 'story', 'field' => 'reviewedDate', 'type' => 'string'), - 'closedBy' => array('object' => 'story', 'field' => 'closedBy', 'type' => 'string'), - 'closedDate' => array('object' => 'story', 'field' => 'closedDate', 'type' => 'string'), - 'closedReason' => array('object' => 'story', 'field' => 'closedReason', 'type' => 'string'), - 'activatedDate' => array('object' => 'story', 'field' => 'activatedDate', 'type' => 'string'), - 'toBug' => array('object' => 'story', 'field' => 'toBug', 'type' => 'string'), - 'childStories' => array('object' => 'story', 'field' => 'childStories', 'type' => 'string'), - 'linkStories' => array('object' => 'story', 'field' => 'linkStories', 'type' => 'string'), - 'linkRequirements' => array('object' => 'story', 'field' => 'linkRequirements', 'type' => 'string'), - 'twins' => array('object' => 'story', 'field' => 'twins', 'type' => 'string'), - 'duplicateStory' => array('object' => 'story', 'field' => 'duplicateStory', 'type' => 'string'), - 'version' => array('object' => 'story', 'field' => 'version', 'type' => 'string'), - 'storyChanged' => array('object' => 'project', 'field' => 'storyChanged', 'type' => 'string'), - 'feedbackBy' => array('object' => 'story', 'field' => 'feedbackBy', 'type' => 'string'), - 'notifyEmail' => array('object' => 'story', 'field' => 'notifyEmail', 'type' => 'string'), - 'URChanged' => array('object' => 'story', 'field' => 'URChanged', 'type' => 'string'), - 'deleted' => array('object' => 'story', 'field' => 'deleted', 'type' => 'string'), - 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), - 'done' => array('object' => 'project', 'field' => 'done', 'type' => 'string'), - 'count' => array('object' => 'project', 'field' => 'count', 'type' => 'string') + 'product' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), + 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), + 'done' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'count' => array('object' => 'project', 'field' => '', 'type' => 'number') ), 'langs' => array ( - 'count' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories'), - 'done' => array('zh-cn' => '完成数', 'zh-tw' => '完成数', 'en' => 'Done') + 'product' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'name' => array('zh-cn' => 'name', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'done' => array('zh-cn' => '交付需求数', 'zh-tw' => '交付需求数', 'en' => 'delivery', 'de' => '', 'fr' => ''), + 'count' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories', 'de' => '', 'fr' => '') + ), + 'vars' => array(), + 'drills' => array + ( + array + ( + 'field' => 'done', + 'object' => 'story', + 'whereSql' => "WHERE t1.deleted='0' and t1.closedReason = 'done' or t1.stage = 'released'", + 'condition' => array + ( + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'product') + ) + ), + array + ( + 'field' => 'count', + 'object' => 'story', + 'whereSql' => "WHERE t1.deleted='0' ", + 'condition' => array + ( + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'product') + ) + ) ), 'stage' => 'published', 'builtin' => '0' @@ -407,82 +436,179 @@ $config->bi->builtin->pivots[] = array 'code' => 'productStoryStatus', 'desc' => array('zh-cn' => '按照产品列出需求总数,状态的分布情况。', 'zh-tw' => '按照產品列出需求總數,狀態的分布情況。', 'en' => 'Total number and status distribution of stories.', 'de' => 'Total number and status distribution of stories.', 'fr' => 'Total number and status distribution of stories.'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '59', 'sql' => << array - ( - 'group1' => 'name', - 'group2' => '', - 'columnTotal' => 'sum', - 'columns' => array - ( - array('field' => 'status', 'slice' => 'status', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) - ), +EOT, + 'filters' => array(), 'fields' => array ( - 'id' => array('object' => 'story', 'field' => 'id', 'type' => 'string'), - 'vision' => array('object' => 'project', 'field' => 'vision', 'type' => 'string'), - 'parent' => array('object' => 'story', 'field' => 'parent', 'type' => 'string'), - 'product' => array('object' => 'story', 'field' => 'product', 'type' => 'string'), - 'branch' => array('object' => 'story', 'field' => 'branch', 'type' => 'string'), - 'module' => array('object' => 'story', 'field' => 'module', 'type' => 'string'), - 'plan' => array('object' => 'story', 'field' => 'plan', 'type' => 'string'), - 'source' => array('object' => 'story', 'field' => 'source', 'type' => 'string'), - 'sourceNote' => array('object' => 'story', 'field' => 'sourceNote', 'type' => 'string'), - 'fromBug' => array('object' => 'story', 'field' => 'fromBug', 'type' => 'string'), - 'feedback' => array('object' => 'story', 'field' => 'feedback', 'type' => 'string'), + 'id' => array('object' => 'story', 'field' => 'id', 'type' => 'number'), + 'vision' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'parent' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'isParent' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'root' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'path' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'grade' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'product' => array('object' => 'product', 'field' => 'name', 'type' => 'object'), + 'branch' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'module' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'plan' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'source' => array('object' => 'story', 'field' => 'source', 'type' => 'option'), + 'sourceNote' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'fromBug' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'feedback' => array('object' => 'story', 'field' => '', 'type' => 'number'), 'title' => array('object' => 'story', 'field' => 'title', 'type' => 'string'), - 'keywords' => array('object' => 'story', 'field' => 'keywords', 'type' => 'string'), - 'type' => array('object' => 'story', 'field' => 'type', 'type' => 'string'), - 'category' => array('object' => 'story', 'field' => 'category', 'type' => 'string'), - 'pri' => array('object' => 'story', 'field' => 'pri', 'type' => 'string'), - 'estimate' => array('object' => 'story', 'field' => 'estimate', 'type' => 'string'), - 'status' => array('object' => 'story', 'field' => 'status', 'type' => 'string'), - 'subStatus' => array('object' => 'story', 'field' => 'subStatus', 'type' => 'string'), - 'color' => array('object' => 'story', 'field' => 'color', 'type' => 'string'), - 'stage' => array('object' => 'story', 'field' => 'stage', 'type' => 'string'), - 'stagedBy' => array('object' => 'story', 'field' => 'stagedBy', 'type' => 'string'), - 'mailto' => array('object' => 'story', 'field' => 'mailto', 'type' => 'string'), - 'lib' => array('object' => 'project', 'field' => 'lib', 'type' => 'string'), - 'fromStory' => array('object' => 'project', 'field' => 'fromStory', 'type' => 'string'), - 'fromVersion' => array('object' => 'project', 'field' => 'fromVersion', 'type' => 'string'), - 'openedBy' => array('object' => 'story', 'field' => 'openedBy', 'type' => 'string'), - 'openedDate' => array('object' => 'story', 'field' => 'openedDate', 'type' => 'string'), - 'assignedTo' => array('object' => 'story', 'field' => 'assignedTo', 'type' => 'string'), - 'assignedDate' => array('object' => 'story', 'field' => 'assignedDate', 'type' => 'string'), - 'approvedDate' => array('object' => 'project', 'field' => 'approvedDate', 'type' => 'string'), - 'lastEditedBy' => array('object' => 'story', 'field' => 'lastEditedBy', 'type' => 'string'), - 'lastEditedDate' => array('object' => 'story', 'field' => 'lastEditedDate', 'type' => 'string'), - 'changedBy' => array('object' => 'story', 'field' => 'changedBy', 'type' => 'string'), - 'changedDate' => array('object' => 'story', 'field' => 'changedDate', 'type' => 'string'), - 'reviewedBy' => array('object' => 'story', 'field' => 'reviewedBy', 'type' => 'string'), - 'reviewedDate' => array('object' => 'story', 'field' => 'reviewedDate', 'type' => 'string'), - 'closedBy' => array('object' => 'story', 'field' => 'closedBy', 'type' => 'string'), - 'closedDate' => array('object' => 'story', 'field' => 'closedDate', 'type' => 'string'), - 'closedReason' => array('object' => 'story', 'field' => 'closedReason', 'type' => 'string'), - 'activatedDate' => array('object' => 'story', 'field' => 'activatedDate', 'type' => 'string'), - 'toBug' => array('object' => 'story', 'field' => 'toBug', 'type' => 'string'), - 'childStories' => array('object' => 'story', 'field' => 'childStories', 'type' => 'string'), - 'linkStories' => array('object' => 'story', 'field' => 'linkStories', 'type' => 'string'), - 'linkRequirements' => array('object' => 'story', 'field' => 'linkRequirements', 'type' => 'string'), - 'twins' => array('object' => 'story', 'field' => 'twins', 'type' => 'string'), - 'duplicateStory' => array('object' => 'story', 'field' => 'duplicateStory', 'type' => 'string'), - 'version' => array('object' => 'story', 'field' => 'version', 'type' => 'string'), - 'storyChanged' => array('object' => 'project', 'field' => 'storyChanged', 'type' => 'string'), - 'feedbackBy' => array('object' => 'story', 'field' => 'feedbackBy', 'type' => 'string'), - 'notifyEmail' => array('object' => 'story', 'field' => 'notifyEmail', 'type' => 'string'), - 'URChanged' => array('object' => 'story', 'field' => 'URChanged', 'type' => 'string'), - 'deleted' => array('object' => 'story', 'field' => 'deleted', 'type' => 'string'), + 'keywords' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'type' => array('object' => 'story', 'field' => 'type', 'type' => 'option'), + 'category' => array('object' => 'story', 'field' => 'category', 'type' => 'option'), + 'pri' => array('object' => 'story', 'field' => 'pri', 'type' => 'option'), + 'estimate' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'status' => array('object' => 'story', 'field' => 'status', 'type' => 'option'), + 'subStatus' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'color' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'stage' => array('object' => 'story', 'field' => 'stage', 'type' => 'option'), + 'stagedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'mailto' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'lib' => array('object' => 'project', 'field' => '', 'type' => 'object'), + 'fromStory' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'fromVersion' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'openedBy' => array('object' => 'story', 'field' => 'openedBy', 'type' => 'user'), + 'openedDate' => array('object' => 'story', 'field' => 'openedDate', 'type' => 'date'), + 'assignedTo' => array('object' => 'story', 'field' => 'assignedTo', 'type' => 'user'), + 'assignedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'approvedDate' => array('object' => 'project', 'field' => '', 'type' => 'date'), + 'lastEditedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'lastEditedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'changedBy' => array('object' => 'story', 'field' => 'changedBy', 'type' => 'user'), + 'changedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'reviewedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'reviewedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'releasedDate' => array('object' => 'project', 'field' => '', 'type' => 'date'), + 'closedBy' => array('object' => 'story', 'field' => 'closedBy', 'type' => 'user'), + 'closedDate' => array('object' => 'story', 'field' => 'closedDate', 'type' => 'date'), + 'closedReason' => array('object' => 'story', 'field' => 'closedReason', 'type' => 'option'), + 'activatedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'toBug' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'linkStories' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'linkRequirements' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'twins' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'duplicateStory' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'version' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'parentVersion' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'demandVersion' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'storyChanged' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'feedbackBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'notifyEmail' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'BSA' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'duration' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'demand' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'submitedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'roadmap' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'URChanged' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'unlinkReason' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'retractedReason' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'retractedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'retractedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'deleted' => array('object' => 'story', 'field' => '', 'type' => 'string'), 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string') ), + 'langs' => array + ( + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'vision' => array('zh-cn' => 'vision', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'parent' => array('zh-cn' => 'parent', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'isParent' => array('zh-cn' => '是父需求', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'root' => array('zh-cn' => 'root', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'path' => array('zh-cn' => '路径', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'grade' => array('zh-cn' => '需求层级', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'product' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'branch' => array('zh-cn' => 'branch', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'module' => array('zh-cn' => 'module', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'plan' => array('zh-cn' => 'plan', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'source' => array('zh-cn' => 'source', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'sourceNote' => array('zh-cn' => 'sourceNote', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'fromBug' => array('zh-cn' => 'fromBug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'feedback' => array('zh-cn' => 'feedback', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'title' => array('zh-cn' => 'title', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'keywords' => array('zh-cn' => 'keywords', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'type' => array('zh-cn' => 'type', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'category' => array('zh-cn' => 'category', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'pri' => array('zh-cn' => 'pri', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'estimate' => array('zh-cn' => 'estimate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'status' => array('zh-cn' => '不同状态需求', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'subStatus' => array('zh-cn' => 'subStatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'color' => array('zh-cn' => 'color', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stage' => array('zh-cn' => 'stage', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stagedBy' => array('zh-cn' => 'stagedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'mailto' => array('zh-cn' => 'mailto', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lib' => array('zh-cn' => 'lib', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'fromStory' => array('zh-cn' => 'fromStory', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'fromVersion' => array('zh-cn' => 'fromVersion', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedBy' => array('zh-cn' => 'openedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedDate' => array('zh-cn' => 'openedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedTo' => array('zh-cn' => 'assignedTo', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedDate' => array('zh-cn' => 'assignedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'approvedDate' => array('zh-cn' => 'approvedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lastEditedBy' => array('zh-cn' => 'lastEditedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lastEditedDate' => array('zh-cn' => 'lastEditedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'changedBy' => array('zh-cn' => 'changedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'changedDate' => array('zh-cn' => 'changedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'reviewedBy' => array('zh-cn' => 'reviewedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'reviewedDate' => array('zh-cn' => 'reviewedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'releasedDate' => array('zh-cn' => 'releasedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedBy' => array('zh-cn' => 'closedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedDate' => array('zh-cn' => 'closedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedReason' => array('zh-cn' => 'closedReason', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'activatedDate' => array('zh-cn' => 'activatedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'toBug' => array('zh-cn' => 'toBug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'linkStories' => array('zh-cn' => 'linkStories', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'linkRequirements' => array('zh-cn' => 'linkRequirements', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'twins' => array('zh-cn' => 'twins', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'duplicateStory' => array('zh-cn' => 'duplicateStory', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'version' => array('zh-cn' => 'version', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'parentVersion' => array('zh-cn' => '父版本', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'demandVersion' => array('zh-cn' => 'demandVersion', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'storyChanged' => array('zh-cn' => 'storyChanged', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'feedbackBy' => array('zh-cn' => 'feedbackBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'notifyEmail' => array('zh-cn' => 'notifyEmail', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'BSA' => array('zh-cn' => 'BSA', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'duration' => array('zh-cn' => '管理周期', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'demand' => array('zh-cn' => 'demand', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'submitedBy' => array('zh-cn' => '提交评审人', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'roadmap' => array('zh-cn' => '所属路标', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'URChanged' => array('zh-cn' => 'URChanged', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'unlinkReason' => array('zh-cn' => 'unlinkReason', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'retractedReason' => array('zh-cn' => 'retractedReason', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'retractedBy' => array('zh-cn' => '由谁撤销', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'retractedDate' => array('zh-cn' => '撤销时间', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'deleted' => array('zh-cn' => 'deleted', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'name' => array('zh-cn' => 'name', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + ), + 'vars' => array(), + 'drills' => array + ( + array + ( + 'field' => 'status', + 'object' => 'story', + 'whereSql' => "WHERE t1.deleted='0' ", + 'condition' => array + ( + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'product'), + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'status', 'queryField' => 'status') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -494,82 +620,189 @@ $config->bi->builtin->pivots[] = array 'code' => 'productStoryStage', 'desc' => array('zh-cn' => '按照产品列出需求总数,研发阶段的分布情况。', 'zh-tw' => '按照產品列出需求總數,研發階段的分布情況。', 'en' => 'Total number and stage distribution of stories ', 'de' => 'Total number and stage distribution of stories ', 'fr' => 'Total number and stage distribution of stories '), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '59', 'sql' => << array ( - 'group1' => 'name', - 'group2' => '', + 'group1' => 'product', 'columnTotal' => 'sum', 'columns' => array ( - array('field' => 'stage', 'slice' => 'stage', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'stage', 'slice' => 'stage', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0) + ), + 'summary' => 'use' ), + 'filters' => array(), 'fields' => array ( - 'id' => array('object' => 'story', 'field' => 'id', 'type' => 'string'), - 'vision' => array('object' => 'project', 'field' => 'vision', 'type' => 'string'), - 'parent' => array('object' => 'story', 'field' => 'parent', 'type' => 'string'), - 'product' => array('object' => 'story', 'field' => 'product', 'type' => 'string'), - 'branch' => array('object' => 'story', 'field' => 'branch', 'type' => 'string'), - 'module' => array('object' => 'story', 'field' => 'module', 'type' => 'string'), - 'plan' => array('object' => 'story', 'field' => 'plan', 'type' => 'string'), - 'source' => array('object' => 'story', 'field' => 'source', 'type' => 'string'), - 'sourceNote' => array('object' => 'story', 'field' => 'sourceNote', 'type' => 'string'), - 'fromBug' => array('object' => 'story', 'field' => 'fromBug', 'type' => 'string'), - 'feedback' => array('object' => 'story', 'field' => 'feedback', 'type' => 'string'), + 'id' => array('object' => 'story', 'field' => 'id', 'type' => 'number'), + 'vision' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'parent' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'isParent' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'root' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'path' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'grade' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'product' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), + 'branch' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'module' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'plan' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'source' => array('object' => 'story', 'field' => 'source', 'type' => 'option'), + 'sourceNote' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'fromBug' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'feedback' => array('object' => 'story', 'field' => '', 'type' => 'number'), 'title' => array('object' => 'story', 'field' => 'title', 'type' => 'string'), - 'keywords' => array('object' => 'story', 'field' => 'keywords', 'type' => 'string'), - 'type' => array('object' => 'story', 'field' => 'type', 'type' => 'string'), - 'category' => array('object' => 'story', 'field' => 'category', 'type' => 'string'), - 'pri' => array('object' => 'story', 'field' => 'pri', 'type' => 'string'), - 'estimate' => array('object' => 'story', 'field' => 'estimate', 'type' => 'string'), - 'status' => array('object' => 'story', 'field' => 'status', 'type' => 'string'), - 'subStatus' => array('object' => 'story', 'field' => 'subStatus', 'type' => 'string'), - 'color' => array('object' => 'story', 'field' => 'color', 'type' => 'string'), - 'stage' => array('object' => 'story', 'field' => 'stage', 'type' => 'string'), - 'stagedBy' => array('object' => 'story', 'field' => 'stagedBy', 'type' => 'string'), - 'mailto' => array('object' => 'story', 'field' => 'mailto', 'type' => 'string'), - 'lib' => array('object' => 'project', 'field' => 'lib', 'type' => 'string'), - 'fromStory' => array('object' => 'project', 'field' => 'fromStory', 'type' => 'string'), - 'fromVersion' => array('object' => 'project', 'field' => 'fromVersion', 'type' => 'string'), - 'openedBy' => array('object' => 'story', 'field' => 'openedBy', 'type' => 'string'), - 'openedDate' => array('object' => 'story', 'field' => 'openedDate', 'type' => 'string'), - 'assignedTo' => array('object' => 'story', 'field' => 'assignedTo', 'type' => 'string'), - 'assignedDate' => array('object' => 'story', 'field' => 'assignedDate', 'type' => 'string'), - 'approvedDate' => array('object' => 'project', 'field' => 'approvedDate', 'type' => 'string'), - 'lastEditedBy' => array('object' => 'story', 'field' => 'lastEditedBy', 'type' => 'string'), - 'lastEditedDate' => array('object' => 'story', 'field' => 'lastEditedDate', 'type' => 'string'), - 'changedBy' => array('object' => 'story', 'field' => 'changedBy', 'type' => 'string'), - 'changedDate' => array('object' => 'story', 'field' => 'changedDate', 'type' => 'string'), - 'reviewedBy' => array('object' => 'story', 'field' => 'reviewedBy', 'type' => 'string'), - 'reviewedDate' => array('object' => 'story', 'field' => 'reviewedDate', 'type' => 'string'), - 'closedBy' => array('object' => 'story', 'field' => 'closedBy', 'type' => 'string'), - 'closedDate' => array('object' => 'story', 'field' => 'closedDate', 'type' => 'string'), - 'closedReason' => array('object' => 'story', 'field' => 'closedReason', 'type' => 'string'), - 'activatedDate' => array('object' => 'story', 'field' => 'activatedDate', 'type' => 'string'), - 'toBug' => array('object' => 'story', 'field' => 'toBug', 'type' => 'string'), - 'childStories' => array('object' => 'story', 'field' => 'childStories', 'type' => 'string'), - 'linkStories' => array('object' => 'story', 'field' => 'linkStories', 'type' => 'string'), - 'linkRequirements' => array('object' => 'story', 'field' => 'linkRequirements', 'type' => 'string'), - 'twins' => array('object' => 'story', 'field' => 'twins', 'type' => 'string'), - 'duplicateStory' => array('object' => 'story', 'field' => 'duplicateStory', 'type' => 'string'), - 'version' => array('object' => 'story', 'field' => 'version', 'type' => 'string'), - 'storyChanged' => array('object' => 'project', 'field' => 'storyChanged', 'type' => 'string'), - 'feedbackBy' => array('object' => 'story', 'field' => 'feedbackBy', 'type' => 'string'), - 'notifyEmail' => array('object' => 'story', 'field' => 'notifyEmail', 'type' => 'string'), - 'URChanged' => array('object' => 'story', 'field' => 'URChanged', 'type' => 'string'), - 'deleted' => array('object' => 'story', 'field' => 'deleted', 'type' => 'string'), + 'keywords' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'type' => array('object' => 'story', 'field' => 'type', 'type' => 'option'), + 'category' => array('object' => 'story', 'field' => 'category', 'type' => 'option'), + 'pri' => array('object' => 'story', 'field' => 'pri', 'type' => 'option'), + 'estimate' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'status' => array('object' => 'story', 'field' => 'status', 'type' => 'option'), + 'subStatus' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'color' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'stage' => array('object' => 'story', 'field' => 'stage', 'type' => 'option'), + 'stagedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'mailto' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'lib' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'fromStory' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'fromVersion' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'openedBy' => array('object' => 'story', 'field' => 'openedBy', 'type' => 'user'), + 'openedDate' => array('object' => 'story', 'field' => 'openedDate', 'type' => 'date'), + 'assignedTo' => array('object' => 'story', 'field' => 'assignedTo', 'type' => 'user'), + 'assignedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'approvedDate' => array('object' => 'project', 'field' => '', 'type' => 'date'), + 'lastEditedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'lastEditedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'changedBy' => array('object' => 'story', 'field' => 'changedBy', 'type' => 'user'), + 'changedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'reviewedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'reviewedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'releasedDate' => array('object' => 'project', 'field' => '', 'type' => 'date'), + 'closedBy' => array('object' => 'story', 'field' => 'closedBy', 'type' => 'user'), + 'closedDate' => array('object' => 'story', 'field' => 'closedDate', 'type' => 'date'), + 'closedReason' => array('object' => 'story', 'field' => 'closedReason', 'type' => 'option'), + 'activatedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'toBug' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'linkStories' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'linkRequirements' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'twins' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'duplicateStory' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'version' => array('object' => 'story', 'field' => '', 'type' => 'number'), + 'parentVersion' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'demandVersion' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'storyChanged' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'feedbackBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'notifyEmail' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'BSA' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'duration' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'demand' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'submitedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'roadmap' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'URChanged' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'unlinkReason' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'retractedReason' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'retractedBy' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'retractedDate' => array('object' => 'story', 'field' => '', 'type' => 'date'), + 'deleted' => array('object' => 'story', 'field' => '', 'type' => 'string'), 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string') ), + 'langs' => array + ( + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'vision' => array('zh-cn' => 'vision', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'parent' => array('zh-cn' => 'parent', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'isParent' => array('zh-cn' => '是父需求', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'root' => array('zh-cn' => 'root', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'path' => array('zh-cn' => '路径', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'grade' => array('zh-cn' => '需求层级', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'product' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'branch' => array('zh-cn' => 'branch', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'module' => array('zh-cn' => 'module', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'plan' => array('zh-cn' => 'plan', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'source' => array('zh-cn' => 'source', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'sourceNote' => array('zh-cn' => 'sourceNote', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'fromBug' => array('zh-cn' => 'fromBug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'feedback' => array('zh-cn' => 'feedback', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'title' => array('zh-cn' => 'title', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'keywords' => array('zh-cn' => 'keywords', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'type' => array('zh-cn' => 'type', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'category' => array('zh-cn' => 'category', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'pri' => array('zh-cn' => 'pri', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'estimate' => array('zh-cn' => 'estimate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'status' => array('zh-cn' => 'status', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'subStatus' => array('zh-cn' => 'subStatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'color' => array('zh-cn' => 'color', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stage' => array('zh-cn' => '不同阶段需求', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stagedBy' => array('zh-cn' => 'stagedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'mailto' => array('zh-cn' => 'mailto', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lib' => array('zh-cn' => 'lib', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'fromStory' => array('zh-cn' => 'fromStory', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'fromVersion' => array('zh-cn' => 'fromVersion', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedBy' => array('zh-cn' => 'openedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedDate' => array('zh-cn' => 'openedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedTo' => array('zh-cn' => 'assignedTo', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedDate' => array('zh-cn' => 'assignedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'approvedDate' => array('zh-cn' => 'approvedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lastEditedBy' => array('zh-cn' => 'lastEditedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lastEditedDate' => array('zh-cn' => 'lastEditedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'changedBy' => array('zh-cn' => 'changedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'changedDate' => array('zh-cn' => 'changedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'reviewedBy' => array('zh-cn' => 'reviewedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'reviewedDate' => array('zh-cn' => 'reviewedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'releasedDate' => array('zh-cn' => 'releasedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedBy' => array('zh-cn' => 'closedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedDate' => array('zh-cn' => 'closedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedReason' => array('zh-cn' => 'closedReason', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'activatedDate' => array('zh-cn' => 'activatedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'toBug' => array('zh-cn' => 'toBug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'linkStories' => array('zh-cn' => 'linkStories', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'linkRequirements' => array('zh-cn' => 'linkRequirements', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'twins' => array('zh-cn' => 'twins', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'duplicateStory' => array('zh-cn' => 'duplicateStory', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'version' => array('zh-cn' => 'version', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'parentVersion' => array('zh-cn' => '父版本', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'demandVersion' => array('zh-cn' => 'demandVersion', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'storyChanged' => array('zh-cn' => 'storyChanged', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'feedbackBy' => array('zh-cn' => 'feedbackBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'notifyEmail' => array('zh-cn' => 'notifyEmail', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'BSA' => array('zh-cn' => 'BSA', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'duration' => array('zh-cn' => '管理周期', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'demand' => array('zh-cn' => 'demand', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'submitedBy' => array('zh-cn' => '提交评审人', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'roadmap' => array('zh-cn' => '所属路标', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'URChanged' => array('zh-cn' => 'URChanged', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'unlinkReason' => array('zh-cn' => 'unlinkReason', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'retractedReason' => array('zh-cn' => 'retractedReason', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'retractedBy' => array('zh-cn' => '由谁撤销', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'retractedDate' => array('zh-cn' => '撤销时间', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'deleted' => array('zh-cn' => 'deleted', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'name' => array('zh-cn' => 'name', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + ), + 'vars' => array(), + 'drills' => array + ( + array + ( + 'field' => 'stage', + 'object' => 'story', + 'whereSql' => "WHERE t1.deleted='0' ", + 'condition' => array + ( + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'product'), + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'stage', 'queryField' => 'stage') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -581,34 +814,56 @@ $config->bi->builtin->pivots[] = array 'code' => 'productRelease', 'desc' => array('zh-cn' => '按照产品列出发布的数量。', 'zh-tw' => '按照產品列出發布的數量。', 'en' => 'Product Release.', 'de' => 'Product Release.', 'fr' => 'Product Release.'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '59', 'sql' => << array ( - 'group1' => 'name', - 'group2' => '', - 'columnTotal' => 'sum', + 'summary' => 'use', + 'group1' => 'product', 'columns' => array ( - array('field' => 'releases', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'releases', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum' ), + 'filters' => array(), 'fields' => array ( - 'name' => array('object' => 'release', 'field' => 'name', 'type' => 'string'), - 'releases' => array('object' => 'product', 'field' => 'releases', 'type' => 'string') + 'product' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), + 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), + 'releases' => array('object' => 'product', 'field' => '', 'type' => 'number') ), 'langs' => array ( - 'count' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories'), - 'done' => array('zh-cn' => '完成数', 'zh-tw' => '完成数', 'en' => 'Done') + 'product' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'name' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'releases' => array('zh-cn' => '发布', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + ), + 'vars' => array(), + 'drills' => array + ( + array + ( + 'field' => 'releases', + 'object' => 'release', + 'whereSql' => "WHERE t1.deleted='0' ", + 'condition' => array + ( + array('drillObject' => 'zt_release', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'product') + ) + ) ), 'stage' => 'published', 'builtin' => '0' @@ -621,46 +876,73 @@ $config->bi->builtin->pivots[] = array 'code' => 'taskStatus', 'desc' => array('zh-cn' => '按照执行统计任务的状态分布情况。', 'zh-tw' => '按照執行統計任務的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => <<=\$beginDate) and if(\$endDate='',1,t1.end<=\$endDate) -EOT -, +select + t3.id project, + t3.name as projectname, + t2.status, + (case when t3.multiple='1' then t1.name else '' end) as executionname, + (case when t3.multiple='1' then t1.id else '' end) as execution, + t2.id as taskID, + t1.status as projectstatus, + (case when cast(t2.deadline as date) < current_date() + and t2.deadline is not null + and t2.status != 'closed' + and t2.status != 'done' + and t2.status != 'cancel' then 1 else 0 end + ) as timeout +from zt_project as t1 +left join zt_task as t2 on t1.id=t2.execution +left join zt_project as t3 on t3.id=t1.project +where t1.deleted='0' +and t1.type in ('sprint','stage') +and t2.deleted='0' +and (case when \$project='' then 1 else t3.id=\$project end) +and (case when \$status='' then 1 else t1.status=\$status end) +and (case when \$beginDate='' then 1 else t1.begin>=\$beginDate end) +and (case when \$endDate='' then 1 else t1.end<=\$endDate end) +EOT, 'settings' => array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'status', 'slice' => 'status', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'taskID', 'slice' => 'status', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( array('from' => 'query', 'field' => 'project', 'name' => '项目列表', 'type' => 'select', 'typeOption' => 'project', 'default' => ''), array('from' => 'query', 'field' => 'status', 'name' => '执行状态', 'type' => 'select', 'typeOption' => 'project.status', 'default' => ''), - array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHBEGIN'), - array('from' => 'query', 'field' => 'endDate', 'name' => '执行结束日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHEND') + array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => ''), + array('from' => 'query', 'field' => 'endDate', 'name' => '执行结束日期', 'type' => 'date', 'typeOption' => '', 'default' => '') ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 'name' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), - 'status' => array('object' => 'project', 'field' => 'status', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'taskID' => array('object' => 'task', 'field' => 'taskID', 'type' => 'string'), - 'projectstatus' => array('object' => 'task', 'field' => 'projectstatus', 'type' => 'string'), - 'timeout' => array('object' => 'task', 'field' => 'timeout', 'type' => 'string') + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'status' => array('object' => 'task', 'field' => 'status', 'type' => 'option'), + 'executionname' => array('object' => 'task', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'taskID' => array('object' => 'task', 'field' => '', 'type' => 'number'), + 'projectstatus' => array('object' => 'task', 'field' => '', 'type' => 'string'), + 'timeout' => array('object' => 'task', 'field' => '', 'type' => 'number') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'status' => array('zh-cn' => '状态', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'taskID' => array('zh-cn' => '不同状态任务', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectstatus' => array('zh-cn' => 'projectstatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'timeout' => array('zh-cn' => 'timeout', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -670,6 +952,20 @@ EOT 'selectList' => array('project', 'project.status', 'user', 'user'), 'default' => array('', '', '$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'taskID', + 'object' => 'task', + 'whereSql' => "left join zt_project t2 on t1.execution=t2.id WHERE t1.deleted='0' and (case when \$project='' then 1 else t1.id=\$project end) and (case when \$status='' then 1 else t2.status=\$status end) and (case when \$beginDate='' then 1 else t2.begin>=\$beginDate end) and (case when \$endDate='' then 1 else t2.end<=\$endDate end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution'), + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'status', 'queryField' => 'status') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -681,47 +977,64 @@ $config->bi->builtin->pivots[] = array 'code' => 'taskType', 'desc' => array('zh-cn' => '按照项目统计任务的类型分布情况。', 'zh-tw' => '按照項目統計任務的類型分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => <<=\$beginDate) and if(\$endDate='',1,t1.end<=\$endDate) -EOT -, +where t1.deleted='0' +and t1.type in ('sprint','stage') +and t2.deleted='0' +and (case when \$project='' then 1 else t3.id=\$project end) +and (case when \$status='' then 1 else t1.status=\$status end) +and (case when \$beginDate='' then 1 else t1.begin>=\$beginDate end) +and (case when \$endDate='' then 1 else t1.end<=\$endDate end) +EOT, 'settings' => array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'type', 'slice' => 'type', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'taskID', 'slice' => 'type', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'id', + 'group2' => 'execution' ), 'filters' => array ( array('from' => 'query', 'field' => 'project', 'name' => '项目列表', 'type' => 'select', 'typeOption' => 'project', 'default' => ''), array('from' => 'query', 'field' => 'status', 'name' => '执行状态', 'type' => 'select', 'typeOption' => 'project.status', 'default' => ''), - array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHBEGIN'), + array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => ''), array('from' => 'query', 'field' => 'endDate', 'name' => '执行结束日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHEND') ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'executionname' => array('object' => 'task', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), 'type' => array('object' => 'task', 'field' => 'type', 'type' => 'option'), - 'taskID' => array('object' => 'task', 'field' => 'taskID', 'type' => 'string'), - 'projectstatus' => array('object' => 'task', 'field' => 'projectstatus', 'type' => 'string') + 'taskID' => array('object' => 'task', 'field' => '', 'type' => 'number'), + 'projectstatus' => array('object' => 'task', 'field' => '', 'type' => 'string') ), 'langs' => array ( 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'id' => array('zh-cn' => '项目ID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'type' => array('zh-cn' => '任务类型', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'taskID' => array('zh-cn' => 'taskID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'taskID' => array('zh-cn' => '不同类型任务', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'projectstatus' => array('zh-cn' => 'projectstatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array @@ -732,6 +1045,20 @@ EOT 'selectList' => array('project', 'project.status', 'user', 'user'), 'default' => array('', '', '$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'taskID', + 'object' => 'task', + 'whereSql' => "left join zt_project t2 on t1.execution=t2.id WHERE t1.deleted='0' and (case when \$project='' then 1 else t1.id=\$project end) and (case when \$status='' then 1 else t2.status=\$status end) and (case when \$beginDate='' then 1 else t2.begin>=\$beginDate end) and (case when \$endDate='' then 1 else t2.end<=\$endDate end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution'), + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'type', 'queryField' => 'type') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -743,45 +1070,69 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectTaskAssign', 'desc' => array('zh-cn' => '按照项目统计任务的指派给分布情况。', 'zh-tw' => '按照項目統計任務的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => <<=\$beginDate) and if(\$endDate='',1,t1.end<=\$endDate) -EOT -, +where t1.deleted='0' +and t1.type in ('sprint','stage') +and t2.deleted='0' +and (case when \$project='' then 1 else t4.id=\$project end) +and (case when \$status='' then 1 else t1.status=\$status end) +and (case when \$beginDate='' then 1 else t1.begin>=\$beginDate end) +and (case when \$endDate='' then 1 else t1.end<=\$endDate end) +EOT, 'settings' => array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'assignedTo', 'slice' => 'assignedTo', 'stat' => 'count', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'taskID', 'slice' => 'assignedTo', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( array('from' => 'query', 'field' => 'project', 'name' => '项目列表', 'type' => 'select', 'typeOption' => 'project', 'default' => ''), array('from' => 'query', 'field' => 'status', 'name' => '执行状态', 'type' => 'select', 'typeOption' => 'project.status', 'default' => ''), - array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHBEGIN'), + array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => ''), array('from' => 'query', 'field' => 'endDate', 'name' => '执行结束日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHEND') ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'assignedTo' => array('object' => 'task', 'field' => 'assignedTo', 'type' => 'string'), - 'taskID' => array('object' => 'team', 'field' => 'taskID', 'type' => 'string'), - 'projectstatus' => array('object' => 'team', 'field' => 'projectstatus', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'team', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'assignedTo' => array('object' => 'task', 'field' => 'assignedTo', 'type' => 'user'), + 'taskID' => array('object' => 'team', 'field' => '', 'type' => 'number'), + 'projectstatus' => array('object' => 'team', 'field' => '', 'type' => 'string') ), 'langs' => array ( - 'assignedTo' => array('zh-cn' => '指派给'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedTo' => array('zh-cn' => '指派给', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'taskID' => array('zh-cn' => '人员被指派任务', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectstatus' => array('zh-cn' => 'projectstatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -791,6 +1142,20 @@ EOT 'selectList' => array('project', 'project.status', 'user', 'user'), 'default' => array('', '', '$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'taskID', + 'object' => 'task', + 'whereSql' => "left join zt_project t2 on t1.execution=t2.id WHERE t1.deleted='0' and (case when \$project='' then 1 else t1.project=\$project end) and (case when \$status='' then 1 else t2.status=\$status end) and (case when \$beginDate='' then 1 else t2.begin>=\$beginDate end) and (case when \$endDate='' then 1 else t2.end<=\$endDate end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution'), + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'assignedTo', 'queryField' => 'assignedTo') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -802,44 +1167,70 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectTaskFinished', 'desc' => array('zh-cn' => '按照项目统计任务的完成者分布情况。', 'zh-tw' => '按照項目統計任務的完成者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => <<=\$beginDate) and if(\$endDate='',1,t1.end<=\$endDate) -EOT -, +left join zt_user as t4 on t2.finishedBy=t4.account +where t1.deleted='0' +and t1.type in ('sprint','stage') +and t2.deleted='0' +and t2.finishedBy!='' +and (case when \$project='' then 1 else t3.id=\$project end) +and (case when \$status='' then 1 else t1.status=\$status end) +and (case when \$dept='' then 1 else t4.dept=\$dept end) +and (case when \$user='' then 1 else t2.finishedBy=\$user end) +EOT, 'settings' => array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'finishedBy', 'slice' => 'finishedBy', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'taskID', 'slice' => 'finishedBy', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( array('from' => 'query', 'field' => 'project', 'name' => '项目列表', 'type' => 'select', 'typeOption' => 'project', 'default' => ''), array('from' => 'query', 'field' => 'status', 'name' => '执行状态', 'type' => 'select', 'typeOption' => 'project.status', 'default' => ''), - array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHBEGIN'), - array('from' => 'query', 'field' => 'endDate', 'name' => '执行结束日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHEND') + array('field' => 'dept', 'name' => '完成者所在部门', 'type' => 'select', 'typeOption' => 'dept', 'default' => '', 'from' => 'query'), + array('field' => 'user', 'name' => '完成者', 'type' => 'select', 'typeOption' => 'user', 'default' => '', 'from' => 'query') ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'finishedBy' => array('object' => 'task', 'field' => 'finishedBy', 'type' => 'string'), - 'taskID' => array('object' => 'task', 'field' => 'taskID', 'type' => 'string'), - 'projectstatus' => array('object' => 'task', 'field' => 'projectstatus', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'task', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'finishedBy' => array('object' => 'task', 'field' => 'finishedBy', 'type' => 'user'), + 'taskID' => array('object' => 'task', 'field' => '', 'type' => 'number'), + 'projectstatus' => array('object' => 'task', 'field' => '', 'type' => 'string') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'finishedBy' => array('zh-cn' => '由谁完成', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'taskID' => array('zh-cn' => '不同完成者完成的任务', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectstatus' => array('zh-cn' => 'projectstatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -849,6 +1240,20 @@ EOT 'selectList' => array('project', 'project.status', 'user', 'user'), 'default' => array('', '', '$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'taskID', + 'object' => 'task', + 'whereSql' => "left join zt_project t2 on t1.execution=t2.id left join zt_user t3 on t1.finishedBy=t3.account WHERE t1.deleted='0' AND t1.finishedBy!='' and (case when \$project='' then 1 else t1.project=\$project end) and (case when \$status='' then 1 else t2.status=\$status end) and (case when \$dept='' then 1 else t3.dept=\$dept end) and (case when \$user='' then 1 else t1.finishedBy=\$user end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'finishedBy', 'queryField' => 'finishedBy'), + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -860,58 +1265,81 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectInvested', 'desc' => array('zh-cn' => '按照项目列出:任务数,需求数,人数,总消耗工时。', 'zh-tw' => '按照項目列出:任務數,需求數,人數,總消耗工時。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => <<=\$beginDate) and if(\$endDate='',1,t1.end<=\$endDate) -EOT -, +where t1.deleted='0' +and t1.type in ('sprint','stage') +and (case when \$project='' then 1 else t5.id=\$project end) +and (case when \$status='' then 1 else t1.status=\$status end) +and (case when \$beginDate='' then 1 else t1.begin>=\$beginDate end) +and (case when \$endDate='' then 1 else t1.end<=\$endDate end) +EOT, 'settings' => array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'number', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'teams', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'consumed', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'number', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'teams', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'consumed', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( array('from' => 'query', 'field' => 'project', 'name' => '项目列表', 'type' => 'select', 'typeOption' => 'project', 'default' => ''), array('from' => 'query', 'field' => 'status', 'name' => '执行状态', 'type' => 'select', 'typeOption' => 'project.status', 'default' => ''), - array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHBEGIN'), + array('from' => 'query', 'field' => 'beginDate', 'name' => '执行起始日期', 'type' => 'date', 'typeOption' => '', 'default' => ''), array('from' => 'query', 'field' => 'endDate', 'name' => '执行结束日期', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHEND') ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'timeLimit' => array('object' => 'project', 'field' => 'timeLimit', 'type' => 'string'), - 'teams' => array('object' => 'project', 'field' => 'teams', 'type' => 'string'), - 'stories' => array('object' => 'project', 'field' => 'stories', 'type' => 'string'), - 'consumed' => array('object' => 'project', 'field' => 'consumed', 'type' => 'string'), - 'number' => array('object' => 'project', 'field' => 'number', 'type' => 'string'), - 'projectstatus' => array('object' => 'project', 'field' => 'projectstatus', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'timeLimit' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'teams' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'stories' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'consumed' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'number' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'projectstatus' => array('object' => 'project', 'field' => '', 'type' => 'string') ), 'langs' => array ( - 'timeLimit' => array('zh-cn' => '工期'), - 'teams' => array('zh-cn' => '人数'), - 'stories' => array('zh-cn' => '需求数'), - 'consumed' => array('zh-cn' => '总消耗'), - 'number' => array('zh-cn' => '任务数'), - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'timeLimit' => array('zh-cn' => '工期', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'teams' => array('zh-cn' => '人数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stories' => array('zh-cn' => '需求数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'consumed' => array('zh-cn' => '总消耗', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'number' => array('zh-cn' => '任务数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectstatus' => array('zh-cn' => 'projectstatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -921,6 +1349,39 @@ EOT 'selectList' => array('project', 'project.status', 'user', 'user'), 'default' => array('', '', '$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'number', + 'object' => 'task', + 'whereSql' => "left join zt_project as t2 on t1.execution=t2.id left join zt_project as t3 on t2.project=t3.id where t1.deleted='0' and t2.deleted='0' and t2.type in ('sprint','stage') and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$status='' then 1 else t2.status=\$status end) and (case when \$beginDate='' then 1 else t2.begin>=\$beginDate end) and (case when \$endDate='' then 1 else t2.end<=\$endDate end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'stories', + 'object' => 'story', + 'whereSql' => "right join zt_projectstory as t2 on t2.story=t1.id left join zt_project as t3 on t2.project=t3.id left join zt_project as t4 on t4.id=t3.project where t3.deleted='0' and t3.type in('sprint', 'stage') and t1.deleted='0' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$status='' then 1 else t1.status=\$status end) and (case when \$beginDate='' then 1 else t3.begin>=\$beginDate end) and (case when \$endDate='' then 1 else t3.end<=\$endDate end)", + 'condition' => array + ( + array('drillObject' => 'zt_project', 'drillAlias' => 't3', 'drillField' => 'id', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'teams', + 'object' => 'user', + 'whereSql' => "left join zt_team t2 on t1.account=t2.account left join zt_project t3 on t2.root=t3.id left join zt_project t4 on t3.project=t4.id where t2.type ='execution' and t3.deleted='0' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$status='' then 1 else t3.status=\$status end) and (case when \$beginDate='' then 1 else t3.begin>=\$beginDate end) and (case when \$endDate='' then 1 else t3.end<=\$endDate end)", + 'condition' => array + ( + array('drillObject' => 'zt_team', 'drillAlias' => 't2', 'drillField' => 'root', 'queryField' => 'execution') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -932,24 +1393,36 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectStoryStatus', 'desc' => array('zh-cn' => '按照项目统计需求的状态分布情况。', 'zh-tw' => '按照項目統計需求的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'status', 'slice' => 'status', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'status', 'slice' => 'status', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( @@ -959,15 +1432,21 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'projectstory', 'field' => 'project', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'status' => array('object' => 'story', 'field' => 'status', 'type' => 'option') + 'id' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'status' => array('object' => 'story', 'field' => 'status', 'type' => 'option') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'status' => array('zh-cn' => '不同状态Bug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -977,6 +1456,20 @@ EOT 'selectList' => array('project', 'execution', 'project.status'), 'default' => array('', '', '') ), + 'drills' => array + ( + array + ( + 'field' => 'status', + 'object' => 'story', + 'whereSql' => "right join zt_projectstory as t2 on t2.story=t1.id left join zt_project as t3 on t2.project=t3.id left join zt_project as t4 on t4.id=t3.project where t3.deleted='0' and t3.type in('sprint', 'stage') and t1.deleted='0' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) and (case when \$status='' then 1 else t3.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_projectstory', 'drillAlias' => 't2', 'drillField' => 'project', 'queryField' => 'execution'), + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'status', 'queryField' => 'status') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -988,24 +1481,36 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectStoryStage', 'desc' => array('zh-cn' => '按照项目统计需求阶段分布情况。', 'zh-tw' => '按照項目統計需求階段分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'stage', 'slice' => 'stage', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'stage', 'slice' => 'stage', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( @@ -1015,17 +1520,21 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'projectstory', 'field' => 'project', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'stage' => array('object' => 'story', 'field' => 'stage', 'type' => 'option') + 'id' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'story', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'stage' => array('object' => 'story', 'field' => 'stage', 'type' => 'string') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'id' => array('zh-cn' => '项目ID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'stage' => array('zh-cn' => '阶段', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + 'id' => array('zh-cn' => '项目ID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stage' => array('zh-cn' => '不同阶段Bug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1035,6 +1544,20 @@ EOT 'selectList' => array('project', 'execution', 'project.status'), 'default' => array('', '', '') ), + 'drills' => array + ( + array + ( + 'field' => 'stage', + 'object' => 'story', + 'whereSql' => "right join zt_projectstory as t2 on t2.story=t1.id left join zt_project as t3 on t2.project=t3.id left join zt_project as t4 on t4.id=t3.project where t3.deleted='0' and t3.type in('sprint', 'stage') and t1.deleted='0' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) and (case when \$status='' then 1 else t3.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_projectstory', 'drillAlias' => 't2', 'drillField' => 'project', 'queryField' => 'execution'), + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'stage', 'queryField' => 'stage') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1046,23 +1569,36 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectBugResolution', 'desc' => array('zh-cn' => '按照项目统计Bug的解决方案分布情况。', 'zh-tw' => '按照項目統計Bug的解決方案分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60,61', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'resolution', 'slice' => 'resolution', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'resolution', 'slice' => 'resolution', 'stat' => 'count', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( @@ -1071,17 +1607,23 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't3id' => array('object' => 'project', 'field' => 't3id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'bugID' => array('object' => 'bug', 'field' => 'bugID', 'type' => 'string'), - 'resolution' => array('object' => 'bug', 'field' => 'resolution', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'projectID' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'executionname' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'bugID' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'resolution' => array('object' => 'bug', 'field' => 'resolution', 'type' => 'option') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => '项目', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectID' => array('zh-cn' => '执行', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolution' => array('zh-cn' => '解决方案', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1091,6 +1633,20 @@ EOT 'selectList' => array('project', 'execution'), 'default' => array('', '') ), + 'drills' => array + ( + array + ( + 'field' => 'resolution', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t1.execution=t2.id left join zt_project as t3 on t3.id=t2.project where t1.deleted='0' and t2.deleted='0' and t1.resolution!='' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'resolution', 'queryField' => 'resolution') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1102,23 +1658,35 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectBugStatus', 'desc' => array('zh-cn' => '按照项目统计Bug的状态分布情况。', 'zh-tw' => '按照項目統計Bug的狀態分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60,61', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'status', 'slice' => 'status', 'stat' => 'count', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'status', 'slice' => 'status', 'stat' => 'count', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'noShow', + 'group1' => 'projectID', + 'group2' => 'executionID' ), 'filters' => array ( @@ -1127,17 +1695,23 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't3id' => array('object' => 'project', 'field' => 't3id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'bugID' => array('object' => 'bug', 'field' => 'bugID', 'type' => 'string'), - 'status' => array('object' => 'bug', 'field' => 'status', 'type' => 'option') + 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'number'), + 'project' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'projectID' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'execution' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'executionID' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'bugID' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'status' => array('object' => 'bug', 'field' => 'status', 'type' => 'option') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectID' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionID' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'status' => array('zh-cn' => 'Bug状态', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1147,6 +1721,20 @@ EOT 'selectList' => array('project', 'execution'), 'default' => array('', '') ), + 'drills' => array + ( + array + ( + 'field' => 'status', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t2.id=t1.execution left join zt_project as t3 on t3.id=t1.project WHERE t1.deleted='0' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t1.id=\$execution end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'executionID'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'status', 'queryField' => 'status') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1158,23 +1746,35 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectBugOpenedBy', 'desc' => array('zh-cn' => '按照项目统计Bug的创建者分布情况。', 'zh-tw' => '按照項目統計Bug的創建者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60,61', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'openedBy', 'slice' => 'openedBy', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'openedBy', 'slice' => 'openedBy', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'projectID', + 'group2' => 'execution' ), 'filters' => array ( @@ -1183,17 +1783,23 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't3id' => array('object' => 'project', 'field' => 't3id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'bugID' => array('object' => 'bug', 'field' => 'bugID', 'type' => 'string'), - 'openedBy' => array('object' => 'project', 'field' => 'openedBy', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'projectID' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'bugID' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'openedBy' => array('object' => 'project', 'field' => 'openedBy', 'type' => 'user') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectID' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedBy' => array('zh-cn' => '创建者', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1203,6 +1809,20 @@ EOT 'selectList' => array('project', 'execution'), 'default' => array('', '') ), + 'drills' => array + ( + array + ( + 'field' => 'openedBy', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t2.id=t1.execution left join zt_project as t3 on t3.id=t2.project where t1.deleted='0' and t2.deleted='0' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'openedBy', 'queryField' => 'openedBy') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1214,23 +1834,37 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectBugResolvedBy', 'desc' => array('zh-cn' => '按照项目统计Bug的解决者分布情况。', 'zh-tw' => '按照項目統計Bug的解決者分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60,61', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'resolvedBy', 'slice' => 'resolvedBy', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'resolvedBy', 'slice' => 'resolvedBy', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'projectID', + 'group2' => 'execution' ), 'filters' => array ( @@ -1239,17 +1873,23 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't3id' => array('object' => 'project', 'field' => 't3id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'bugID' => array('object' => 'bug', 'field' => 'bugID', 'type' => 'string'), - 'resolvedBy' => array('object' => 'bug', 'field' => 'resolvedBy', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'project' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'projectID' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'bugID' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'resolvedBy' => array('object' => 'bug', 'field' => 'resolvedBy', 'type' => 'user') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectID' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolvedBy' => array('zh-cn' => '解决者', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1259,6 +1899,20 @@ EOT 'selectList' => array('project', 'execution'), 'default' => array('', '') ), + 'drills' => array + ( + array + ( + 'field' => 'resolvedBy', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t2.id=t1.execution left join zt_project as t3 on t3.id=t2.project where t1.deleted='0' and t2.deleted='0' and t1.status!='active' and t1.resolvedBy!='' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'resolvedBy', 'queryField' => 'resolvedBy') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1270,23 +1924,35 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectBugAssignedBy', 'desc' => array('zh-cn' => '按照项目统计Bug的指派给分布情况。', 'zh-tw' => '按照項目統計Bug的指派給分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60,61', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'assignedTo', 'slice' => 'assignedTo', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'assignedTo', 'slice' => 'assignedTo', 'stat' => 'count', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'noShow', + 'group1' => 'projectID', + 'group2' => 'executionID' ), 'filters' => array ( @@ -1295,17 +1961,23 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't3id' => array('object' => 'project', 'field' => 't3id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'bugID' => array('object' => 'bug', 'field' => 'bugID', 'type' => 'string'), - 'assignedTo' => array('object' => 'bug', 'field' => 'assignedTo', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'number'), + 'project' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'projectID' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'execution' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'executionID' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'bugID' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'assignedTo' => array('object' => 'bug', 'field' => 'assignedTo', 'type' => 'user') ), 'langs' => array ( - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectID' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionID' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedTo' => array('zh-cn' => '指派给', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1315,6 +1987,33 @@ EOT 'selectList' => array('project', 'execution'), 'default' => array('', '') ), + 'drills' => array + ( + array + ( + 'field' => 'assignedTo', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t1. project=t2.id left join zt_project as t3 on t1. execution=t3.id WHERE t1.deleted='0' and (case when \$project='' then 1 else t2.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) ", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'executionID'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'assignedTo', 'queryField' => 'assignedTo'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'project', 'queryField' => 'projectID') + ) + ), + array + ( + 'field' => 'assignedTo', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t1. project=t2.id left join zt_project as t3 on t1. execution=t3.id WHERE t1.deleted='0' and (case when \$project='' then 1 else t2.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) ", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'executionID'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'assignedTo', 'queryField' => 'assignedTo'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'project', 'queryField' => 'projectID') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1326,33 +2025,53 @@ $config->bi->builtin->pivots[] = array 'code' => 'projectQuality', 'desc' => array('zh-cn' => '列出项目的需求总数,完成需求数,任务总数,完成的任务数,Bug数,解决的Bug数,Bug/需求,Bug/任务,重要Bug数量(严重程度不大于3)。', 'zh-tw' => '列出項目的需求總數,完成需求數,任務總數,完成的任務數,Bug數,解決的Bug數,Bug/需求,Bug/任務,重要Bug數量(嚴重程度不大於3)。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'doneStory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'number', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'doneTask', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'bugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'resolutions', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'bugthanstory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'bugthantask', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'seriousBugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'doneStory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'number', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'doneTask', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'bugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'resolutions', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'bugthanstory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'bugthantask', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'seriousBugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( @@ -1361,34 +2080,37 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't5id' => array('object' => 'project', 'field' => 't5id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'stories' => array('object' => 'project', 'field' => 'stories', 'type' => 'string'), - 'doneStory' => array('object' => 'project', 'field' => 'doneStory', 'type' => 'string'), - 'number' => array('object' => 'project', 'field' => 'number', 'type' => 'string'), - 'doneTask' => array('object' => 'project', 'field' => 'doneTask', 'type' => 'string'), - 'bugs' => array('object' => 'project', 'field' => 'bugs', 'type' => 'string'), - 'resolutions' => array('object' => 'project', 'field' => 'resolutions', 'type' => 'string'), - 'bugthanstory' => array('object' => 'project', 'field' => 'bugthanstory', 'type' => 'string'), - 'bugthantask' => array('object' => 'project', 'field' => 'bugthantask', 'type' => 'string'), - 'seriousBugs' => array('object' => 'project', 'field' => 'seriousBugs', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'stories' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'doneStory' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'number' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'doneTask' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'bugs' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'resolutions' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'bugthanstory' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'bugthantask' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'seriousBugs' => array('object' => 'project', 'field' => '', 'type' => 'number') ), 'langs' => array ( - 'stories' => array('zh-cn' => '需求总数'), - 'doneStory' => array('zh-cn' => '完成需求数'), - 'number' => array('zh-cn' => '任务总数'), - 'doneTask' => array('zh-cn' => '完成任务数'), - 'bugs' => array('zh-cn' => 'Bug数'), - 'resolutions' => array('zh-cn' => '解决Bug数'), - 'bugthanstory' => array('zh-cn' => 'Bug/完成需求'), - 'bugthantask' => array('zh-cn' => 'Bug/完成任务'), - 'seriousBugs' => array('zh-cn' => '重要Bug数'), - 'seriousBugsPercent' => array('zh-cn' => '严重Bug比率'), - 'project' => array('zh-cn' => '项目名称'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stories' => array('zh-cn' => '需求总数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'doneStory' => array('zh-cn' => '关闭需求数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'number' => array('zh-cn' => '任务总数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'doneTask' => array('zh-cn' => '完成任务数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugs' => array('zh-cn' => 'Bug数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolutions' => array('zh-cn' => '解决Bug数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugthanstory' => array('zh-cn' => 'Bug/完成需求', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugthantask' => array('zh-cn' => 'Bug/完成任务', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'seriousBugs' => array('zh-cn' => '重要Bug数', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1398,6 +2120,79 @@ EOT 'selectList' => array('project', 'execution'), 'default' => array('', '') ), + 'drills' => array + ( + array + ( + 'field' => 'stories', + 'object' => 'story', + 'whereSql' => "right join zt_projectstory as t2 on t2.story=t1.id left join zt_project as t3 on t2.project=t3.id left join zt_project as t4 on t4.id=t3.project where t3.deleted='0' and t3.type in ('sprint','stage') and t1.deleted='0' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) and (case when \$status='' then 1 else t3.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_project', 'drillAlias' => 't3', 'drillField' => 'id', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'doneStory', + 'object' => 'story', + 'whereSql' => "right join zt_projectstory as t2 on t2.story=t1.id left join zt_project as t3 on t2.project=t3.id left join zt_project as t4 on t4.id=t3.project where t3.deleted='0' and t3.type in ('sprint','stage') and t1.deleted='0' and t1.status='closed' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) and (case when \$status='' then 1 else t3.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_project', 'drillAlias' => 't3', 'drillField' => 'id', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'number', + 'object' => 'task', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t2.type in ('sprint','stage') and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'doneTask', + 'object' => 'task', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t1.status in ('closed','done') and t2.type in ('sprint','stage') and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'bugs', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'resolutions', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t1.resolution !=' ' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'seriousBugs', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t1.severity<='2' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1409,40 +2204,60 @@ $config->bi->builtin->pivots[] = array 'code' => 'productBugType', 'desc' => array('zh-cn' => '按照产品统计Bug的类型分布情况。', 'zh-tw' => '按照產品統計Bug的類型分布情況。', 'en' => 'Type distribution of Bugs.', 'de' => 'Type distribution of Bugs.', 'fr' => 'Type distribution of Bugs.'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '59,61', 'sql' => << array ( - 'group1' => 'name', - 'group2' => '', + 'group1' => 'id', 'columnTotal' => 'sum', 'columns' => array ( - array('field' => 'type', 'slice' => 'type', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'type', 'slice' => 'type', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0) + ), + 'summary' => 'use' ), + 'filters' => array(), 'fields' => array ( - 'id' => array('object' => 'product', 'field' => 'id', 'type' => 'string'), + 'id' => array('object' => 'product', 'field' => 'name', 'type' => 'number'), 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), - 'bugID' => array('object' => 'project', 'field' => 'bugID', 'type' => 'string'), + 'bugID' => array('object' => 'project', 'field' => '', 'type' => 'number'), 'type' => array('object' => 'bug', 'field' => 'type', 'type' => 'option') ), 'langs' => array ( - 'count' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories'), - 'done' => array('zh-cn' => '完成数', 'zh-tw' => '完成数', 'en' => 'Done'), - 'id' => array('zh-cn' => '编号', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'name' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'id' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'name' => array('zh-cn' => '产品', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'type' => array('zh-cn' => 'Bug类型', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + 'type' => array('zh-cn' => '不同类型Bug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + ), + 'vars' => array(), + 'drills' => array + ( + array + ( + 'field' => 'type', + 'object' => 'bug', + 'whereSql' => "WHERE t1.deleted='0'", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'id'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'type', 'queryField' => 'type') + ) + ) ), 'stage' => 'published', 'builtin' => '0' @@ -1455,51 +2270,116 @@ $config->bi->builtin->pivots[] = array 'code' => 'productQuality', 'desc' => array('zh-cn' => '列出产品的需求数,完成的需求总数,Bug数,解决的Bug总数,Bug/需求,重要Bug数量(严重程度小于3)。', 'zh-tw' => '列出產品的需求數,完成的需求總數,Bug數,解決的Bug總數,Bug/需求,重要Bug數量(嚴重程度小於3)。', 'en' => 'Serious Bug (severity is less than 3).', 'de' => 'Serious Bug (severity is less than 3).', 'fr' => 'Serious Bug (severity is less than 3).'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '59', 'sql' => << array ( - 'group1' => 'name', - 'group2' => '', + 'group1' => 'id', 'columnTotal' => 'sum', 'columns' => array ( - array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'doneStory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'bugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'resolutions', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'bugthanstory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'seriousBugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '1') - ) + array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0), + array('field' => 'doneStory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0), + array('field' => 'bugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0), + array('field' => 'resolutions', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0), + array('field' => 'bugthanstory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0), + array('field' => 'seriousBugs', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '1', 'showOrigin' => 0) + ), + 'summary' => 'use' ), + 'filters' => array(), 'fields' => array ( - 'id' => array('object' => 'product', 'field' => 'id', 'type' => 'string'), + 'id' => array('object' => 'product', 'field' => 'name', 'type' => 'number'), 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), - 'stories' => array('object' => 'project', 'field' => 'stories', 'type' => 'string'), - 'doneStory' => array('object' => 'project', 'field' => 'doneStory', 'type' => 'string'), - 'bugs' => array('object' => 'product', 'field' => 'bugs', 'type' => 'string'), - 'resolutions' => array('object' => 'project', 'field' => 'resolutions', 'type' => 'string'), - 'bugthanstory' => array('object' => 'project', 'field' => 'bugthanstory', 'type' => 'string'), - 'seriousBugs' => array('object' => 'project', 'field' => 'seriousBugs', 'type' => 'string') + 'stories' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'doneStory' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'bugs' => array('object' => 'product', 'field' => '', 'type' => 'string'), + 'resolutions' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'bugthanstory' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'seriousBugs' => array('object' => 'project', 'field' => '', 'type' => 'number') ), 'langs' => array ( - 'stories' => array('zh-cn' => '需求总数', 'zh-tw' => '需求总数', 'en' => 'Stories'), - 'doneStory' => array('zh-cn' => '完成需求数', 'zh-tw' => '完成需求数', 'en' => 'Finished Stories'), - 'bugs' => array('zh-cn' => 'Bug数', 'zh-tw' => 'Bug数', 'en' => 'Bugs'), - 'resolutions' => array('zh-cn' => '解决Bug数', 'zh-tw' => '解决Bug数', 'en' => 'Solved Bugs'), - 'bugthanstory' => array('zh-cn' => 'Bug/完成需求', 'zh-tw' => 'Bug/完成需求', 'en' => 'Bug/Finished Story'), - 'seriousBugs' => array('zh-cn' => '重要Bug数', 'zh-tw' => '重要Bug数', 'en' => 'Serious Bugs'), - 'seriousBugsPercent' => array('zh-cn' => '严重bug比率', 'zh-tw' => '严重bug比率', 'en' => 'Serious Bugs %') + 'id' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'name' => array('zh-cn' => 'name', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'stories' => array('zh-cn' => '需求总数', 'zh-tw' => '需求总数', 'en' => 'Stories', 'de' => '', 'fr' => ''), + 'doneStory' => array('zh-cn' => '关闭需求数', 'zh-tw' => '关闭需求数', 'en' => 'Closed Stories', 'de' => '', 'fr' => ''), + 'bugs' => array('zh-cn' => 'Bug数', 'zh-tw' => 'Bug数', 'en' => 'Bugs', 'de' => '', 'fr' => ''), + 'resolutions' => array('zh-cn' => '解决Bug数', 'zh-tw' => '解决Bug数', 'en' => 'Solved Bugs', 'de' => '', 'fr' => ''), + 'bugthanstory' => array('zh-cn' => 'Bug/完成需求', 'zh-tw' => 'Bug/完成需求', 'en' => 'Bug/Finished Story', 'de' => '', 'fr' => ''), + 'seriousBugs' => array('zh-cn' => '重要Bug数', 'zh-tw' => '重要Bug数', 'en' => 'Serious Bugs', 'de' => '', 'fr' => '') + ), + 'vars' => array(), + 'drills' => array + ( + array + ( + 'field' => 'stories', + 'object' => 'story', + 'whereSql' => "where t1.deleted='0' ", + 'condition' => array + ( + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'id') + ) + ), + array + ( + 'field' => 'doneStory', + 'object' => 'story', + 'whereSql' => "where t1.deleted='0' and t1.status='closed'", + 'condition' => array + ( + array('drillObject' => 'zt_story', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'id') + ) + ), + array + ( + 'field' => 'bugs', + 'object' => 'bug', + 'whereSql' => "where t1.deleted='0'", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'id') + ) + ), + array + ( + 'field' => 'resolutions', + 'object' => 'bug', + 'whereSql' => "where t1.deleted='0' and t1.resolution !=' '", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'id') + ) + ), + array + ( + 'field' => 'seriousBugs', + 'object' => 'bug', + 'whereSql' => "where t1.deleted and t1.severity<='2'", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'id') + ) + ) ), 'stage' => 'published', 'builtin' => '0' @@ -1512,37 +2392,35 @@ $config->bi->builtin->pivots[] = array 'code' => 'loginTimes', 'desc' => array('zh-cn' => '实现员工登录次数统计报表,按照天统计每天每个人的登录次数,以及总数。', 'zh-tw' => '實現員工登錄次數統計報表,按照天統計每天每個人的登錄次數,以及總數。', 'en' => 'The summary of user login times.', 'de' => 'The summary of user login times.', 'fr' => 'The summary of user login times.'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '62', 'sql' => <<=\$startDate) and if(\$endDate='',1,`date`<=\$endDate) order by `date` asc, actor asc -EOT -, +EOT, 'settings' => array ( + 'summary' => 'use', 'group1' => 'actor', - 'columnTotal' => 'sum', 'columns' => array ( - array('field' => 'day', 'slice' => 'day', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') + array('field' => 'day', 'slice' => 'day', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) ), - 'lastStep' => '4' + 'columnTotal' => 'sum' ), 'filters' => array ( - array('from' => 'query', 'field' => 'startDate', 'name' => '起始时间', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHBEGIN'), - array('from' => 'query', 'field' => 'endDate', 'name' => '结束时间', 'type' => 'date', 'typeOption' => '', 'default' => '$MONTHEND') + array('from' => 'query', 'field' => 'startDate', 'name' => '起始时间', 'type' => 'date', 'typeOption' => '', 'default' => '2024-07-01'), + array('from' => 'query', 'field' => 'endDate', 'name' => '结束时间', 'type' => 'date', 'typeOption' => '', 'default' => '2024-07-30') ), 'fields' => array ( - 'actor' => array('object' => 'action', 'field' => 'actor', 'type' => 'user', 'name' => '操作者'), - 'day' => array('object' => 'action', 'field' => 'day', 'type' => 'string', 'name' => 'day') + 'actor' => array('object' => 'action', 'field' => 'actor', 'type' => 'user'), + 'day' => array('object' => 'action', 'field' => 'day', 'type' => 'string') ), 'langs' => array ( - 'count' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories'), - 'done' => array('zh-cn' => '完成数', 'zh-tw' => '完成数', 'en' => 'Done'), - 'actor' => array('zh-cn' => '操作者', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'day' => array('zh-cn' => 'day', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + 'actor' => array('name' => '操作者', 'zh-cn' => '操作者', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'day' => array('name' => 'day', 'zh-cn' => 'day', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1552,6 +2430,20 @@ EOT 'selectList' => array('user', 'user'), 'default' => array('$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'day', + 'object' => 'action', + 'whereSql' => "left join (select date(date) `day`,id from zt_action) t2 on t2.id=t1.id WHERE t1.`action`='login' AND if(\$startDate='',1,`date`>=\$startDate) AND if(\$endDate='',1,`date`<=\$endDate)", + 'condition' => array + ( + array('drillAlias' => 't2', 'queryField' => 'day', 'drillObject' => '', 'drillField' => 'day'), + array('drillObject' => 'zt_action', 'drillAlias' => 't1', 'drillField' => 'actor', 'queryField' => 'actor') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1563,21 +2455,35 @@ $config->bi->builtin->pivots[] = array 'code' => 'effortSummary', 'desc' => array('zh-cn' => '查看某个时间段内的日志情况,可以按照部门选择。', 'zh-tw' => '查看某個時間段內的日誌情況,可以按照部門選擇。', 'en' => 'Effort summary of users.', 'de' => 'Effort summary of users', 'fr' => 'Effort summary of users'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '62', 'sql' => <<= \$startDate) and if(\$endDate='', 1, t1.`date` <= \$endDate) and (t3.path like concat((select path from zt_dept where id=\$dept), '%') or \$dept=0) order by t1.`date` asc -EOT -, +select + t1.account, + t1.consumed, + t1.`date`, + t2.dept as dept +from zt_effort as t1 +left join zt_user as t2 on t1.account = t2.account +left join zt_dept as t3 on t2.dept = t3.id +where t1.`deleted` = '0' +and (case when \$startDate='' then 1 else cast(t1.`date` as date) >= cast(\$startDate as date) end) +and (case when \$endDate='' then 1 else cast(t1.`date` as date) <= cast(\$endDate as date) end) +and (case when \$dept='' then 1 +else t3.path like concat((select path from zt_dept where id=coalesce(cast(nullif(\$dept, '') as integer), 0)), '%') +end) +order by t1.`date` asc +EOT, 'settings' => array ( 'group1' => 'account', - 'group2' => '', 'columnTotal' => 'sum', 'columns' => array ( - array('field' => 'consumed', 'slice' => 'date', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') + array('field' => 'consumed', 'slice' => 'date', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0) ), - 'lastStep' => '4' + 'lastStep' => '4', + 'summary' => 'use' ), 'filters' => array ( @@ -1587,17 +2493,17 @@ EOT ), 'fields' => array ( - 'account' => array('object' => 'effort', 'field' => 'account', 'type' => 'user', 'name' => 'account'), - 'consumed' => array('object' => 'effort', 'field' => 'consumed', 'type' => 'number', 'name' => 'consumed'), - 'date' => array('object' => 'effort', 'field' => 'date', 'type' => 'object', 'name' => 'date'), - 'dept' => array('object' => 'effort', 'field' => 'dept', 'type' => 'object', 'name' => 'dept') + 'account' => array('object' => 'effort', 'field' => 'account', 'type' => 'user'), + 'consumed' => array('object' => 'effort', 'field' => 'consumed', 'type' => 'number'), + 'date' => array('object' => 'effort', 'field' => 'date', 'type' => 'date'), + 'dept' => array('object' => 'effort', 'field' => 'dept', 'type' => 'number') ), 'langs' => array ( - 'date' => array('zh-cn' => '日期', 'zh-tw' => '日期', 'en' => 'Date', 'de' => '', 'fr' => ''), - 'consumed' => array('zh-cn' => '消耗工时', 'zh-tw' => '消耗工时', 'en' => 'Cost', 'de' => '', 'fr' => ''), - 'account' => array('zh-cn' => '名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'dept' => array('zh-cn' => 'dept', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + 'account' => array('name' => 'account', 'zh-cn' => '名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'consumed' => array('name' => 'consumed', 'zh-cn' => '消耗工时', 'zh-tw' => '消耗工时', 'en' => 'Cost', 'de' => '', 'fr' => ''), + 'date' => array('name' => 'date', 'zh-cn' => '日期', 'zh-tw' => '日期', 'en' => 'Date', 'de' => '', 'fr' => ''), + 'dept' => array('name' => 'dept', 'zh-cn' => 'dept', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1607,6 +2513,20 @@ EOT 'selectList' => array('dept', 'user', 'user'), 'default' => array('', '$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'consumed', + 'object' => 'effort', + 'whereSql' => "left join zt_user as t2 on t1.account = t2.account left join zt_dept as t3 on t2.dept = t3.id where t1.`deleted` = '0' and (case when \$startDate='' then 1 else cast(t1.`date` as date) >= cast(\$startDate as date) end) and (case when \$endDate='' then 1 else cast(t1.`date` as date) <= cast(\$endDate as date) end) and (case when \$dept='' then 1 else t3.path like concat((select path from zt_dept where id=coalesce(cast(nullif(\$dept, '') as integer), 0)), '%') end) order by t1.`date` asc", + 'condition' => array + ( + array('drillObject' => 'zt_effort', 'drillAlias' => 't1', 'drillField' => 'account', 'queryField' => 'account'), + array('drillObject' => 'zt_effort', 'drillAlias' => 't1', 'drillField' => 'date', 'queryField' => 'date') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1618,119 +2538,28 @@ $config->bi->builtin->pivots[] = array 'code' => 'companyDynamics', 'desc' => array('zh-cn' => '可以指定一个时期,列出相应的数据:1. 每天的登录次数。2. 每天的日志工时量。3. 每天新增的需求数。4. 每天关闭的需求数。5. 每天新增的任务数。6. 每天完成的任务数。7. 每天新增的Bug数。8. 每天解决的Bug数。9. 每天的动态数。', 'zh-tw' => '可以指定一個時期,列出相應的數據:1. 每天的登錄次數。2. 每天的日誌工時量。3. 每天新增的需求數。4. 每天關閉的需求數。5. 每天新增的任務數。6. 每天完成的任務數。7. 每天新增的Bug數。8. 每天解決的Bug數。9. 每天的動態數。', 'en' => 'The summary of company dynamics', 'de' => 'The summary of company dynamics', 'fr' => 'The summary of company dynamics'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '62', - 'sql' => <<<'EOT' -select - t1.day, - sum(t1.userlogin) as userlogin, - sum(t1.consumed) as consumed, - sum(t1.storyopen) as storyopen, - sum(t1.storyclose) as storyclose, - sum(t1.taskopen) as taskopen, - sum(t1.taskfinish) as taskfinish, - sum(t1.bugopen) as bugopen, - sum(t1.bugresolve) as bugresolve, - sum(t1.actions) as actions -from ( - select - cast(t1.date as date) as day, - count(case when t1.objectType = 'user' and t1.action = 'login' then 1 end) as userlogin, - 0 as consumed, - 0 as storyopen, - 0 as storyclose, - 0 as taskopen, - 0 as taskfinish, - 0 as bugopen, - 0 as bugresolve, - count(*) as actions - from zt_action t1 - where if($startDate='',1,t1.date>=$startDate) and if($endDate='',1,t1.date<=$endDate) - group by cast(t1.date as date) - union all - select - cast(t1.date as date) as day, - 0 as userlogin, - 0 as consumed, - sum(case when t1.action = 'opened' then 1 else 0 end) as storyopen, - count(distinct case when t1.action = 'closed' and t2.status = 'closed' then t2.id else 0 end) - 1 as storyclose, - 0 as taskopen, - 0 as taskfinish, - 0 as bugopen, - 0 as bugresolve, - 0 as actions - from zt_action t1 - left join zt_story t2 on t1.objectID = t2.id - where t2.deleted = '0' and t1.objectType = 'story' and t1.action in ('opened', 'closed') and if($startDate='',1,t1.date>=$startDate) and if($endDate='',1,t1.date<=$endDate) - group by cast(t1.date as date) - union all - select - cast(t1.date as date) as day, - 0 as userlogin, - 0 as consumed, - 0 as storyopen, - 0 as storyclose, - sum(case when t1.action = 'opened' then 1 else 0 end) as taskopen, - count(distinct case when t1.action = 'finished' and t2.status in ('done', 'closed') then t2.id else 0 end) - 1 as taskfinish, - 0 as bugopen, - 0 as bugresolve, - 0 as actions - from zt_action t1 - left join zt_task t2 on t1.objectID = t2.id - where t2.deleted = '0' and t1.objectType = 'task' and t1.action in ('opened', 'finished') and if($startDate='',1,t1.date>=$startDate) and if($endDate='',1,t1.date<=$endDate) - group by cast(t1.date as date) - union all - select - cast(t1.date as date) as day, - 0 as userlogin, - 0 as consumed, - 0 as storyopen, - 0 as storyclose, - 0 as taskopen, - 0 as taskfinish, - sum(case when t1.action = 'opened' then 1 else 0 end) as bugopen, - count(distinct case when t1.action = 'resolved' and t2.status in ('resolved', 'closed') then t2.id else 0 end) - 1 as bugresolve, - 0 as actions - from zt_action t1 - left join zt_bug t2 on t1.objectID = t2.id - where t2.deleted = '0' and t1.objectType = 'bug' and t1.action in ('opened', 'resolved') and if($startDate='',1,t1.date>=$startDate) and if($endDate='',1,t1.date<=$endDate) - group by cast(t1.date as date) - union all - select - t2.date as day, - 0 as userlogin, - round(sum(t2.`consumed`), 1) as consumed, - 0 as storyopen, - 0 as storyclose, - 0 as taskopen, - 0 as taskfinish, - 0 as bugopen, - 0 as bugresolve, - 0 as actions - from zt_effort t2 - where if($startDate='',1,t2.date>=$startDate) and if($endDate='',1,t2.date<=$endDate) - group by t2.date -) as t1 -group by t1.day -order by t1.day desc limit 99999999 -EOT -, + 'sql' => <<=\$startDate) and if(\$endDate='',1,t1.day<=\$endDate) +EOT, 'settings' => array ( + 'summary' => 'use', 'group1' => 'day', - 'group2' => '', - 'columnTotal' => 'sum', 'columns' => array ( - array('field' => 'userlogin', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'consumed', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'storyopen', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'storyclose', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'taskopen', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'taskfinish', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'bugopen', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'bugresolve', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'actions', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'userlogin', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'consumed', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'storyopen', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'storyclose', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'taskopen', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'taskfinish', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'bugopen', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'bugresolve', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'actions', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum' ), 'filters' => array ( @@ -1741,7 +2570,7 @@ EOT ( 'day' => array('object' => '', 'field' => 'day', 'type' => 'string'), 'userlogin' => array('object' => '', 'field' => 'userlogin', 'type' => 'string'), - 'consumed' => array('object' => '', 'field' => 'consumed', 'type' => 'string'), + 'consumed' => array('object' => '', 'field' => 'consumed', 'type' => 'number'), 'storyopen' => array('object' => '', 'field' => 'storyopen', 'type' => 'string'), 'storyclose' => array('object' => '', 'field' => 'storyclose', 'type' => 'string'), 'taskopen' => array('object' => '', 'field' => 'taskopen', 'type' => 'string'), @@ -1771,6 +2600,99 @@ EOT 'selectList' => array('user', 'user'), 'default' => array('$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'userlogin', + 'object' => 'action', + 'whereSql' => "left join ztv_dayuserlogin t2 on date(t1.date)=t2.day where ((t1.objectType = 'user') and (t1.action = 'login')) and if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillObject' => 'ztv_dayuserlogin', 'drillAlias' => 't2', 'drillField' => 'day', 'queryField' => 'day') + ) + ), + array + ( + 'field' => 'consumed', + 'object' => 'effort', + 'whereSql' => "where if(\$startDate='',1,t1.date>=\$startDate) and if(\$endDate='',1,t1.date<=\$endDate) ", + 'condition' => array + ( + array('drillObject' => 'zt_effort', 'drillAlias' => 't1', 'drillField' => 'date', 'queryField' => 'day') + ) + ), + array + ( + 'field' => 'storyopen', + 'object' => 'story', + 'whereSql' => "right join (select objectID,date(`date`) day from zt_action where objectType = 'story' and action = 'opened') t2 on t2.objectID=t1.id where if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillAlias' => 't2', 'queryField' => 'day', 'drillObject' => '', 'drillField' => 'day') + ) + ), + array + ( + 'field' => 'storyclose', + 'object' => 'story', + 'whereSql' => "right join (select objectID,date(`date`) day from zt_action where objectType = 'story' and action = 'closed') t2 on t2.objectID=t1.id where if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillAlias' => 't2', 'queryField' => 'day', 'drillObject' => '', 'drillField' => 'day') + ) + ), + array + ( + 'field' => 'taskopen', + 'object' => 'task', + 'whereSql' => "right join (select objectID,date(`date`) day from zt_action where objectType = 'task' and action = 'opened') t2 on t2.objectID=t1.id where if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillAlias' => 't2', 'queryField' => 'day', 'drillObject' => '', 'drillField' => 'day') + ) + ), + array + ( + 'field' => 'taskfinish', + 'object' => 'task', + 'whereSql' => "right join (select objectID,date(`date`) day from zt_action where objectType = 'task' and action = 'finished') t2 on t2.objectID=t1.id where if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillAlias' => 't2', 'queryField' => 'day', 'drillObject' => '', 'drillField' => 'day') + ) + ), + array + ( + 'field' => 'bugopen', + 'object' => 'bug', + 'whereSql' => "right join (select objectID,date(`date`) day from zt_action where objectType = 'bug' and action = 'opened') t2 on t2.objectID=t1.id where if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillAlias' => 't2', 'queryField' => 'day', 'drillObject' => '', 'drillField' => 'day') + ) + ), + array + ( + 'field' => 'bugresolve', + 'object' => 'bug', + 'whereSql' => "right join (select objectID,date(`date`) day from zt_action where objectType = 'bug' and action = 'resolved') t2 on t2.objectID=t1.id where if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillObject' => '', 'drillAlias' => 't2', 'drillField' => 'day', 'queryField' => 'day') + ) + ), + array + ( + 'field' => 'actions', + 'object' => 'action', + 'whereSql' => "left join (select id,date(`date`) day from zt_action) t2 on t1.id=t2.id where if(\$startDate='',1,t2.day>=\$startDate) and if(\$endDate='',1,t2.day<=\$endDate)", + 'condition' => array + ( + array('drillObject' => '', 'drillAlias' => 't2', 'drillField' => 'day', 'queryField' => 'day') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1782,20 +2704,29 @@ $config->bi->builtin->pivots[] = array 'code' => 'slovedBugs', 'desc' => array('zh-cn' => '列出解决的Bug总数,解决方案的分布,占的比例(该用户解决的Bug的数量占所有的解决的Bug的数量)。', 'zh-tw' => '列出解決的Bug總數,解決方案的分布,占的比例(該用戶解決的Bug的數量占所有的解決的Bug的數量)。', 'en' => 'percentage:self resolved / all resolved', 'de' => 'percentage:self resolved / all resolved', 'fr' => 'percentage:self resolved / all resolved'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '61', 'sql' => <<=\$startDate) and if(\$endDate='',1,t1.resolvedDate<=\$endDate) having customproduct=\$product -EOT -, +select + t1.* +from zt_bug as t1 +left join zt_product as t2 on t1.product = t2.id +where t1.deleted='0' +and t2.deleted='0' +and t1.resolution!='' +and (case when \$startDate='' then 1 else cast(t1.resolvedDate as date)>=cast(\$startDate as date) end) +and (case when \$endDate='' then 1 else cast(t1.resolvedDate as date)<=cast(\$endDate as date) end) +and (case when \$product = '' then 1 else t1.product=\$product end) +EOT, 'settings' => array ( - 'group1' => 'resolvedBy', - 'group2' => '', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'resolution', 'slice' => 'resolution', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'total', 'monopolize' => '1') - ) + array('field' => 'resolution', 'slice' => 'resolution', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'row', 'monopolize' => 1, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'resolvedBy' ), 'filters' => array ( @@ -1805,75 +2736,135 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'bug', 'field' => 'id', 'type' => 'string'), + 'id' => array('object' => 'bug', 'field' => 'id', 'type' => 'number'), 'project' => array('object' => 'bug', 'field' => 'project', 'type' => 'string'), 'product' => array('object' => 'bug', 'field' => 'product', 'type' => 'string'), - 'injection' => array('object' => 'bug', 'field' => 'injection', 'type' => 'string'), - 'identify' => array('object' => 'bug', 'field' => 'identify', 'type' => 'string'), - 'branch' => array('object' => 'bug', 'field' => 'branch', 'type' => 'string'), - 'module' => array('object' => 'bug', 'field' => 'module', 'type' => 'string'), - 'execution' => array('object' => 'bug', 'field' => 'execution', 'type' => 'string'), - 'plan' => array('object' => 'bug', 'field' => 'plan', 'type' => 'string'), + 'injection' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'identify' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'branch' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'module' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'execution' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'plan' => array('object' => 'bug', 'field' => '', 'type' => 'number'), 'story' => array('object' => 'bug', 'field' => 'story', 'type' => 'string'), - 'storyVersion' => array('object' => 'bug', 'field' => 'storyVersion', 'type' => 'string'), - 'task' => array('object' => 'bug', 'field' => 'task', 'type' => 'string'), - 'toTask' => array('object' => 'bug', 'field' => 'toTask', 'type' => 'string'), - 'toStory' => array('object' => 'bug', 'field' => 'toStory', 'type' => 'string'), + 'storyVersion' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'task' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'toTask' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'toStory' => array('object' => 'bug', 'field' => '', 'type' => 'number'), 'title' => array('object' => 'bug', 'field' => 'title', 'type' => 'string'), - 'keywords' => array('object' => 'bug', 'field' => 'keywords', 'type' => 'string'), - 'severity' => array('object' => 'bug', 'field' => 'severity', 'type' => 'string'), - 'pri' => array('object' => 'bug', 'field' => 'pri', 'type' => 'string'), - 'type' => array('object' => 'bug', 'field' => 'type', 'type' => 'string'), - 'os' => array('object' => 'bug', 'field' => 'os', 'type' => 'string'), - 'browser' => array('object' => 'bug', 'field' => 'browser', 'type' => 'string'), - 'hardware' => array('object' => 'bug', 'field' => 'hardware', 'type' => 'string'), - 'found' => array('object' => 'bug', 'field' => 'found', 'type' => 'string'), - 'steps' => array('object' => 'bug', 'field' => 'steps', 'type' => 'string'), - 'status' => array('object' => 'bug', 'field' => 'status', 'type' => 'string'), - 'subStatus' => array('object' => 'bug', 'field' => 'subStatus', 'type' => 'string'), - 'color' => array('object' => 'bug', 'field' => 'color', 'type' => 'string'), - 'confirmed' => array('object' => 'bug', 'field' => 'confirmed', 'type' => 'string'), - 'activatedCount' => array('object' => 'bug', 'field' => 'activatedCount', 'type' => 'string'), - 'activatedDate' => array('object' => 'bug', 'field' => 'activatedDate', 'type' => 'string'), - 'feedbackBy' => array('object' => 'bug', 'field' => 'feedbackBy', 'type' => 'string'), - 'notifyEmail' => array('object' => 'bug', 'field' => 'notifyEmail', 'type' => 'string'), - 'mailto' => array('object' => 'bug', 'field' => 'mailto', 'type' => 'string'), - 'openedBy' => array('object' => 'bug', 'field' => 'openedBy', 'type' => 'string'), - 'openedDate' => array('object' => 'bug', 'field' => 'openedDate', 'type' => 'string'), - 'openedBuild' => array('object' => 'bug', 'field' => 'openedBuild', 'type' => 'string'), - 'assignedTo' => array('object' => 'bug', 'field' => 'assignedTo', 'type' => 'string'), - 'assignedDate' => array('object' => 'bug', 'field' => 'assignedDate', 'type' => 'string'), - 'deadline' => array('object' => 'bug', 'field' => 'deadline', 'type' => 'string'), - 'resolvedBy' => array('object' => 'bug', 'field' => 'resolvedBy', 'type' => 'string'), - 'resolution' => array('object' => 'bug', 'field' => 'resolution', 'type' => 'string'), - 'resolvedBuild' => array('object' => 'bug', 'field' => 'resolvedBuild', 'type' => 'string'), - 'resolvedDate' => array('object' => 'bug', 'field' => 'resolvedDate', 'type' => 'string'), - 'closedBy' => array('object' => 'bug', 'field' => 'closedBy', 'type' => 'string'), - 'closedDate' => array('object' => 'bug', 'field' => 'closedDate', 'type' => 'string'), - 'duplicateBug' => array('object' => 'bug', 'field' => 'duplicateBug', 'type' => 'string'), - 'linkBug' => array('object' => 'bug', 'field' => 'linkBug', 'type' => 'string'), - 'case' => array('object' => 'bug', 'field' => 'case', 'type' => 'string'), - 'caseVersion' => array('object' => 'bug', 'field' => 'caseVersion', 'type' => 'string'), - 'feedback' => array('object' => 'bug', 'field' => 'feedback', 'type' => 'string'), - 'result' => array('object' => 'bug', 'field' => 'result', 'type' => 'string'), - 'repo' => array('object' => 'bug', 'field' => 'repo', 'type' => 'string'), - 'mr' => array('object' => 'bug', 'field' => 'mr', 'type' => 'string'), - 'entry' => array('object' => 'bug', 'field' => 'entry', 'type' => 'string'), - 'lines' => array('object' => 'bug', 'field' => 'lines', 'type' => 'string'), - 'v1' => array('object' => 'bug', 'field' => 'v1', 'type' => 'string'), - 'v2' => array('object' => 'bug', 'field' => 'v2', 'type' => 'string'), - 'repoType' => array('object' => 'bug', 'field' => 'repoType', 'type' => 'string'), - 'issueKey' => array('object' => 'bug', 'field' => 'issueKey', 'type' => 'string'), - 'testtask' => array('object' => 'bug', 'field' => 'testtask', 'type' => 'string'), - 'lastEditedBy' => array('object' => 'bug', 'field' => 'lastEditedBy', 'type' => 'string'), - 'lastEditedDate' => array('object' => 'bug', 'field' => 'lastEditedDate', 'type' => 'string'), - 'deleted' => array('object' => 'bug', 'field' => 'deleted', 'type' => 'string'), - 'customproduct' => array('object' => 'bug', 'field' => 'customproduct', 'type' => 'string') + 'keywords' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'severity' => array('object' => 'bug', 'field' => 'severity', 'type' => 'option'), + 'pri' => array('object' => 'bug', 'field' => 'pri', 'type' => 'option'), + 'type' => array('object' => 'bug', 'field' => 'type', 'type' => 'option'), + 'os' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'browser' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'hardware' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'found' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'steps' => array('object' => 'bug', 'field' => 'steps', 'type' => 'text'), + 'status' => array('object' => 'bug', 'field' => 'status', 'type' => 'option'), + 'subStatus' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'color' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'confirmed' => array('object' => 'bug', 'field' => 'confirmed', 'type' => 'option'), + 'activatedCount' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'activatedDate' => array('object' => 'bug', 'field' => '', 'type' => 'date'), + 'feedbackBy' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'notifyEmail' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'mailto' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'openedBy' => array('object' => 'bug', 'field' => 'openedBy', 'type' => 'user'), + 'openedDate' => array('object' => 'bug', 'field' => 'openedDate', 'type' => 'date'), + 'openedBuild' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'assignedTo' => array('object' => 'bug', 'field' => 'assignedTo', 'type' => 'user'), + 'assignedDate' => array('object' => 'bug', 'field' => 'assignedDate', 'type' => 'date'), + 'deadline' => array('object' => 'bug', 'field' => '', 'type' => 'date'), + 'resolvedBy' => array('object' => 'bug', 'field' => 'resolvedBy', 'type' => 'user'), + 'resolution' => array('object' => 'bug', 'field' => 'resolution', 'type' => 'option'), + 'resolvedBuild' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'resolvedDate' => array('object' => 'bug', 'field' => 'resolvedDate', 'type' => 'date'), + 'closedBy' => array('object' => 'bug', 'field' => 'closedBy', 'type' => 'user'), + 'closedDate' => array('object' => 'bug', 'field' => 'closedDate', 'type' => 'date'), + 'duplicateBug' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'relatedBug' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'case' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'caseVersion' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'feedback' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'result' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'repo' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'mr' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'entry' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'lines' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'v1' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'v2' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'repoType' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'issueKey' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'testtask' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'lastEditedBy' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'lastEditedDate' => array('object' => 'bug', 'field' => '', 'type' => 'date'), + 'deleted' => array('object' => 'bug', 'field' => '', 'type' => 'string') ), 'langs' => array ( - 'count' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories'), - 'done' => array('zh-cn' => '完成数', 'zh-tw' => '完成数', 'en' => 'Done') + 'id' => array('zh-cn' => ' bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => 'project', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'product' => array('zh-cn' => 'product', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'injection' => array('zh-cn' => 'injection', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'identify' => array('zh-cn' => 'identify', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'branch' => array('zh-cn' => 'branch', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'module' => array('zh-cn' => 'module', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => 'execution', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'plan' => array('zh-cn' => 'plan', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'story' => array('zh-cn' => 'story', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'storyVersion' => array('zh-cn' => 'storyVersion', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'task' => array('zh-cn' => 'task', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'toTask' => array('zh-cn' => 'toTask', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'toStory' => array('zh-cn' => 'toStory', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'title' => array('zh-cn' => 'title', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'keywords' => array('zh-cn' => 'keywords', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'severity' => array('zh-cn' => 'severity', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'pri' => array('zh-cn' => 'pri', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'type' => array('zh-cn' => 'type', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'os' => array('zh-cn' => 'os', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'browser' => array('zh-cn' => 'browser', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'hardware' => array('zh-cn' => 'hardware', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'found' => array('zh-cn' => 'found', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'steps' => array('zh-cn' => 'steps', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'status' => array('zh-cn' => 'status', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'subStatus' => array('zh-cn' => 'subStatus', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'color' => array('zh-cn' => 'color', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'confirmed' => array('zh-cn' => 'confirmed', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'activatedCount' => array('zh-cn' => 'activatedCount', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'activatedDate' => array('zh-cn' => 'activatedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'feedbackBy' => array('zh-cn' => 'feedbackBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'notifyEmail' => array('zh-cn' => 'notifyEmail', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'mailto' => array('zh-cn' => 'mailto', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedBy' => array('zh-cn' => 'openedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedDate' => array('zh-cn' => 'openedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'openedBuild' => array('zh-cn' => 'openedBuild', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedTo' => array('zh-cn' => 'assignedTo', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'assignedDate' => array('zh-cn' => 'assignedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'deadline' => array('zh-cn' => 'deadline', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolvedBy' => array('zh-cn' => '解决者', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolution' => array('zh-cn' => '不同解决方案的Bug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolvedBuild' => array('zh-cn' => 'resolvedBuild', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolvedDate' => array('zh-cn' => 'resolvedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedBy' => array('zh-cn' => 'closedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'closedDate' => array('zh-cn' => 'closedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'duplicateBug' => array('zh-cn' => 'duplicateBug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'relatedBug' => array('zh-cn' => '相关Bug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'case' => array('zh-cn' => 'case', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'caseVersion' => array('zh-cn' => 'caseVersion', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'feedback' => array('zh-cn' => 'feedback', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'result' => array('zh-cn' => 'result', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'repo' => array('zh-cn' => 'repo', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'mr' => array('zh-cn' => 'mr', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'entry' => array('zh-cn' => 'entry', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lines' => array('zh-cn' => 'lines', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'v1' => array('zh-cn' => 'v1', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'v2' => array('zh-cn' => 'v2', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'repoType' => array('zh-cn' => 'repoType', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'issueKey' => array('zh-cn' => 'issueKey', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'testtask' => array('zh-cn' => 'testtask', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lastEditedBy' => array('zh-cn' => 'lastEditedBy', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'lastEditedDate' => array('zh-cn' => 'lastEditedDate', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'deleted' => array('zh-cn' => 'deleted', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1883,6 +2874,20 @@ EOT 'selectList' => array('product', 'user', 'user'), 'default' => array('', '$MONTHBEGIN', '$MONTHEND') ), + 'drills' => array + ( + array + ( + 'field' => 'resolution', + 'object' => 'bug', + 'whereSql' => "left join zt_product as t2 on t1.product = t2.id WHERE t1.deleted='0' AND t1.resolution!='' and (case when \$startDate='' then 1 else cast(t1.resolvedDate as date)>=cast(\$startDate as date) end) and (case when \$endDate='' then 1 else cast(t1.resolvedDate as date)<=cast(\$endDate as date) end) and (case when \$product = '' then 1 else t1.product=\$product end)", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'resolvedBy', 'queryField' => 'resolvedBy'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'resolution', 'queryField' => 'resolution') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1892,31 +2897,49 @@ $config->bi->builtin->pivots[] = array 'id' => 1026, 'name' => array('zh-cn' => '项目进展表', 'zh-tw' => '項目進展表', 'en' => 'Project Progress Report', 'de' => 'Project Progress Report', 'fr' => 'Project Progress Report', 'vi' => 'Project Progress Report', 'ja' => 'Project Progress Report'), 'code' => 'projectProgress', - 'desc' => array('zh-cn' => '项目的需求数,任务数,已消耗工时,剩余工时,剩余需求数,剩余任务数,进度。', 'zh-tw' => '項目的需求數,任務數,已消耗工時,剩餘工時,剩餘需求數,剩餘任務數,進度。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'desc' => array('zh-cn' => '项目的:需求数,剩余需求数(过滤状态为已关闭的需求),任务数,剩余任务数(过滤状态为已完成和已关闭的任务),剩余工时(剩余任务的剩余工时),已消耗工时。', 'zh-tw' => '項目的需求數,任務數,已消耗工時,剩餘工時,剩餘需求數,剩餘任務數,進度。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'undoneStory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'tasks', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'undoneTask', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'left', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0'), - array('field' => 'consumed', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '1') - ) + array('field' => 'stories', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'undoneStory', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'tasks', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'undoneTask', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'left', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0), + array('field' => 'consumed', 'slice' => 'noSlice', 'stat' => 'sum', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( @@ -1926,29 +2949,35 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't4id' => array('object' => 'project', 'field' => 't4id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'status' => array('object' => 'project', 'field' => 'status', 'type' => 'string'), - 'tasks' => array('object' => 'project', 'field' => 'tasks', 'type' => 'string'), - 'consumed' => array('object' => 'project', 'field' => 'consumed', 'type' => 'string'), - 'left' => array('object' => 'project', 'field' => 'left', 'type' => 'string'), - 'stories' => array('object' => 'project', 'field' => 'stories', 'type' => 'string'), - 'undoneTask' => array('object' => 'project', 'field' => 'undoneTask', 'type' => 'string'), - 'undoneStory' => array('object' => 'project', 'field' => 'undoneStory', 'type' => 'string'), - 'totalReal' => array('object' => 'project', 'field' => 'totalReal', 'type' => 'string') + 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'executionname' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'status' => array('object' => 'project', 'field' => 'status', 'type' => 'option'), + 'tasks' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'consumed' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'left' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'stories' => array('object' => 'project', 'field' => '', 'type' => 'string'), + 'undoneTask' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'undoneStory' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'totalReal' => array('object' => 'project', 'field' => '', 'type' => 'number') ), 'langs' => array ( - 'stories' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories'), - 'tasks' => array('zh-cn' => '任务数', 'zh-tw' => '任务数', 'en' => 'Tasks'), - 'undoneStory' => array('zh-cn' => '剩余需求数', 'zh-tw' => '剩余需求数', 'en' => 'Undone Story'), - 'undoneTask' => array('zh-cn' => '剩余任务数', 'zh-tw' => '剩余任务数', 'en' => 'Undone Task'), - 'consumed' => array('zh-cn' => '已消耗工时', 'zh-tw' => '已消耗工时', 'en' => 'Cost(h)'), - 'left' => array('zh-cn' => '剩余工时', 'zh-tw' => '剩余工时', 'en' => 'Left(h)'), - 'consumedPercent' => array('zh-cn' => '进度', 'zh-tw' => '进度', 'en' => 'Process'), - 'execution' => array('zh-cn' => '执行名称') + 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'status' => array('zh-cn' => '状态', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'tasks' => array('zh-cn' => '任务数', 'zh-tw' => '任务数', 'en' => 'Tasks', 'de' => '', 'fr' => ''), + 'consumed' => array('zh-cn' => '已消耗工时', 'zh-tw' => '已消耗工时', 'en' => 'Cost(h)', 'de' => '', 'fr' => ''), + 'left' => array('zh-cn' => '剩余工时', 'zh-tw' => '剩余工时', 'en' => 'Left(h)', 'de' => '', 'fr' => ''), + 'stories' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories', 'de' => '', 'fr' => ''), + 'undoneTask' => array('zh-cn' => '剩余任务数', 'zh-tw' => '剩余任务数', 'en' => 'Undone Task', 'de' => '', 'fr' => ''), + 'undoneStory' => array('zh-cn' => '剩余需求数', 'zh-tw' => '剩余需求数', 'en' => 'Undone Story', 'de' => '', 'fr' => ''), + 'totalReal' => array('zh-cn' => 'totalReal', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -1958,6 +2987,69 @@ EOT 'selectList' => array('project', 'execution', 'project.status'), 'default' => array('', '', '') ), + 'drills' => array + ( + array + ( + 'field' => 'stories', + 'object' => 'story', + 'whereSql' => "right join zt_projectstory as t2 on t2.story=t1.id left join zt_project as t3 on t2.project=t3.id left join zt_project as t4 on t4.id=t3.project where t3.deleted='0' and t3.type in ('sprint','stage') and t1.deleted='0' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) and (case when \$status='' then 1 else t3.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_project', 'drillAlias' => 't3', 'drillField' => 'id', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'undoneStory', + 'object' => 'story', + 'whereSql' => "right join zt_projectstory as t2 on t2.story=t1.id left join zt_project as t3 on t2.project=t3.id left join zt_project as t4 on t4.id=t3.project where t3.deleted='0' and t3.type in ('sprint','stage') and t1.status !='closed' and t1.deleted='0' and (case when \$project='' then 1 else t4.id=\$project end) and (case when \$execution='' then 1 else t3.id=\$execution end) and (case when \$status='' then 1 else t3.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_project', 'drillAlias' => 't3', 'drillField' => 'id', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'tasks', + 'object' => 'task', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t2.type in ('sprint','stage') and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'undoneTask', + 'object' => 'task', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t2.type in ('sprint','stage') and t1.status not in ('closed','done') and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'left', + 'object' => 'task', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t2.type in ('sprint','stage') and t1.status not in ('closed','done') and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ), + array + ( + 'field' => 'consumed', + 'object' => 'task', + 'whereSql' => "left join zt_project as t2 on t1.execution = t2.id left join zt_project as t3 on t3.id=t2.project where t2.deleted='0' and t1.deleted='0' and t2.type in ('sprint','stage') and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) and (case when \$status='' then 1 else t2.status=\$status end)", + 'condition' => array + ( + array('drillObject' => 'zt_task', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -1965,27 +3057,38 @@ EOT $config->bi->builtin->pivots[] = array ( 'id' => 1027, - 'name' => array('zh-cn' => '项目Bug类型统计表', 'zh-tw' => '項目Bug類型統計表', 'en' => 'Project Bug Type', 'de' => 'Project Bug Type', 'fr' => 'Project Bug Type', 'vi' => 'Project Bug Type', 'ja' => 'Project Bug Type'), + 'name' => array('zh-cn' => '项目执行Bug类型统计表', 'zh-tw' => '項目Bug類型統計表', 'en' => 'Project Bug Type', 'de' => 'Project Bug Type', 'fr' => 'Project Bug Type'), 'code' => 'projectBugType', - 'desc' => array('zh-cn' => '按照项目统计Bug的类型分布情况。', 'zh-tw' => '按照項目統計Bug的類型分布情況。', 'en' => '', 'de' => '', 'fr' => '', 'vi' => '', 'ja' => ''), + 'desc' => array('zh-cn' => '按照项目下不同执行统计Bug的类型分布情况。', 'zh-tw' => '按照項目統計Bug的類型分布情況。'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '60,61', 'sql' => << array ( - 'group1' => 'project', - 'group2' => 'execution', - 'columnTotal' => 'sum', + 'summary' => 'use', 'columns' => array ( - array('field' => 'type', 'slice' => 'type', 'stat' => 'count', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'type', 'slice' => 'type', 'stat' => 'count', 'showTotal' => 'noShow', 'showMode' => 'default', 'monopolize' => 0, 'showOrigin' => 0) + ), + 'columnTotal' => 'sum', + 'group1' => 'project', + 'group2' => 'execution' ), 'filters' => array ( @@ -1994,27 +3097,23 @@ EOT ), 'fields' => array ( - 'id' => array('object' => 'project', 'field' => 'id', 'type' => 'string'), - 'project' => array('object' => 'project', 'field' => 'project', 'type' => 'string'), - 't3id' => array('object' => 'project', 'field' => 't3id', 'type' => 'string'), - 'execution' => array('object' => 'project', 'field' => 'execution', 'type' => 'string'), - 'bugID' => array('object' => 'bug', 'field' => 'bugID', 'type' => 'string'), - 'type' => array('object' => 'bug', 'field' => 'type', 'type' => 'option') + 'id' => array('object' => 'project', 'field' => '', 'type' => 'number'), + 'project' => array('object' => 'project', 'field' => 'name', 'type' => 'number'), + 'projectname' => array('object' => '', 'field' => '', 'type' => 'string'), + 'execution' => array('object' => 'project', 'field' => 'name', 'type' => 'string'), + 'executionname' => array('object' => 'bug', 'field' => '', 'type' => 'string'), + 'bugID' => array('object' => 'bug', 'field' => '', 'type' => 'number'), + 'type' => array('object' => 'bug', 'field' => 'type', 'type' => 'option') ), 'langs' => array ( - 'stories' => array('zh-cn' => '需求数', 'zh-tw' => '需求数', 'en' => 'Stories'), - 'tasks' => array('zh-cn' => '任务数', 'zh-tw' => '任务数', 'en' => 'Tasks'), - 'undoneStory' => array('zh-cn' => '剩余需求数', 'zh-tw' => '剩余需求数', 'en' => 'Undone Story'), - 'undoneTask' => array('zh-cn' => '剩余任务数', 'zh-tw' => '剩余任务数', 'en' => 'Undone Task'), - 'consumed' => array('zh-cn' => '已消耗工时', 'zh-tw' => '已消耗工时', 'en' => 'Cost(h)'), - 'left' => array('zh-cn' => '剩余工时', 'zh-tw' => '剩余工时', 'en' => 'Left(h)'), - 'consumedPercent' => array('zh-cn' => '进度', 'zh-tw' => '进度', 'en' => 'Process'), - 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'id' => array('zh-cn' => '项目ID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'type' => array('zh-cn' => 'Bug类型', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + 'id' => array('zh-cn' => '项目ID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'project' => array('zh-cn' => '项目名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'projectname' => array('zh-cn' => 'projectname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'execution' => array('zh-cn' => '执行名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'executionname' => array('zh-cn' => 'executionname', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'type' => array('zh-cn' => '不同类型的Bug', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') ), 'vars' => array ( @@ -2024,6 +3123,20 @@ EOT 'selectList' => array('project', 'execution'), 'default' => array('', '') ), + 'drills' => array + ( + array + ( + 'field' => 'type', + 'object' => 'bug', + 'whereSql' => "left join zt_project as t2 on t2.id=t1.execution left join zt_project as t3 on t3.id=t2.project where t1.deleted='0' and t2.deleted='0' and (case when \$project='' then 1 else t3.id=\$project end) and (case when \$execution='' then 1 else t2.id=\$execution end) ", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'execution', 'queryField' => 'execution'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'type', 'queryField' => 'type') + ) + ) + ), 'stage' => 'published', 'builtin' => '0' ); @@ -2035,6 +3148,7 @@ $config->bi->builtin->pivots[] = array 'code' => 'productBugSolution', 'desc' => array('zh-cn' => '按照产品统计Bug的解决方案分布情况。', 'zh-tw' => '按照産品統計Bug的解決方案分布情況。', 'en' => 'Solution distribution of bugs.'), 'dimension' => '1', + 'driver' => 'mysql', 'group' => '59,61', 'sql' => << array ( - 'group1' => 'name', + 'group1' => 'id', 'columnTotal' => 'sum', 'columns' => array ( - array('field' => 'resolution', 'slice' => 'resolution', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0') - ) + array('field' => 'resolution', 'slice' => 'resolution', 'stat' => 'count', 'showTotal' => 'sum', 'showMode' => 'default', 'monopolize' => '0', 'showOrigin' => 0) + ), + 'summary' => 'use' ), + 'filters' => array(), 'fields' => array ( - 'id' => array('object' => 'product', 'field' => 'id', 'type' => 'string'), + 'id' => array('object' => 'product', 'field' => 'name', 'type' => 'number'), 'name' => array('object' => 'product', 'field' => 'name', 'type' => 'string'), - 'bugID' => array('object' => 'project', 'field' => 'bugID', 'type' => 'string'), + 'bugID' => array('object' => 'bug', 'field' => 'id', 'type' => 'number'), 'resolution' => array('object' => 'bug', 'field' => 'resolution', 'type' => 'option') ), 'langs' => array ( - 'id' => array('zh-cn' => 'id', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'id' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'name' => array('zh-cn' => '产品名称', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), 'bugID' => array('zh-cn' => 'bugID', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), - 'resolution' => array('zh-cn' => '解决方案', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => ''), + 'resolution' => array('zh-cn' => '解决方案', 'zh-tw' => '', 'en' => '', 'de' => '', 'fr' => '') + ), + 'vars' => array(), + 'drills' => array + ( + array + ( + 'field' => 'resolution', + 'object' => 'bug', + 'whereSql' => " where t1.deleted='0' and t1.resolution != ''", + 'condition' => array + ( + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'resolution', 'queryField' => 'resolution'), + array('drillObject' => 'zt_bug', 'drillAlias' => 't1', 'drillField' => 'product', 'queryField' => 'id') + ) + ) ), 'stage' => 'published', 'builtin' => '0' diff --git a/module/bi/model.php b/module/bi/model.php index 604f531f23..ecce76134c 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -776,6 +776,10 @@ class biModel extends model if(isset($pivot->langs)) $pivot->langs = $this->jsonEncode($pivot->langs); if(isset($pivot->vars)) $pivot->vars = $this->jsonEncode($pivot->vars); if(!isset($pivot->driver)) $pivot->driver = $this->config->bi->defaultDriver; + if(!isset($pivot->drills)) $pivot->drills = array(); + + $pivotSQLs = array_merge($pivotSQLs, $this->prepareBuilitinPivotDrillSQL($pivot->id, $pivot->drills)); + unset($pivot->drills); $exists = $this->dao->select('id,name')->from(TABLE_PIVOT)->where('id')->eq($pivot->id)->fetch(); if(!$exists) @@ -814,6 +818,35 @@ class biModel extends model return $pivotSQLs; } + /** + * 准备内置透视表的下钻sql。 + * Prepare built-in pivot drill sql. + * + * @param int $pivotID + * @param array $drills + * @access public + * @return array + */ + public function prepareBuilitinPivotDrillSQL($pivotID, $drills) + { + if(empty($drills)) return array(); + + $sqls = array(); + $sqls[] = $this->dao->delete()->from(TABLE_PIVOTDRILL)->where('pivot')->eq($pivotID)->get(); + foreach($drills as $drill) + { + $drill = (object)$drill; + $drill->condition = $this->jsonEncode($drill->condition); + $drill->pivot = $pivotID; + $drill->status = 'published'; + $drill->type = 'manual'; + + $sqls[] = $this->dao->insert(TABLE_PIVOTDRILL)->data($drill)->get(); + } + + return $sqls; + } + /** * 准备内置的度量项sql语句。 * Prepare builtin metric sql.