From 78399fb3ccdf2ee976452d0d8fed82055b6163c1 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 16 Jul 2024 16:58:04 +0800 Subject: [PATCH 01/21] * [misc,0.5h] fix unit test error for message module. --- module/message/test/model/getobjectactions.php | 8 ++++---- module/message/test/model/getobjecttypes.php | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/module/message/test/model/getobjectactions.php b/module/message/test/model/getobjectactions.php index 9397306d3b..8c0bde95ae 100755 --- a/module/message/test/model/getobjectactions.php +++ b/module/message/test/model/getobjectactions.php @@ -34,9 +34,9 @@ r($objectActions) && p('bug:closed') && e('关闭'); //查询objec r($objectActions) && p('case:opened') && e('创建'); //查询objectType为case的action是opended的lab标签 r($objectActions) && p('testtask:started') && e('开始'); //查询objectType为testtask的action是starteded的lab标签 r($objectActions) && p('todo:edited') && e('编辑'); //查询objectType为todo的action是edited的lab标签 -r($objectActions) && p('doc:created') && e('创建'); //查询objectType为doc的action是created的lab标签 +r($objectActions) && p('doc:releaseddoc') && e('发布'); //查询objectType为doc的action是releaseddoc的lab标签 -r(implode(',', array_keys($objectActions))) && p() && e('product,story,productplan,project,task,bug,case,testtask,todo,doc,kanbancard'); // 查询有动作的对象类型 +r(implode(',', array_keys($objectActions))) && p() && e('product,epic,story,productplan,project,task,bug,case,testtask,todo,doc,kanbancard'); // 查询有动作的对象类型 r(implode(',', array_keys($objectActions['product']))) && p() && e('opened,edited,closed,undeleted'); // 查询 product 的对象操作 key r(implode(',', array_values($objectActions['product']))) && p() && e('创建,编辑,关闭,还原'); // 查询 product 的对象操作 value @@ -65,5 +65,5 @@ r(implode(',', array_values($objectActions['testtask']))) && p() && e('创建, r(implode(',', array_keys($objectActions['todo']))) && p() && e('opened,edited'); // 查询 todo 的对象操作 key r(implode(',', array_values($objectActions['todo']))) && p() && e('创建,编辑'); // 查询 todo 的对象操作 value -r(implode(',', array_keys($objectActions['doc']))) && p() && e('created,edited'); // 查询 doc 的对象操作 key -r(implode(',', array_values($objectActions['doc']))) && p() && e('创建,编辑'); // 查询 doc 的对象操作 value +r(implode(',', array_keys($objectActions['doc']))) && p() && e('releaseddoc,edited'); // 查询 doc 的对象操作 key +r(implode(',', array_values($objectActions['doc']))) && p() && e('发布,编辑'); // 查询 doc 的对象操作 value diff --git a/module/message/test/model/getobjecttypes.php b/module/message/test/model/getobjecttypes.php index afc6b7bd49..3e5ab0b955 100755 --- a/module/message/test/model/getobjecttypes.php +++ b/module/message/test/model/getobjecttypes.php @@ -19,8 +19,9 @@ pid=1 global $lang, $app, $conifg; $lang->SRCommon = '研发需求'; +$lang->ERCommon = '业务需求'; $app::$loadedLangs = array(); -$app->loadLang('message'); +$app->loadLang('action'); $message = new messageTest(); $objectTypes = $message->getObjectTypesTest(); @@ -36,5 +37,5 @@ r($objectTypes) && p('testtask') && e('测试单'); //查询objectType为te r($objectTypes) && p('todo') && e('待办'); //查询objectType为todo的objectTypes r($objectTypes) && p('doc') && e('文档'); //查询objectType为doc的objectTypes -r(implode(',', array_keys($objectTypes))) && p() && e('product,story,productplan,project,task,bug,case,testtask,todo,doc,kanbancard'); //查询objectTypes的key值 -r(implode(',', array_values($objectTypes))) && p() && e('产品,研发需求,计划,项目,任务,Bug,用例,测试单,待办,文档,看板卡片'); //查询objectTypes的value值 +r(implode(',', array_keys($objectTypes))) && p() && e('product,epic,story,productplan,project,task,bug,case,testtask,todo,doc,kanbancard'); //查询objectTypes的key值 +r(implode(',', array_values($objectTypes))) && p() && e('产品,业务需求,研发需求,计划,项目,任务,Bug,用例,测试单,待办,文档,看板卡片'); //查询objectTypes的value值 From 6f20b35f51e9368639cf3b09df4b231b3fb7996c Mon Sep 17 00:00:00 2001 From: sunhao Date: Tue, 16 Jul 2024 17:03:18 +0800 Subject: [PATCH 02/21] * [misc] fix load partial not work as expected. --- www/js/zui3/zin.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/www/js/zui3/zin.js b/www/js/zui3/zin.js index 11e0f33ee9..0cbfdab5d3 100644 --- a/www/js/zui3/zin.js +++ b/www/js/zui3/zin.js @@ -393,8 +393,15 @@ } else { - if(noMorph) $target.replaceWith(html).zuiInit(); else $target.morph(html); - $target = $(selector.select); + if(noMorph) + { + $target.replaceWith(html); + $target = $(selector.select).zuiInit(); + } + else + { + $target.morph(html); + } } return $target; } @@ -446,7 +453,7 @@ } beforeUpdate($target, info, options); - $target = renderWithHtml($target, info.data, selector, options.isDiffPage); + $target = renderWithHtml($target, info.data, selector, !options.partial && options.isDiffPage); afterUpdate($target, info, options); } @@ -515,7 +522,7 @@ if(options.modal) headers['X-Zui-Modal'] = 'true'; const requestMethod = (options.method || 'GET').toUpperCase(); options.isDiffPage = isDiffPage(url); - if(!options.cache && options.cache !== false) options.cache = (requestMethod === 'GET' && config.clientCache) ? (url + (url.includes('?') ? '&zin=' : '?zin=') + encodeURIComponent(selectors.join(','))) : false; + if(!options.cache && options.cache !== false) options.cache = (requestMethod === 'GET' && config.clientCache && !options.partial) ? (url + (url.includes('?') ? '&zin=' : '?zin=') + encodeURIComponent(selectors.join(','))) : false; const cacheKey = options.cache; let cache; let cacheHit; From 97945680cf83f67e348bfcacd6c05a10fe0990dd Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 16 Jul 2024 09:23:11 +0000 Subject: [PATCH 03/21] * [bug] If cols and data are empty, set them as empty array. --- module/pivot/control.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index b4fa53d4bd..183ac043bf 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -85,14 +85,14 @@ class pivot extends control $drillFields = json_decode(base64_decode($drillFields), true); $filterValues = json_decode(base64_decode($filterValues), true); - $this->view->title = $this->lang->pivot->step3->drillView; $cols = $this->pivot->getDrillCols($drill->object); $datas = $this->pivot->getDrillDatas($drill, $drillFields); $result = $this->pivot->processColData($drill->object, $cols, $datas); - $cols = $result['cols']; - $datas = $result['data']; + $cols = isset($result['cols']) ? $result['cols'] : array(); + $datas = isset($result['data']) ? $result['data'] : array(); + $this->view->title = $this->lang->pivot->step3->drillView; $this->view->cols = $cols; $this->view->datas = $datas; $this->display(); From 6626a7c1f0c7b2d4394bd1a12e6110301a2d3695 Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 16 Jul 2024 09:24:15 +0000 Subject: [PATCH 04/21] * [misc] Format codes. --- module/pivot/model.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/module/pivot/model.php b/module/pivot/model.php index 47e11913e7..f3ccfb1867 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -49,15 +49,12 @@ class pivotModel extends model $pivot->fields = array_keys(get_object_vars($pivot->fieldSettings)); } + $pivot->filters = array(); if(!empty($pivot->filters)) { $filters = json_decode($pivot->filters, true); $pivot->filters = $this->setFilterDefault($filters, $processDateVar); } - else - { - $pivot->filters = array(); - } return $this->processPivot($pivot); } From e6b2cda57d9754453fd1ebfd471fd22cf6834da0 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Tue, 16 Jul 2024 15:29:05 +0800 Subject: [PATCH 05/21] * [task#123267,doing,0.5h] add method to parse sql to table list. --- module/bi/model.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/module/bi/model.php b/module/bi/model.php index 36a797dcb2..d8ec44a54a 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -90,6 +90,13 @@ class biModel extends model return array_filter(array_unique($tables)); } + public function parseTableList($sql) + { + $this->app->loadClass('sqlparser', true); + $parser = new sqlparser($sql); + $statement = $parser->statements[0]; + } + /** * 根据表的别名获取其在sql语句中的表名。 * Get table name by it's alias. From deb010163c077ca19297956164539874d7f0946e Mon Sep 17 00:00:00 2001 From: zhouxin Date: Tue, 16 Jul 2024 15:30:43 +0800 Subject: [PATCH 06/21] * [task#123267,doing,0.5h] add method to parse sql to table list. --- module/bi/model.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/bi/model.php b/module/bi/model.php index d8ec44a54a..90dbc49702 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -95,6 +95,26 @@ class biModel extends model $this->app->loadClass('sqlparser', true); $parser = new sqlparser($sql); $statement = $parser->statements[0]; + + $tableList = array(); + if($statement->from) + { + foreach($statement->from as $fromInfo) + { + if(!empty($fromInfo->alias) && $fromInfo->subquery == 'SELECT') + { + $tableList[$fromInfo->alias] = $fromInfo->expr; + } + elseif(!empty($fromInfo->alias) && !empty($fromInfo->table)) + { + $tableList[$fromInfo->alias] = $fromInfo->table; + } + elseif(empty($fromInfo->alias) && !empty($fromInfo->table)) + { + $tableList[$fromInfo->table] = $fromInfo->table; + } + } + } } /** From b83e9c5954c49f5189edd11293f52585534fce33 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Tue, 16 Jul 2024 15:33:38 +0800 Subject: [PATCH 07/21] * [task#123267,doing,0.5h] add method to parse sql to table list. --- module/bi/model.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/module/bi/model.php b/module/bi/model.php index 90dbc49702..b22966587b 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -115,6 +115,26 @@ class biModel extends model } } } + if($statement->join) + { + foreach($statement->join as $joinInfo) + { + if(!empty($joinInfo->expr->alias) && $joinInfo->expr->subquery == 'SELECT') + { + $tableList[$joinInfo->expr->alias] = $joinInfo->expr->expr; + } + elseif(!empty($joinInfo->expr->alias) && !empty($joinInfo->expr->table)) + { + $tableList[$joinInfo->expr->alias] = $joinInfo->expr->table; + } + elseif(empty($joinInfo->expr->alias) && !empty($joinInfo->expr->table)) + { + $tableList[$joinInfo->expr->table] = $joinInfo->expr->table; + } + } + } + + return $tableList; } /** From f37816070f9715647907496c8102590a8095174b Mon Sep 17 00:00:00 2001 From: zhouxin Date: Tue, 16 Jul 2024 15:35:44 +0800 Subject: [PATCH 08/21] * [task#123267,doing,0h] add commit. --- module/bi/model.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/module/bi/model.php b/module/bi/model.php index b22966587b..4c69559f6d 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -90,6 +90,14 @@ class biModel extends model return array_filter(array_unique($tables)); } + /** + * 解析sql语句,返回sql中出现的表别名和表名的键值对列表。 + * Parse sql to alias => table list. + * + * @param string $sql + * @access public + * @return array + */ public function parseTableList($sql) { $this->app->loadClass('sqlparser', true); From 7e9069f6eab8f43d2da6ae8fd156edb527b63bb2 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Tue, 16 Jul 2024 17:08:45 +0800 Subject: [PATCH 09/21] * [task#123267,doing,0.1h] add lang. --- module/pivot/lang/de.php | 1 + module/pivot/lang/en.php | 1 + module/pivot/lang/fr.php | 1 + module/pivot/lang/zh-cn.php | 1 + 4 files changed, 4 insertions(+) diff --git a/module/pivot/lang/de.php b/module/pivot/lang/de.php index f4455b8607..c1329bec64 100644 --- a/module/pivot/lang/de.php +++ b/module/pivot/lang/de.php @@ -453,3 +453,4 @@ $lang->pivot->drill->inDrillField = 'Drill table field'; $lang->pivot->drill->inQueryField = 'Query field'; $lang->pivot->drill->preview = 'Preview'; $lang->pivot->drill->save = 'Save'; +$lang->pivot->drill->drillFieldText = "%s(%s).%s"; diff --git a/module/pivot/lang/en.php b/module/pivot/lang/en.php index a6a52ef3f8..536f1bac9c 100644 --- a/module/pivot/lang/en.php +++ b/module/pivot/lang/en.php @@ -453,3 +453,4 @@ $lang->pivot->drill->inDrillField = 'Drill table field'; $lang->pivot->drill->inQueryField = 'Query field'; $lang->pivot->drill->preview = 'Preview'; $lang->pivot->drill->save = 'Save'; +$lang->pivot->drill->drillFieldText = "%s(%s).%s"; diff --git a/module/pivot/lang/fr.php b/module/pivot/lang/fr.php index 4a825b7db8..ca39948fff 100644 --- a/module/pivot/lang/fr.php +++ b/module/pivot/lang/fr.php @@ -453,3 +453,4 @@ $lang->pivot->drill->inDrillField = 'Drill table field'; $lang->pivot->drill->inQueryField = 'Query field'; $lang->pivot->drill->preview = 'Preview'; $lang->pivot->drill->save = 'Save'; +$lang->pivot->drill->drillFieldText = "%s(%s).%s"; diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index 9aab0e795e..be85cd5a0e 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -453,3 +453,4 @@ $lang->pivot->drill->inDrillField = '下钻查询表中的'; $lang->pivot->drill->inQueryField = '查询结果字段'; $lang->pivot->drill->preview = '预览'; $lang->pivot->drill->save = '保存'; +$lang->pivot->drill->drillFieldText = "%s(%s).%s"; From f33db2d9052ae5a14c6e0cd1d2630572a7d7279c Mon Sep 17 00:00:00 2001 From: zhouxin Date: Tue, 16 Jul 2024 17:19:13 +0800 Subject: [PATCH 10/21] * [task#123267,doing,0.1h] adjust lang. --- module/pivot/lang/zh-cn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/pivot/lang/zh-cn.php b/module/pivot/lang/zh-cn.php index be85cd5a0e..82728fab81 100644 --- a/module/pivot/lang/zh-cn.php +++ b/module/pivot/lang/zh-cn.php @@ -453,4 +453,4 @@ $lang->pivot->drill->inDrillField = '下钻查询表中的'; $lang->pivot->drill->inQueryField = '查询结果字段'; $lang->pivot->drill->preview = '预览'; $lang->pivot->drill->save = '保存'; -$lang->pivot->drill->drillFieldText = "%s(%s).%s"; +$lang->pivot->drill->drillFieldText = "%s(%s).%s"; From 58152dff3d563203f062f2fd239bee762454255a Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:22:46 +0000 Subject: [PATCH 11/21] * [story#60178,start,0.5h] add default param for isQueryFilter. --- lib/pivotstate/pivotstate.class.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/pivotstate/pivotstate.class.php b/lib/pivotstate/pivotstate.class.php index 3176fee243..2610414de8 100644 --- a/lib/pivotstate/pivotstate.class.php +++ b/lib/pivotstate/pivotstate.class.php @@ -415,13 +415,15 @@ class pivotState /** * Judge is query filter or not. * + * @param array $filters * @access public * @return bool */ - public function isQueryFilter() + public function isQueryFilter($filters = array()) { - if(empty($this->filters)) return false; - $filter = current($this->filters); + $filters = empty($filters) ? $this->filters : $filters; + if(empty($filters)) return false; + $filter = current($filters); return isset($filter['from']) && $filter['from'] == 'query'; } @@ -500,6 +502,7 @@ class pivotState { case 'select': if(is_array($default)) $default = implode("', '", array_filter($default, function($val){return trim($val) != '';})); + if(empty($default)) break; $value = "('" . $default . "')"; $filterWheres[$field] = array('operator' => 'IN', 'type' => $type, 'value' => $value); break; From c10adde1ee9bfd92736a3940c684b2224be4e46d Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:23:30 +0000 Subject: [PATCH 12/21] * [story#60178,doing,0.5h] add setFiltersDefaultValue. --- lib/pivotstate/pivotstate.class.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/pivotstate/pivotstate.class.php b/lib/pivotstate/pivotstate.class.php index 2610414de8..846e1107d8 100644 --- a/lib/pivotstate/pivotstate.class.php +++ b/lib/pivotstate/pivotstate.class.php @@ -529,6 +529,22 @@ class pivotState return $filterWheres; } + public function setFiltersDefaultValue($filterValues) + { + $filters = array(); + foreach($this->filters as $index => $filter) + { + if(!isset($filterValues[$index])) continue; + + $default = $filterValues[$index]; + if($filter['type'] == 'select' && is_array($default)) $default = array_filter($default); + $filter['default'] = $default; + $filters[] = $filter; + } + + return $filters; + } + /** * Complete settings. * From 69574db660b18d389fbce5f91c9ebea284560952 Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:23:39 +0000 Subject: [PATCH 13/21] * [story#60178,doing,0.5h] add setFiltersDefaultValue comment. --- lib/pivotstate/pivotstate.class.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/pivotstate/pivotstate.class.php b/lib/pivotstate/pivotstate.class.php index 846e1107d8..f055f164c3 100644 --- a/lib/pivotstate/pivotstate.class.php +++ b/lib/pivotstate/pivotstate.class.php @@ -529,6 +529,13 @@ class pivotState return $filterWheres; } + /** + * Set filters default value. + * + * @param array $filterValues + * @access public + * @return void + */ public function setFiltersDefaultValue($filterValues) { $filters = array(); From 17c50993ef58f29bc80f356b623168007d3b113b Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:26:14 +0000 Subject: [PATCH 14/21] * [story#60178,doing,2h] refact and add conditions to dtable data. --- module/bi/model.php | 53 ++++++++++++++++++----------------- module/pivot/control.php | 6 ++-- module/pivot/js/preview.ui.js | 11 ++++---- module/pivot/model.php | 32 +++++++++++++-------- 4 files changed, 56 insertions(+), 46 deletions(-) diff --git a/module/bi/model.php b/module/bi/model.php index 4c69559f6d..6fce5df50c 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -1394,7 +1394,7 @@ class biModel extends model $field = 'field' . $index; $columns[$field]['name'] = $field; - $columns[$field]['title'] = $subColumn->label; + $columns[$field]['title'] = empty($subColumn->label) ? ' ' : $subColumn->label; $columns[$field]['width'] = 16 * mb_strlen($subColumn->label); $columns[$field]['minWidth'] = 128; $columns[$field]['align'] = 'center'; @@ -1403,6 +1403,7 @@ class biModel extends model { $columns[$field]['link'] = '#'; $columns[$field]['drillField'] = $subColumn->drillField; + $columns[$field]['condition'] = $subColumn->condition; } $columnMaxLen[$field] = mb_strlen($column->label); @@ -1424,7 +1425,7 @@ class biModel extends model $field = 'field' . $index; $columns[$field]['name'] = $field; - $columns[$field]['title'] = $column->label; + $columns[$field]['title'] = empty($column->label) ? ' ' : $column->label; $columns[$field]['width'] = 16 * mb_strlen($column->label); $columns[$field]['minWidth'] = 128; $columns[$field]['align'] = 'center'; @@ -1433,6 +1434,7 @@ class biModel extends model { $columns[$field]['link'] = '#'; $columns[$field]['drillField'] = $column->drillField; + $columns[$field]['condition'] = $column->condition; } $columnMaxLen[$field] = mb_strlen($column->label); @@ -1451,7 +1453,7 @@ class biModel extends model $drills = !empty($data->drills) ? array_values($data->drills) : array(); foreach($data->array as $rowKey => $rowData) { - list($originRows, $drillFields, $originFields) = $this->processDrills($rowKey, $rowData, $drills, $columns); + $drillConditions = $this->processDrills($rowKey, $rowData, $drills, $columns); $index = 0; $rowDataKeys = array_keys($rowData); @@ -1496,10 +1498,8 @@ class biModel extends model $index++; } - $rows[$rowKey]['originRows'] = $originRows; - $rows[$rowKey]['originFields'] = $originFields; - $rows[$rowKey]['drillFields'] = $drillFields; - $rows[$rowKey]['ROW_ID'] = $rowKey; + $rows[$rowKey]['conditions'] = $drillConditions; + $rows[$rowKey]['ROW_ID'] = $rowKey; } foreach($columns as $field => $column) $columns[$field]['width'] = 16 * $columnMaxLen[$field]; @@ -1521,32 +1521,33 @@ class biModel extends model if(empty($drills) || !isset($drills[$rowIndex])) return array(array(), array(), array()); $drills = $drills[$rowIndex]; - list($originRows, $drillFields) = array_values($drills); + list($drillFields) = array_values($drills); - $rebuildOriginRows = array(); - $rebuildDrillFields = array(); - $originFields = array(); - - $index = 0; - foreach($rowData as $column => $value) + $drillConditions = array(); + $index = 0; + foreach($rowData as $columnKey => $value) { - $field = 'field' . $index; + $field = 'field' . $index; + $column = $columns[$field]; // 判断该列是否设置了下钻。 // Determine whether the column is drilled. - if(!isset($columns[$field]['drillField'])) - { - $index++; - continue; - } - - $originFields[$field] = $columns[$field]['drillField']; - if(isset($originRows[$column])) $rebuildOriginRows[$field] = $originRows[$column]; - if(isset($drillFields[$column])) $rebuildDrillFields[$field] = $drillFields[$column]; - + if(isset($column['drillField'])) $drillConditions[$field] = $this->prepareDrillConditions($drillFields[$columnKey], $column['condition'], $column['drillField']); $index++; } - return array($rebuildOriginRows, $rebuildDrillFields, $originFields); + return $drillConditions; + } + + public function prepareDrillConditions(array $drillFields, array $conditions, string $originField): array + { + foreach($conditions as $index => $condition) + { + extract($condition); + if(!isset($drillFields[$queryField])) continue; + $conditions[$index]['value'] = $drillFields[$queryField]; + } + + return array($originField, $conditions); } /** diff --git a/module/pivot/control.php b/module/pivot/control.php index 183ac043bf..bb9e2467ab 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -79,14 +79,14 @@ class pivot extends control * @access public * @return void */ - public function drillModal(int $pivotID, string $colName, string $drillFields, string $filterValues) + public function drillModal(int $pivotID, string $colName, string $conditions, string $filterValues, string $value) { $drill = $this->pivot->fetchPivotDrill($pivotID, $colName); - $drillFields = json_decode(base64_decode($drillFields), true); + $conditions = json_decode(base64_decode($conditions), true); $filterValues = json_decode(base64_decode($filterValues), true); $cols = $this->pivot->getDrillCols($drill->object); - $datas = $this->pivot->getDrillDatas($drill, $drillFields); + $datas = $value == 0 ? array() : $this->pivot->getDrillDatas($pivotID, $drill, $conditions, $filterValues); $result = $this->pivot->processColData($drill->object, $cols, $datas); $cols = isset($result['cols']) ? $result['cols'] : array(); diff --git a/module/pivot/js/preview.ui.js b/module/pivot/js/preview.ui.js index a5e9afcb03..45eccb2941 100644 --- a/module/pivot/js/preview.ui.js +++ b/module/pivot/js/preview.ui.js @@ -236,13 +236,14 @@ renderCell = function(result, {row, col}) window.clickCell = function(col, {colName, rowInfo}) { - const drillFields = rowInfo.data.drillFields[colName]; - const originField = rowInfo.data.originFields[colName]; + const drillConditions = rowInfo.data.conditions[colName]; + const value = rowInfo.data[colName]; + if(!Array.isArray(drillConditions)) return false; + + const [originField, conditions] = drillConditions; const filterValues = getFilterValues(); - if(typeof(originField) == 'undefined' || typeof(drillFields) == 'undefined') return false; - - const drillModalLink = $.createLink('pivot', 'drillModal', `pivotID=${pivotID}&colName=${originField}&drillFields=${btoa(JSON.stringify(drillFields))}&filterValues=${btoa(JSON.stringify(filterValues))}`); + const drillModalLink = $.createLink('pivot', 'drillModal', `pivotID=${pivotID}&colName=${originField}&drillFields=${btoa(JSON.stringify(conditions))}&filterValues=${btoa(JSON.stringify(filterValues))}&value=${value}`); zui.Modal.open({url: drillModalLink, size: 'lg'}); } diff --git a/module/pivot/model.php b/module/pivot/model.php index f3ccfb1867..84c6e7569c 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -679,8 +679,8 @@ class pivotModel extends model switch($filter['type']) { case 'select': - if(empty($default)) break; if(is_array($default)) $default = implode("', '", array_filter($default, function($val){return trim($val) != '';})); + if(empty($default)) break; $value = "('" . $default . "')"; $filterFormat[$field] = array('operator' => 'IN', 'value' => $value); break; @@ -957,19 +957,14 @@ class pivotModel extends model * * @param array $sliceRecord * @param object $record - * @param int $rowNo * @param string $field * @param string $slice * @param array $groups * @access public * @return array */ - public function addDrillData(array $sliceRecord, object $record, int $rowNo, string $slice, array $groups): array + public function addDrillData(array $sliceRecord, object $record, string $slice, array $groups): array { - /* 添加下钻所需原数据行号。*/ - /* add rowNo for drill. */ - $sliceRecord['rows'][] = $rowNo; - $drills = $sliceRecord['drillFields']; if($slice != 'noSlice') $groups[] = $slice; @@ -996,7 +991,7 @@ class pivotModel extends model public function processColumnStat(int $index, string $field, string $slice, string $stat, array $groups, array $records, array $drillRecords): array { $sliceRecords = $this->initSliceColumnRecords($index, $field, $slice, $groups, $records); - foreach($records as $rowNo => $record) + foreach($records as $record) { $groupUnionKey = $this->getGroupsKey($groups, $record); $fieldKey = $this->getSliceFieldKey($index, $slice, $field, $record); @@ -1005,7 +1000,7 @@ class pivotModel extends model $value = $record->$field; $floatValue = is_numeric($value) ? (float)$value : 0; - $sliceGroupRecord->{$fieldKey} = $this->addDrillData($sliceGroupRecord->{$fieldKey}, $record, $rowNo, $slice, $groups); + $sliceGroupRecord->{$fieldKey} = $this->addDrillData($sliceGroupRecord->{$fieldKey}, $record, $slice, $groups); switch($stat) { @@ -1038,7 +1033,6 @@ class pivotModel extends model /* Skip the group field directly. */ if(in_array($sliceField, $groups)) continue; - $rows[$sliceField] = $sliceRecord->{$sliceField}['rows']; $drillFields[$sliceField] = $sliceRecord->{$sliceField}['drillFields']; $sliceStat = $sliceRecord->{$sliceField}[$stat]; @@ -1067,8 +1061,7 @@ class pivotModel extends model } } - if(!isset($drillRecords[$groupUnionKey])) $drillRecords[$groupUnionKey] = array('rows' => $rows, 'drillFields' => $drillFields); - if(!empty($rows)) $drillRecords[$groupUnionKey]['rows'] += $rows; + if(!isset($drillRecords[$groupUnionKey])) $drillRecords[$groupUnionKey] = array('drillFields' => $drillFields); if(!empty($drillFields)) $drillRecords[$groupUnionKey]['drillFields'] += $drillFields; } @@ -1827,6 +1820,7 @@ class pivotModel extends model $isDrilling = isset($column['drill']) && isset($column['drill']->condition); $drillField = $isDrilling ? $column['drill']->field : ''; + $condition = $isDrilling ? $column['drill']->condition : ''; $col = new stdclass(); $col->name = $column['field']; @@ -1834,6 +1828,7 @@ class pivotModel extends model $col->showOrigin = $showOrigin; $col->isDrilling = $isDrilling; $col->drillField = $drillField; + $col->condition = $condition; $fieldObject = $fields[$column['field']]['object']; $relatedField = $fields[$column['field']]['field']; @@ -1878,6 +1873,7 @@ class pivotModel extends model $childCol->colspan = $monopolize ? 2 : 1; $childCol->isDrilling = $isDrilling; $childCol->drillField = $drillField; + $childCol->condition = $condition; $cols[1][] = $childCol; } $col->colspan = count($sliceList); @@ -2271,6 +2267,18 @@ class pivotModel extends model return $filters; } + public function setConditionValueWithFilters(array $condition, array $filters): string + { + $field = $condition['queryField']; + if(!isset($filters[$field])) return ''; + + $filter = $filters[$field]; + $drillField = $condition['drillField']; + extract($filter); + + return "t1.{$drillField} $operator $value"; + } + /** * 从透视表对象中获取字段。 * Get fields from pivot object. From cb25dec41ee4d52e996c29500c08e21b17fc6e59 Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:30:36 +0000 Subject: [PATCH 15/21] * [story#60178,doing,0.2h] add comment. --- module/bi/model.php | 9 +++++++++ module/pivot/model.php | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/module/bi/model.php b/module/bi/model.php index 6fce5df50c..0b27fbc1a6 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -1538,6 +1538,15 @@ class biModel extends model return $drillConditions; } + /** + * Prepare drill conditions. + * + * @param array $drillFields + * @param array $conditions + * @param string $originField + * @access public + * @return array + */ public function prepareDrillConditions(array $drillFields, array $conditions, string $originField): array { foreach($conditions as $index => $condition) diff --git a/module/pivot/model.php b/module/pivot/model.php index 84c6e7569c..d0fb01c935 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -2267,6 +2267,15 @@ class pivotModel extends model return $filters; } + /** + * 将筛选器的值填写到查询条件中并返回sql。 + * Set condition value with filters. + * + * @param array $condition + * @param array $filters + * @access public + * @return string + */ public function setConditionValueWithFilters(array $condition, array $filters): string { $field = $condition['queryField']; From bcd7822ee3e58adde13e71b7b28361da160041ef Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:35:41 +0000 Subject: [PATCH 16/21] * [story#60178,done,1h] finish drill with filters. --- module/pivot/model.php | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/module/pivot/model.php b/module/pivot/model.php index d0fb01c935..eff3bccc6b 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -2555,22 +2555,40 @@ class pivotModel extends model /** * Get drill datas. * - * @param array $drill + * @param int $pivotID + * @param object $drill + * @param array $conditions + * @param array $filterValues * @access public * @return array */ - public function getDrillDatas(object $drill, array $drillFields): array + public function getDrillDatas(int $pivotID, object $drill, array $conditions, array $filterValues): array { - $conditionSQL = ' WHERE 1=1'; - foreach($drill->condition as $condition) + $this->app->loadClass('pivotstate', true); + $pivot = $this->getById($pivotID); + $pivotState = new pivotState($pivot, array(), $this->app->getClientLang()); + + $filters = $pivotState->setFiltersDefaultValue($filterValues); + $filters = $pivotState->convertFiltersToWhere($filters); + + $conditionSQLs = array('1=1'); + foreach($conditions as $condition) { - extract($condition); - if(!isset($drillFields[$queryField])) continue; - $conditionSQL .= " AND t1.{$drillField}='{$drillFields[$queryField]}'"; + if(!isset($condition['value'])) + { + $conditionSQLs[] = $this->setConditionValueWithFilters($condition, $filters); + } + else + { + extract($condition); + $conditionSQLs[] = "t1.{$drillField}='{$value}'"; + } } - $drillSQL = $this->getDrillSQL($drill->object, $drill->whereSQL, $conditionSQL); + $conditionSQLs = array_filter($conditionSQLs); + $conditionSQL = 'WHERE ' . implode(' AND ', $conditionSQLs); + $drillSQL = $this->getDrillSQL($drill->object, $drill->whereSQL, $conditionSQL); $queryResult = $this->loadModel('bi')->querySQL($drillSQL, $drillSQL); if($queryResult['result'] != 'success') return array(); From 7c0461906411f46ca2bde506a2f7dfccb0858869 Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:40:50 +0000 Subject: [PATCH 17/21] * [story#60178,done,0.1h] fix sonar. --- module/bi/model.php | 5 +++-- module/pivot/model.php | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/bi/model.php b/module/bi/model.php index 0b27fbc1a6..80d962c6ff 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -1117,7 +1117,9 @@ class biModel extends model public function prepareColumns($sql, $statement, $driver) { list($columnTypes, $columnFields) = $this->getSqlTypeAndFields($sql, $driver); - list($moduleNames, $aliasNames, $fieldPairs, $relatedObjects) = $this->getParams4Rebuild($sql, $statement, $columnFields); + $rebuildParams = $this->getParams4Rebuild($sql, $statement, $columnFields); + $fieldPairs = $rebuildParams[2]; + $relatedObjects = $rebuildParams[3]; $columns = array(); $clientLang = $this->app->getClientLang(); @@ -1463,7 +1465,6 @@ class biModel extends model { $field = 'field' . $index; $value = $rowData[$i]; - $originRowKey = $rowDataKeys[$i]; if(!empty($columns[$field]['colspan'])) { diff --git a/module/pivot/model.php b/module/pivot/model.php index eff3bccc6b..250f020cab 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -1023,7 +1023,6 @@ class pivotModel extends model foreach($sliceRecords as $groupUnionKey => $sliceRecord) { - $rows = array(); $drillFields = array(); $sliceFields = array_keys((array)$sliceRecord); From 11c2aaad47961b14a9b7fb491ed4c3046bbe28ba Mon Sep 17 00:00:00 2001 From: qixinzhi Date: Tue, 16 Jul 2024 09:42:24 +0000 Subject: [PATCH 18/21] * [story#60178,done,0.1h] fix sonar. --- module/bi/model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/bi/model.php b/module/bi/model.php index 80d962c6ff..fb842fc998 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -1458,7 +1458,6 @@ class biModel extends model $drillConditions = $this->processDrills($rowKey, $rowData, $drills, $columns); $index = 0; - $rowDataKeys = array_keys($rowData); $rowData = array_values($rowData); for($i = 0; $i < count($rowData); $i++) From d0abdab7beb3551614f00d93fc471ba6cfc29a63 Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 16 Jul 2024 10:07:07 +0000 Subject: [PATCH 19/21] * [misc] Fix undefined key. --- module/bi/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/bi/model.php b/module/bi/model.php index fb842fc998..3cae5c2bf4 100644 --- a/module/bi/model.php +++ b/module/bi/model.php @@ -1531,7 +1531,7 @@ class biModel extends model $column = $columns[$field]; // 判断该列是否设置了下钻。 // Determine whether the column is drilled. - if(isset($column['drillField'])) $drillConditions[$field] = $this->prepareDrillConditions($drillFields[$columnKey], $column['condition'], $column['drillField']); + if(isset($column['drillField']) && isset($drillFields[$columnKey])) $drillConditions[$field] = $this->prepareDrillConditions($drillFields[$columnKey], $column['condition'], $column['drillField']); $index++; } From b80b6a5fab0d8d1bc457812356a716b552b8cf23 Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 16 Jul 2024 10:07:33 +0000 Subject: [PATCH 20/21] [misc] Remove useless codes. --- module/pivot/control.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/module/pivot/control.php b/module/pivot/control.php index bb9e2467ab..032b2a39c8 100644 --- a/module/pivot/control.php +++ b/module/pivot/control.php @@ -88,10 +88,6 @@ class pivot extends control $cols = $this->pivot->getDrillCols($drill->object); $datas = $value == 0 ? array() : $this->pivot->getDrillDatas($pivotID, $drill, $conditions, $filterValues); - $result = $this->pivot->processColData($drill->object, $cols, $datas); - $cols = isset($result['cols']) ? $result['cols'] : array(); - $datas = isset($result['data']) ? $result['data'] : array(); - $this->view->title = $this->lang->pivot->step3->drillView; $this->view->cols = $cols; $this->view->datas = $datas; From 5efa0352f422be2f8a4adb247ca129643c1e0939 Mon Sep 17 00:00:00 2001 From: liyang Date: Mon, 15 Jul 2024 17:33:12 +0800 Subject: [PATCH 21/21] + [task#122973, doing, 0.1h] Add id in edit and create build page. --- module/build/ui/create.html.php | 1 + module/build/ui/edit.html.php | 3 +++ 2 files changed, 4 insertions(+) diff --git a/module/build/ui/create.html.php b/module/build/ui/create.html.php index a069dabcb7..9ba05147bb 100644 --- a/module/build/ui/create.html.php +++ b/module/build/ui/create.html.php @@ -223,6 +223,7 @@ formPanel ), formRow ( + set::id('buildFiles'), formGroup ( set::label($lang->build->files), diff --git a/module/build/ui/edit.html.php b/module/build/ui/edit.html.php index 88245f41b4..b59acb7bb8 100644 --- a/module/build/ui/edit.html.php +++ b/module/build/ui/edit.html.php @@ -152,10 +152,12 @@ formPanel ), formRow ( + set::id('buildDateRow'), formGroup ( set::width('1/2'), set::name('date'), + set::id('buildDate'), set::label($lang->build->date), set::control('date'), set::value($build->date) @@ -183,6 +185,7 @@ formPanel ), formRow ( + set::id('buildFiles'), formGroup ( set::label($lang->build->files),