207 lines
6.2 KiB
PHP
Executable File
207 lines
6.2 KiB
PHP
Executable File
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | likeadmin快速开发前后端分离管理后台(PHP版)
|
||
// +----------------------------------------------------------------------
|
||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||
// | 开源版本可自由商用,可去除界面版权logo
|
||
// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
|
||
// | github下载:https://github.com/likeshop-github/likeadmin
|
||
// | 访问官网:https://www.likeadmin.cn
|
||
// | likeadmin团队 版权所有 拥有最终解释权
|
||
// +----------------------------------------------------------------------
|
||
// | author: likeadminTeam
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace app\common\model;
|
||
|
||
use app\common\model\dict\DictData;
|
||
use app\common\service\FileService;
|
||
use think\Model;
|
||
|
||
/**
|
||
* 基础模型
|
||
* Class BaseModel
|
||
* @package app\common\model
|
||
*/
|
||
class BaseModel extends Model
|
||
{
|
||
/**
|
||
* @notes 公共处理图片,补全路径
|
||
* @param $value
|
||
* @return string
|
||
* @author 张无忌
|
||
* @date 2021/9/10 11:02
|
||
*/
|
||
public function getImageAttr($value)
|
||
{
|
||
return trim($value) ? FileService::getFileUrl($value) : '';
|
||
}
|
||
|
||
/**
|
||
* @notes 公共图片处理,去除图片域名
|
||
* @param $value
|
||
* @return mixed|string
|
||
* @author 张无忌
|
||
* @date 2021/9/10 11:04
|
||
*/
|
||
public function setImageAttr($value)
|
||
{
|
||
return trim($value) ? FileService::setFileUrl($value) : '';
|
||
}
|
||
|
||
public function getAnnexAttr($value)
|
||
{
|
||
return !empty($value) ? json_decode($value, true) : '';
|
||
}
|
||
|
||
public function getApproveCheckStatusTextAttr($value, $data)
|
||
{
|
||
$dict = DictData::where('type_value', 'check_status')->column('name', 'value');
|
||
return !empty($data['approve_check_status']) ? $dict[$data['approve_check_status']] : '待审核';
|
||
}
|
||
/**
|
||
* 统计sum
|
||
*/
|
||
public function statistics($where, $time, string $selectType, string $group = "", $sum = '')
|
||
{
|
||
switch ($selectType) {
|
||
case "sum":
|
||
$totalMoney = $this->where($where)->when(isset($time), function ($query) use ($time) {
|
||
$query->whereBetweenTime('create_time', strtotime($time['start_time']), strtotime($time['end_time']));
|
||
})->sum($sum);
|
||
break;
|
||
case "group":
|
||
$totalMoney = $this->getCurveData($where, $time, "sum($sum)", $group);
|
||
break;
|
||
default:
|
||
throw new \Exception($this->name . ':selectType参数错误');
|
||
}
|
||
|
||
if ($group) {
|
||
$totalMoney = $this->trendYdata((array)$totalMoney, $time);
|
||
}
|
||
return $totalMoney;
|
||
}
|
||
/**
|
||
* 统计count
|
||
*/
|
||
public function statistics_count($where, $time, string $selectType, string $group = "",)
|
||
{
|
||
switch ($selectType) {
|
||
case "sum":
|
||
$totalMoney = $this->where($where)->when(isset($time), function ($query) use ($time) {
|
||
$query->whereBetweenTime('create_time', strtotime($time['start_time']), strtotime($time['end_time']));
|
||
})->count();
|
||
break;
|
||
case "group":
|
||
$totalMoney = $this->getCurveData($where, $time, "count(id)", $group);
|
||
break;
|
||
default:
|
||
throw new \Exception($this->name . ':selectType参数错误');
|
||
}
|
||
|
||
if ($group) {
|
||
$totalMoney = $this->trendYdata((array)$totalMoney, $time);
|
||
}
|
||
return $totalMoney;
|
||
}
|
||
/**
|
||
* 曲线统计
|
||
* @param $time
|
||
* @param $type
|
||
* @param $timeType
|
||
* @return mixed
|
||
*/
|
||
public function getCurveData($where, $time, $str, string $group = 'create_time')
|
||
{
|
||
return $this->where($where)
|
||
->when(isset($time), function ($query) use ($time, $str, $group) {
|
||
$query->whereBetweenTime($group, $time['start_time'], $time['end_time']);
|
||
if ($time['days'] == 1) {
|
||
$timeUinx = "%H";
|
||
} elseif ($time['days'] == 30) {
|
||
$timeUinx = "%Y-%m-%d";
|
||
} elseif ($time['days'] == 365) {
|
||
$timeUinx = "%Y-%m";
|
||
} elseif ($time['days'] > 1 && $time['days'] < 30) {
|
||
$timeUinx = "%Y-%m-%d";
|
||
} elseif ($time['days'] > 30 && $time['days'] < 365) {
|
||
$timeUinx = "%Y-%m";
|
||
} else {
|
||
$timeUinx = "%Y-%m";
|
||
}
|
||
$query->field("$str as number,FROM_UNIXTIME($group, '$timeUinx') as time");
|
||
$query->group("FROM_UNIXTIME($group, '$timeUinx')");
|
||
})
|
||
->order("$group ASC")->select()->toArray();
|
||
}
|
||
|
||
/**
|
||
* 处理Y坐标数据
|
||
* @param array $data
|
||
* @param array $timeKey
|
||
* @return array
|
||
* @throws \Exception
|
||
*/
|
||
public function trendYdata(array $data, array $timeKey)
|
||
{
|
||
$hourMoney = array();
|
||
$timeData = array();
|
||
//获取日期之间的天数
|
||
$getDayRange = function ($date, $timeKey) {
|
||
$datearr = [];
|
||
$stime = strtotime($timeKey['start_time']);
|
||
$etime = strtotime($timeKey['end_time']);
|
||
while ($stime <= $etime) {
|
||
$datearr['x'][] = date($date, $stime);
|
||
$datearr['y'][] = date($date, $stime);
|
||
$stime = $stime + 86400;
|
||
}
|
||
return $datearr;
|
||
};
|
||
//获取日期之间的月份
|
||
$getMonthRange = function ($date, $timeKey) {
|
||
$datearr = [];
|
||
$stime = date('Y-m-d', strtotime($timeKey['start_time']));
|
||
$etime = date('Y-m-d', strtotime($timeKey['end_time']));
|
||
$start = new \DateTime($stime);
|
||
$end = new \DateTime($etime);
|
||
$interval = \DateInterval::createFromDateString('1 month');
|
||
$period = new \DatePeriod($start, $interval, $end);
|
||
foreach ($period as $dt) {
|
||
$datearr['x'][] = $dt->format($date);
|
||
$datearr['y'][] = $dt->format($date);
|
||
}
|
||
return $datearr;
|
||
};
|
||
if ($timeKey['days'] == 1) {
|
||
for ($i = 0; $i <= 24; $i++) {
|
||
$timeData['x'][] = (string)($i < 10 ? ('0' . $i) : $i);
|
||
$timeData['y'][] = $i < 10 ? ('0' . $i) : $i;
|
||
//$timeData['y'][] = $i < 10 ? ('0' . $i . ":00") : $i . ":00";
|
||
//$timeData['x'][] = $i < 10 ? ('0' . $i . ":00") : $i . ":00";
|
||
}
|
||
} elseif ($timeKey['days'] == 30) {
|
||
$timeData = $getDayRange('Y-m-d', $timeKey);
|
||
} elseif ($timeKey['days'] == 365) {
|
||
$timeData = $getMonthRange('Y-m', $timeKey);
|
||
} elseif ($timeKey['days'] > 1 && $timeKey['days'] < 30) {
|
||
$timeData = $getDayRange('Y-m-d', $timeKey);
|
||
} elseif ($timeKey['days'] > 30 && $timeKey['days'] < 365) {
|
||
$timeData = $getMonthRange('Y-m', $timeKey);
|
||
}
|
||
if ($data) {
|
||
$hourMoney = array_column($data, 'number', 'time');
|
||
}
|
||
$y = array();
|
||
foreach ($timeData['y'] as $k => $v) {
|
||
if (array_key_exists($v, $hourMoney)) {
|
||
$y[$v] = $hourMoney[$v];
|
||
} else {
|
||
$y[$v] = 0;
|
||
}
|
||
}
|
||
return ['x' => $timeData['x'], 'y' => $y];
|
||
}
|
||
}
|