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.