admin/app/frontend/modules/finance/services/BalanceRecordService.php

109 lines
2.8 KiB
PHP

<?php
namespace app\frontend\modules\finance\services;
use app\frontend\modules\finance\models\Balance;
use Illuminate\Support\Collection;
class BalanceRecordService
{
/**
* 余额记录列表,支出与收入统计
* @return array
*/
public function getRecordData()
{
$record_list = Balance::getMemberRecordList();
if(!$record_list['data']){
return false;
}
$date_key = $this->getDateKey($record_list['data']);
$money_arr = Balance::getExpendAndIncome($date_key);
$this->fillDate($record_list['data'], $date_key, "record");
$this->fillDate($money_arr, $date_key, "price");
$data = [
'money_arr' => $money_arr,
'record_list' => $record_list,
];
return $data;
}
/**
* 补全没有数据的月份,让他们显示为空数组
* @param Collection $data
* @param $date_key
* @param $type price = 月收入数据的补全; record = 详细数据的补全
* @return void
*/
private function fillDate(Collection &$data, $date_key, $type)
{
$all_date = $this->monthRange($date_key[1], $date_key[0]);
//月份差,获得缺少的月份
$diff_date = array_diff($all_date, $data->keys()->all());
foreach ($diff_date as $date){
if($type == 'price'){
$data[$date] = [
"income" => 0,
"expend" => 0,
];
}else{
$data[$date] = [];
}
}
//根据时间倒序
$data = $data->sortByDesc(function ($record, $date){
return strtotime($date);
});
}
/**
* 根据开始到结束得出全部月份
* @param $start
* @param $end
* @return array
*/
private function monthRange($start, $end)
{
$start = date('Y-m',$start); // 转换为月
$range = [];
$i = 0;
do {
$month = date('Y-m', strtotime(date('Y-m',$end) . ' + ' . $i . ' month'));
//echo $i . ':' . $month . '<br>';
$range[] = $month;
$i++;
} while ($month < $start);
return $range;
}
/**
* 获取分组的第一个月和最后一个月的日期
* @param $record_list
* @return array|void
*/
private function getDateKey($record_list)
{
$date = $record_list->keys();
if($record_list->isEmpty()){
return;
}
if($date->count() > 1){
return [
strtotime($date->last()),
strtotime("$date[0] +1 month -1 day") + 86399,
];
}else{
return [
strtotime("$date[0]"),
strtotime("$date[0] +1 month -1 day") + 86399,
];
}
}
}