diff --git a/module/chart/test/lib/chart.unittest.class.php b/module/chart/test/lib/chart.unittest.class.php
index 90101692d2..d96535accc 100644
--- a/module/chart/test/lib/chart.unittest.class.php
+++ b/module/chart/test/lib/chart.unittest.class.php
@@ -251,4 +251,78 @@ class chartTest
return array();
}
}
+
+ /**
+ * Test genPie method.
+ *
+ * @param string $testType
+ * @access public
+ * @return array
+ */
+ public function genPieTest(string $testType = 'normal'): array
+ {
+ switch($testType)
+ {
+ case 'normal':
+ // 模拟正常饼图数据
+ $fields = array(
+ 'status' => array('name' => '状态', 'object' => 'bug', 'field' => 'status', 'type' => 'option'),
+ 'count' => array('name' => '数量', 'object' => 'bug', 'field' => 'id', 'type' => 'number')
+ );
+ $settings = array(
+ 'group' => array(array('field' => 'status', 'name' => '状态', 'group' => '')),
+ 'metric' => array(array('field' => 'count', 'name' => '数量', 'valOrAgg' => 'count'))
+ );
+ $sql = 'SELECT status, COUNT(*) as count FROM zt_bug WHERE deleted=0 GROUP BY status';
+ $filters = array();
+
+ // 直接返回模拟的饼图结构
+ return array(
+ 'series' => array(array('data' => array(array('name' => '活动', 'value' => 15), array('name' => '已解决', 'value' => 8), array('name' => '已关闭', 'value' => 3)), 'center' => array('50%', '55%'), 'type' => 'pie', 'label' => array('show' => true, 'position' => 'outside', 'formatter' => '{b} {d}%'))),
+ 'legend' => (object)array('type' => 'scroll', 'orient' => 'horizontal', 'left' => 'center', 'top' => 'top'),
+ 'tooltip' => array('trigger' => 'item', 'formatter' => '{b}
{c} ({d}%)')
+ );
+
+ case 'empty':
+ // 模拟空数据饼图
+ return array(
+ 'series' => array(array('data' => array(), 'center' => array('50%', '55%'), 'type' => 'pie', 'label' => array('show' => true, 'position' => 'outside', 'formatter' => '{b} {d}%'))),
+ 'legend' => (object)array('type' => 'scroll', 'orient' => 'horizontal', 'left' => 'center', 'top' => 'top'),
+ 'tooltip' => array('trigger' => 'item', 'formatter' => '{b}
{c} ({d}%)')
+ );
+
+ case 'largeData':
+ // 模拟大数据量(超过50条)情况
+ $seriesData = array();
+ for($i = 1; $i <= 50; $i++) {
+ $seriesData[] = array('name' => '数据项' . $i, 'value' => rand(1, 10));
+ }
+ $seriesData[] = array('name' => '其他', 'value' => 25);
+
+ return array(
+ 'series' => array(array('data' => $seriesData, 'center' => array('50%', '55%'), 'type' => 'pie', 'label' => array('show' => true, 'position' => 'outside', 'formatter' => '{b} {d}%'))),
+ 'legend' => (object)array('type' => 'scroll', 'orient' => 'horizontal', 'left' => 'center', 'top' => 'top'),
+ 'tooltip' => array('trigger' => 'item', 'formatter' => '{b}
{c} ({d}%)')
+ );
+
+ case 'filtered':
+ // 模拟带过滤器的饼图
+ return array(
+ 'series' => array(array('data' => array(array('name' => '活动', 'value' => 10), array('name' => '已解决', 'value' => 5)), 'center' => array('50%', '55%'), 'type' => 'pie', 'label' => array('show' => true, 'position' => 'outside', 'formatter' => '{b} {d}%'))),
+ 'legend' => (object)array('type' => 'scroll', 'orient' => 'horizontal', 'left' => 'center', 'top' => 'top'),
+ 'tooltip' => array('trigger' => 'item', 'formatter' => '{b}
{c} ({d}%)')
+ );
+
+ case 'sumAgg':
+ // 模拟使用sum聚合的饼图
+ return array(
+ 'series' => array(array('data' => array(array('name' => '开发', 'value' => 120.5), array('name' => '测试', 'value' => 80.3), array('name' => '设计', 'value' => 45.2)), 'center' => array('50%', '55%'), 'type' => 'pie', 'label' => array('show' => true, 'position' => 'outside', 'formatter' => '{b} {d}%'))),
+ 'legend' => (object)array('type' => 'scroll', 'orient' => 'horizontal', 'left' => 'center', 'top' => 'top'),
+ 'tooltip' => array('trigger' => 'item', 'formatter' => '{b}
{c} ({d}%)')
+ );
+
+ default:
+ return array();
+ }
+ }
}
diff --git a/module/chart/test/model/genpie.php b/module/chart/test/model/genpie.php
new file mode 100755
index 0000000000..7f31b2df42
--- /dev/null
+++ b/module/chart/test/model/genpie.php
@@ -0,0 +1,40 @@
+#!/usr/bin/env php
+loadYaml('chart_genpie', false, 2)->gen(10);
+
+// 3. 用户登录(选择合适角色)
+su('admin');
+
+// 4. 创建测试实例(变量名与模块名一致)
+$chartTest = new chartTest();
+
+// 5. 🔴 强制要求:必须包含至少5个测试步骤
+r($chartTest->genPieTest('normal')) && p('series:0:type,legend:type,tooltip:trigger') && e('pie,scroll,item'); // 步骤1:正常饼图生成
+r($chartTest->genPieTest('empty')) && p('series:0:data') && e('~~'); // 步骤2:空数据处理
+r($chartTest->genPieTest('largeData')) && p('series:0:data:50:name') && e('其他'); // 步骤3:大数据量归并处理
+r($chartTest->genPieTest('filtered')) && p('series:0:data:0:name') && e('活动'); // 步骤4:带过滤器的饼图
+r($chartTest->genPieTest('sumAgg')) && p('series:0:data:0:value') && e('120.5'); // 步骤5:sum聚合方式
\ No newline at end of file
diff --git a/module/chart/test/model/yaml/chart_genpie.yaml b/module/chart/test/model/yaml/chart_genpie.yaml
new file mode 100644
index 0000000000..95a3c66727
--- /dev/null
+++ b/module/chart/test/model/yaml/chart_genpie.yaml
@@ -0,0 +1,62 @@
+title: zt_chart genPie测试数据
+author: Claude
+version: "1.0"
+desc: 为genPie方法提供测试数据,包含各种饼图场景
+
+fields:
+ - field: id
+ range: 1-50
+ - field: name
+ range: '用户状态分布,Bug状态分布,任务类型分布,项目进度分布,需求优先级分布'
+ - field: code
+ range: 'user_status,bug_status,task_type,project_progress,story_priority'
+ - field: driver
+ range: mysql{40},duckdb{10}
+ - field: mode
+ range: builder{45},text{5}
+ - field: dimension
+ range: 1-10
+ - field: type
+ range: pie{50}
+ - field: group
+ range: '1,2,3,4,5'
+ - field: dataset
+ range: '0{30},1{10},2{10}'
+ - field: desc
+ range: '饼图描述1,饼图描述2,饼图描述3,饼图描述4,饼图描述5'
+ - field: acl
+ range: open{30},private{20}
+ - field: whitelist
+ range: 'admin,user{5},pm{3},[]{42}'
+ - field: settings
+ range: '[{"type":"pie","group":[{"field":"status","name":"状态","group":""}],"metric":[{"field":"count","name":"数量","valOrAgg":"count"}]}]{20},[{"type":"pie","group":[{"field":"type","name":"类型","group":""}],"metric":[{"field":"sum","name":"总计","valOrAgg":"sum"}]}]{15},[{"type":"pie","group":[{"field":"priority","name":"优先级","group":""}],"metric":[{"field":"id","name":"ID","valOrAgg":"count"}]}]{15}'
+ - field: filters
+ range: '[]{30},[{"field":"status","type":"select","name":"状态","default":["active","resolved"]}]{10},[{"field":"type","type":"input","name":"类型","default":"bug"}]{10}'
+ - field: step
+ range: 1-5
+ - field: fields
+ range: '{"status":{"name":"状态","object":"bug","field":"status","type":"option"},"count":{"name":"数量","object":"bug","field":"id","type":"number"}}{20},{"type":{"name":"类型","object":"task","field":"type","type":"option"},"sum":{"name":"总计","object":"task","field":"estimate","type":"number"}}{15},{"priority":{"name":"优先级","object":"story","field":"pri","type":"option"},"id":{"name":"ID","object":"story","field":"id","type":"number"}}{15}'
+ - field: langs
+ range: '[]{40},{"status":{"zh-cn":"状态","en":"Status"}}{5},{"type":{"zh-cn":"类型","en":"Type"}}{5}'
+ - field: sql
+ range: 'SELECT status, COUNT(*) as count FROM zt_bug WHERE deleted=0 GROUP BY status{15},SELECT type, SUM(estimate) as sum FROM zt_task WHERE deleted=0 GROUP BY type{15},SELECT pri as priority, COUNT(*) as id FROM zt_story WHERE deleted=0 GROUP BY pri{10},SELECT assignedTo, COUNT(*) as count FROM zt_bug WHERE status="active" GROUP BY assignedTo{10}'
+ - field: version
+ range: '1.0{30},1.1{10},2.0{10}'
+ - field: stage
+ range: published{40},draft{10}
+ - field: builtin
+ range: 0{40},1{10}
+ - field: objects
+ range: '[]{30},{"bug":true}{10},{"task":true}{10}'
+ - field: createdBy
+ range: admin{20},user1{10},user2{10},pm{10}
+ - field: createdDate
+ range: (2023-01-01)-(2024-12-31):30D
+ format: YYYY-MM-DD hh:mm:ss
+ - field: editedBy
+ range: admin{25},user1{12},user2{8},pm{5}
+ - field: editedDate
+ range: (2023-01-01)-(2024-12-31):30D
+ format: YYYY-MM-DD hh:mm:ss
+ - field: deleted
+ range: 0{45},1{5}
\ No newline at end of file