本文实例讲述了yii框架结合charjs统计上一年与当前年数据的方法。分享给大家供大家参考,具体如下:

理论上是1年有12个月,但实际上却是去年12个月已经过了,是完整的12个月,今年的12个月还没过,不完整,所以需要补齐

public static function getyearorderchardata() {
    // 获取当前年
    $months = range(1, 12);
    $currentyear = date('y');
    $lastyear = date('y', strtotime("-1 year"));
    // 所有订单
    $allorderdata = self::find()
            ->select(['from_unixtime(create_at,"%y-%m") as char_time', 'count(id) as total_order', 'sum(order_amount) as total_order_amount'])
            ->where(['>=', 'from_unixtime(create_at,"%y")', $lastyear])
            ->groupby('char_time')
            ->all();
    // 已支付订单
    $allpayorderdata = self::find()
            ->select(['from_unixtime(create_at,"%y-%m") as char_time', 'count(id) as total_order', 'sum(pay_amount) as total_order_amount'])
            ->where(['>=', 'from_unixtime(create_at,"%y")', $lastyear])
            ->andwhere(['pay_status' => 2])
            ->groupby('char_time')
            ->all();
    $yearcounttitle   = yii::t('backend', 'year_order_count_title', ['last_year' => $lastyear, 'current_year' => $currentyear]);
    $yearamounttitle  = yii::t('backend', 'year_order_amount_title', ['last_year' => $lastyear, 'current_year' => $currentyear]);
    $yearpaycounttitle = yii::t('backend', 'year_order_pay_count_title', ['last_year' => $lastyear, 'current_year' => $currentyear]);
    $yearpayamounttitle = yii::t('backend', 'year_order_pay_amount_title', ['last_year' => $lastyear, 'current_year' => $currentyear]);
 
    $labels = [];
    // 所有订单
    $lastyearcounts = []; // 前一年月订单总量
    $lastyearamounts = []; // 前一年月订单总额
    $currentyearcounts = []; // 当前年月订单总量
    $currentyearamounts = []; // 当前年月订单额
    $allorderdataarr = [];
    foreach($allorderdata as $allkey => $allval) {
      $allorderdataarr[$allval->char_time]['char_time'] = $allval->char_time;
      $allorderdataarr[$allval->char_time]['total_order'] = $allval->total_order;
      $allorderdataarr[$allval->char_time]['total_order_amount'] = number_format($allval->total_order_amount / 100, 2, '.', '');
    }
 
    // 已支付订单
    $lastyearpaycounts = []; // 前一年月支付订单总量
    $lastyearpayamounts = []; // 前一年月支付订单总额
    $currentyearpaycounts = []; // 当前年月支付订单总量
    $currentyearpayamounts = []; // 当前年月支付订单额
    $allpayorderdataarr = [];
    foreach($allpayorderdata as $paykey => $payval) {
      $allpayorderdataarr[$payval->char_time]['char_time'] = $payval->char_time;
      $allpayorderdataarr[$payval->char_time]['total_order'] = $payval->total_order;
      $allpayorderdataarr[$payval->char_time]['total_order_amount'] = number_format($payval->total_order_amount / 100, 2, '.', '');
    }
 
    foreach($months as $key => $val) {
      $label = $val . yii::t('backend', 'month');
      $labels[] = $label;
      $themonth = strlen($val) == 2 ? $val : '0' . $val;
      // 上一年
      $lastyearmonth = $lastyear . '-' . $themonth;
      if(array_key_exists($lastyearmonth, $allorderdataarr)) {
        $lastyearcounts[] = $allorderdataarr[$lastyearmonth]['total_order'];
        $lastyearamounts[] = $allorderdataarr[$lastyearmonth]['total_order_amount'];
      } else {
        $lastyearcounts[] = '0';
        $lastyearamounts[] = '0';
      }
      if(array_key_exists($lastyearmonth, $allpayorderdataarr)) {
        $lastyearpaycounts[] = $allpayorderdataarr[$lastyearmonth]['total_order'];
        $lastyearpayamounts[] = $allpayorderdataarr[$lastyearmonth]['total_order_amount'];
      } else {
        $lastyearpaycounts[] = '0';
        $lastyearpayamounts[] = '0';
      }
 
      // 当前年
      $currentyearmonth = $currentyear . '-' . $themonth;
      if(array_key_exists($currentyearmonth, $allorderdataarr)) {
        $currentyearcounts[] = $allorderdataarr[$currentyearmonth]['total_order'];
        $currentyearamounts[] = $allorderdataarr[$currentyearmonth]['total_order_amount'];
      } else {
        $currentyearcounts[] = '0';
        $currentyearamounts[] = '0';
      }
      if(array_key_exists($currentyearmonth, $allpayorderdataarr)) {
        $currentyearpaycounts[] = $allpayorderdataarr[$currentyearmonth]['total_order'];
        $currentyearpayamounts[] = $allpayorderdataarr[$currentyearmonth]['total_order_amount'];
      } else {
        $currentyearpaycounts[] = '0';
        $currentyearpayamounts[] = '0';
      }
    }
    $data = [
      'yearcounttitle'     => $yearcounttitle,
      'yearamounttitle'    => $yearamounttitle,
      'yearpaycounttitle'   => $yearpaycounttitle,
      'yearpayamounttitle'   => $yearpayamounttitle,
      'lastyear'        => $lastyear,
      'currentyear'      => $currentyear,
      'labels'         => $labels,
      'lastyearcounts'     => $lastyearcounts,
      'lastyearamounts'    => $lastyearamounts,
      'currentyearcounts'   => $currentyearcounts,
      'currentyearamounts'   => $currentyearamounts,
      'lastyearpaycounts'   => $lastyearpaycounts,
      'lastyearpayamounts'   => $lastyearpayamounts,
      'currentyearpaycounts'  => $currentyearpaycounts,
      'currentyearpayamounts' => $currentyearpayamounts,
    ];
    return $data;
  }

