* [story#60178,doing,2h] refact and add conditions to dtable data.

This commit is contained in:
qixinzhi
2024-07-16 17:55:23 +08:00
committed by 代婷婷
parent 69574db660
commit 17c50993ef
4 changed files with 56 additions and 46 deletions
+27 -26
View File
@@ -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);
}
/**
+3 -3
View File
@@ -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();
+6 -5
View File
@@ -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'});
}
+20 -12
View File
@@ -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.