* [story#60178,doing,2h] refact and add conditions to dtable data.
This commit is contained in:
+27
-26
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user