js

// 订单总量对比
  var yearordercountchartcanvas = $('#yearordercountchart').get(0).getcontext('2d')
  var yearordercountchartdata = {
   labels : <?= json_encode($orderchar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderchar['lastyear'] ?>',
     backgroundcolor   : 'rgba(0, 192, 239, 0.5)',
     data        : <?= json_encode($orderchar['lastyearcounts'], true) ?>
    },
    {
     label        : '<?= $orderchar['currentyear'] ?>',
     backgroundcolor   : 'rgba(0, 135, 239, 0.5)',
     data        : <?= json_encode($orderchar['currentyearcounts'], true) ?>
    }
   ]
  }
 
  var yearordercountchartoptions = {
    scales: {
      xaxes: [{
        gridlines: {
          display: false
        }
      }],
      yaxes: [{
        gridlines: {
          display: false
        }
      }]
    }
  }
 
  var yearordercountchart = new chart(yearordercountchartcanvas, {
    type: 'line',
    data: yearordercountchartdata,
    options: yearordercountchartoptions
  });
 
  // 支付订单总量对比
  var yearorderpaycountchartcanvas = $('#yearorderpaycountchart').get(0).getcontext('2d')
  var yearorderpaycountchartdata = {
   labels : <?= json_encode($orderchar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderchar['lastyear'] ?>',
     backgroundcolor   : 'rgba(0, 166, 90, 0.5)',
     data        : <?= json_encode($orderchar['lastyearpaycounts'], true) ?>
    },
    {
     label        : '<?= $orderchar['currentyear'] ?>',
     backgroundcolor   : 'rgba(0, 166, 11, 0.5)',
     data        : <?= json_encode($orderchar['currentyearpaycounts'], true) ?>
    }
   ]
  }
 
  var yearorderpaycountchartoptions = {
    scales: {
      xaxes: [{
        gridlines: {
          display: false
        }
      }],
      yaxes: [{
        gridlines: {
          display: false
        }
      }]
    }
  }
 
  var yearorderpaycountchart = new chart(yearorderpaycountchartcanvas, {
    type: 'line',
    data: yearorderpaycountchartdata,
    options: yearorderpaycountchartoptions
  });
 
  // 订单总额对比
  var yearorderamountchartcanvas = $('#yearorderamountchart').get(0).getcontext('2d')
  var yearorderamountchartdata = {
   labels : <?= json_encode($orderchar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderchar['lastyear'] ?>',
     backgroundcolor   : 'rgba(0, 192, 239, 0.5)',
     data        : <?= json_encode($orderchar['lastyearamounts'], true) ?>
    },
    {
     label        : '<?= $orderchar['currentyear'] ?>',
     backgroundcolor   : 'rgba(0, 135, 239, 0.5)',
     data        : <?= json_encode($orderchar['currentyearamounts'], true) ?>
    }
   ]
  }
 
  var yearorderamountchartoptions = {
    scales: {
      xaxes: [{
        gridlines: {
          display: false
        }
      }],
      yaxes: [{
        gridlines: {
          display: false
        }
      }]
    }
  }
 
  var yearorderamountchart = new chart(yearorderamountchartcanvas, {
    type: 'line',
    data: yearorderamountchartdata,
    options: yearorderamountchartoptions
  });
 
  // 支付订单总额对比
  var yearorderpayamountchartcanvas = $('#yearorderpayamountchart').get(0).getcontext('2d')
  var yearorderpayamountchartdata = {
   labels : <?= json_encode($orderchar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderchar['lastyear'] ?>',
     backgroundcolor   : 'rgba(0, 166, 90, 0.5)',
     data        : <?= json_encode($orderchar['lastyearpayamounts'], true) ?>
    },
    {
     label        : '<?= $orderchar['currentyear'] ?>',
     backgroundcolor   : 'rgba(0, 166, 11, 0.5)',
     data        : <?= json_encode($orderchar['currentyearpayamounts'], true) ?>
    }
   ]
  }
 
  var yearorderpayamountchartoptions = {
    scales: {
      xaxes: [{
        gridlines: {
          display: false
        }
      }],
      yaxes: [{
        gridlines: {
          display: false
        }
      }]
    }
  }
 
  var yearorderpayamountchart = new chart(yearorderpayamountchartcanvas, {
    type: 'line',
    data: yearorderpayamountchartdata,
    options: yearorderpayamountchartoptions
  });

记住,yii的as一定要在模型利定义公共变量

public $char_time; // 按时间统计
  public $total_order; // 所有订单
  public $total_order_amount; // 所有订单总额
  public $total_pay_order; // 支付订单
  public $total_pay_amount; // 支付订单总额
  public $total_order_pay_amount; // 支付总额