tao.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. class chartTao extends chartModel
  3. {
  4. /**
  5. * 获取数据库查询结果。
  6. * Get rows.
  7. *
  8. * @param string $defaultSql
  9. * @param array $filters
  10. * @param string $date YEAR|MONTH|YEARWEEK|DATE
  11. * @param string $group
  12. * @param string $metric
  13. * @param string $agg count|distinct|avg|sum|max|min
  14. * @param string $driver
  15. * @access protected
  16. * @return array
  17. */
  18. protected function getRows($defaultSql, $filters, $date, $group, $metric, $agg, $driver = 'mysql')
  19. {
  20. $groupSql = $groupBySql = "tt.`$group`";
  21. if(!empty($date))
  22. {
  23. $groupSql = $date == 'MONTH' ? "YEAR(tt.`$group`) AS ttyear, $date(tt.`$group`) AS ttgroup" : "$date(tt.`$group`) AS $group";
  24. $groupBySql = $date == 'MONTH' ? "YEAR(tt.`$group`), $date(tt.`$group`)" : "$date(tt.`$group`)";
  25. }
  26. if($agg == 'distinct')
  27. {
  28. $aggSQL = "COUNT($agg tt.`$metric`) AS `$metric`";
  29. }
  30. elseif($agg == 'sum' || $agg == 'avg')
  31. {
  32. $aggSQL = "ROUND($agg(tt.`$metric`), 2) AS `$metric`";
  33. }
  34. else
  35. {
  36. $aggSQL = "$agg(tt.`$metric`) AS `$metric`";
  37. }
  38. $sql = "SELECT $groupSql,$aggSQL FROM ($defaultSql) tt";
  39. if(!empty($filters))
  40. {
  41. $wheres = array();
  42. foreach($filters as $field => $filter)
  43. {
  44. $wheres[] = "`$field` {$filter['operator']} {$filter['value']}";
  45. }
  46. $whereStr = implode(' AND ', $wheres);
  47. $sql .= " WHERE $whereStr";
  48. }
  49. $sql .= " GROUP BY $groupBySql";
  50. return $this->loadModel('bi')->queryWithDriver($driver, $sql);
  51. }
  52. /**
  53. * 处理数据库查询结果。
  54. * Process rows.
  55. *
  56. * @param array $rows
  57. * @param string $date YEAR|MONTH|YEARWEEK|DATE
  58. * @param string $group
  59. * @param string $metric
  60. * @access protected
  61. * @return array
  62. */
  63. protected function processRows($rows, $date, $group, $metric)
  64. {
  65. $stat = array();
  66. foreach($rows as $row)
  67. {
  68. if(!empty($date) and $date == 'MONTH')
  69. {
  70. $stat[sprintf("%04d", $row->ttyear) . '-' . sprintf("%02d", $row->ttgroup)] = $row->$metric;
  71. }
  72. elseif(!empty($date) and $date == 'YEARWEEK')
  73. {
  74. $yearweek = sprintf("%06d", $row->$group);
  75. $year = substr($yearweek, 0, strlen($yearweek) - 2);
  76. $week = substr($yearweek, -2);
  77. $weekIndex = in_array($this->app->getClientLang(), array('zh-cn', 'zh-tw')) ? sprintf($this->lang->chart->groupWeek, $year, $week) : sprintf($this->lang->chart->groupWeek, $week, $year);
  78. $stat[$weekIndex] = $row->$metric;
  79. }
  80. elseif(!empty($date) and $date == 'YEAR')
  81. {
  82. $stat[sprintf("%04d", $row->$group)] = $row->$metric;
  83. }
  84. else
  85. {
  86. $stat[$row->$group] = $row->$metric;
  87. }
  88. }
  89. return $stat;
  90. }
  91. /**
  92. * 根据设置转换字段名称。
  93. * Switch field name.
  94. *
  95. * @param array $fields
  96. * @param array $langs
  97. * @param array $metrics
  98. * @param string $index
  99. * @access protected
  100. * @return string
  101. */
  102. protected function switchFieldName($fields, $langs, $metrics, $index)
  103. {
  104. $fieldName = $fields[$metrics[$index]]['name'];
  105. if(!empty($fields[$metrics[$index]]['object']) and !empty($fields[$metrics[$index]]['field']))
  106. {
  107. $relatedObject = $fields[$metrics[$index]]['object'];
  108. $relatedField = $fields[$metrics[$index]]['field'];
  109. $this->app->loadLang($relatedObject);
  110. $fieldName = isset($this->lang->$relatedObject->$relatedField) ? $this->lang->$relatedObject->$relatedField : $fieldName;
  111. }
  112. $clientLang = $this->app->getClientLang();
  113. if(isset($langs[$metrics[$index]]) and !empty($langs[$metrics[$index]][$clientLang])) $fieldName = $langs[$metrics[$index]][$clientLang];
  114. return $fieldName;
  115. }
  116. }