You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
7.9 KiB
256 lines
7.9 KiB
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
|
|
// +----------------------------------------------------------------------
|
|
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
|
|
// +----------------------------------------------------------------------
|
|
// | Author: 萤火科技 <admin@yiovo.com>
|
|
// +----------------------------------------------------------------------
|
|
declare (strict_types=1);
|
|
|
|
namespace app\store\service;
|
|
|
|
use app\common\library\helper;
|
|
use app\common\service\BaseService;
|
|
use app\store\model\User as UserModel;
|
|
use app\store\model\Goods as GoodsModel;
|
|
use app\store\model\Order as OrderModel;
|
|
use app\store\model\OrderRefund as OrderRefundModel;
|
|
|
|
/**
|
|
* 商户数据服务类
|
|
* Class Store
|
|
* @package app\store\service
|
|
*/
|
|
class Home extends BaseService
|
|
{
|
|
/* @var GoodsModel $GoodsModel */
|
|
private GoodsModel $GoodsModel;
|
|
|
|
/* @var OrderModel $GoodsModel */
|
|
private OrderModel $OrderModel;
|
|
|
|
/* @var UserModel $GoodsModel */
|
|
private UserModel $UserModel;
|
|
|
|
/**
|
|
* 构造方法
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
/* 初始化模型 */
|
|
$this->GoodsModel = new GoodsModel;
|
|
$this->OrderModel = new OrderModel;
|
|
$this->UserModel = new UserModel;
|
|
}
|
|
|
|
/**
|
|
* 后台首页数据
|
|
* @return array
|
|
*/
|
|
public function getData(array $params = []): array
|
|
{
|
|
// 今天的日期
|
|
$today = date('Y-m-d');
|
|
// 昨天的日期
|
|
$yesterday = date('Y-m-d', strtotime('-1 day'));
|
|
// 最近七天日期
|
|
$lately7days = $this->getLately7days();
|
|
$data = [
|
|
// 实时概况
|
|
'overview' => [
|
|
// 销售额(元)
|
|
'orderTotalPrice' => [
|
|
'tday' => $this->getOrderTotalPrice($today),
|
|
'ytd' => $this->getOrderTotalPrice($yesterday)
|
|
],
|
|
// 支付订单数
|
|
'orderTotal' => [
|
|
'tday' => $this->getPayOrderTotal($today),
|
|
'ytd' => $this->getPayOrderTotal($yesterday)
|
|
],
|
|
// 新增会员数
|
|
'newUserTotal' => [
|
|
'tday' => $this->getUserTotal($today),
|
|
'ytd' => $this->getUserTotal($yesterday)
|
|
],
|
|
// 付款会员数
|
|
'consumeUserTotal' => [
|
|
'tday' => $this->getPayOrderUserTotal($today),
|
|
'ytd' => $this->getPayOrderUserTotal($yesterday)
|
|
]
|
|
],
|
|
// 数据统计
|
|
'statistics' => [
|
|
// 商品总数量
|
|
'goodsTotal' => $this->getGoodsTotal($params['storeInfo']),
|
|
//上架商品总数
|
|
'getGoodsGroundingTotal' => $this->getGoodsGroundingTotal($params['storeInfo']),
|
|
// 会员总人数
|
|
'userTotal' => $this->getUserTotal(),
|
|
// 付款订单总量
|
|
'orderTotal' => $this->getPayOrderTotal(),
|
|
// 消费总人数
|
|
'consumeUserTotal' => $this->getUserTotal(null, true)
|
|
],
|
|
// 待办事项
|
|
'pending' => [
|
|
// 待发货订单
|
|
'deliverOrderTotal' => $this->getNotDeliveredOrderTotal(),
|
|
// 待处理售后单
|
|
'refundTotal' => $this->getRefundTotal(),
|
|
// 待付款订单(笔)
|
|
'paidOrderTotal' => $this->getNotPayOrderTotal(),
|
|
// 已售罄商品数量
|
|
'soldoutGoodsTotal' => $this->getSoldoutGoodsTotal()
|
|
],
|
|
// 交易走势
|
|
'tradeTrend' => [
|
|
// 最近七天日期
|
|
'date' => $lately7days,
|
|
'orderTotal' => $this->getOrderTotalByDate($lately7days),
|
|
'orderTotalPrice' => $this->getOrderTotalPriceByDate($lately7days)
|
|
]
|
|
];
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 最近七天日期
|
|
*/
|
|
private function getLately7days(): array
|
|
{
|
|
// 获取当前周几
|
|
$date = [];
|
|
for ($i = 0; $i < 7; $i++) {
|
|
$date[] = date('Y-m-d', strtotime('-' . $i . ' days'));
|
|
}
|
|
return array_reverse($date);
|
|
}
|
|
|
|
/**
|
|
* 获取商品总量
|
|
* @return string
|
|
*/
|
|
private function getGoodsTotal(array $storeInfo = []): string
|
|
{
|
|
$storeIds = [$storeInfo['store_id']];
|
|
if (isset($storeInfo['p_store_id']) && $storeInfo['p_store_id']) {
|
|
$storeIds[] = $storeInfo['p_store_id'];
|
|
}
|
|
|
|
$where[] = ['store_id', 'in', $storeIds];
|
|
return number_format($this->GoodsModel->getGoodsTotal($where));
|
|
}
|
|
/**
|
|
* 获取商品已上架总量
|
|
* @return string
|
|
*/
|
|
private function getGoodsGroundingTotal(array $storeInfo = []): string
|
|
{
|
|
$storeIds = [$storeInfo['store_id']];
|
|
if (isset($storeInfo['p_store_id']) && $storeInfo['p_store_id']) {
|
|
$storeIds[] = $storeInfo['p_store_id'];
|
|
}
|
|
|
|
$where[] = ['store_id', 'in', $storeIds];
|
|
return number_format($this->GoodsModel->getGoodsGroundingTotal($where));
|
|
}
|
|
|
|
/**
|
|
* 会员总人数
|
|
* @param string|null $date 注册日期
|
|
* @param null $isConsume 是否已消费
|
|
* @return string
|
|
*/
|
|
private function getUserTotal(string $date = null, $isConsume = null): string
|
|
{
|
|
return number_format($this->UserModel->getUserTotal(compact('date', 'isConsume')));
|
|
}
|
|
|
|
/**
|
|
* 获取已付款订单总量 (批量)
|
|
* @param array $days
|
|
* @return array
|
|
*/
|
|
private function getOrderTotalByDate(array $days): array
|
|
{
|
|
$data = [];
|
|
foreach ($days as $day) {
|
|
$data[] = $this->getPayOrderTotal($day);
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 获取订单总金额(指定日期)
|
|
* @param string|null $day
|
|
* @return string
|
|
*/
|
|
private function getOrderTotalPrice(string $day = null): string
|
|
{
|
|
return helper::number2($this->OrderModel->getOrderTotalPrice($day, $day));
|
|
}
|
|
|
|
/**
|
|
* 获取订单总金额 (批量)
|
|
* @param array $days
|
|
* @return array
|
|
*/
|
|
private function getOrderTotalPriceByDate(array $days): array
|
|
{
|
|
$data = [];
|
|
foreach ($days as $day) {
|
|
$data[] = $this->getOrderTotalPrice($day);
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 获取某天的下单用户数
|
|
* @param string $day
|
|
* @return string
|
|
*/
|
|
private function getPayOrderUserTotal(string $day)
|
|
{
|
|
return number_format($this->OrderModel->getPayOrderUserTotal($day));
|
|
}
|
|
|
|
/**
|
|
* 获取订单总量
|
|
* @param string|null $day
|
|
* @return string
|
|
*/
|
|
private function getPayOrderTotal(string $day = null): string
|
|
{
|
|
return number_format($this->OrderModel->getPayOrderTotal($day, $day));
|
|
}
|
|
|
|
// 获取未发货订单数量
|
|
private function getNotDeliveredOrderTotal(): string
|
|
{
|
|
return number_format($this->OrderModel->getNotDeliveredOrderTotal());
|
|
}
|
|
|
|
// 获取未付款订单数量
|
|
private function getNotPayOrderTotal(): string
|
|
{
|
|
return number_format($this->OrderModel->getNotPayOrderTotal());
|
|
}
|
|
|
|
// 获取已售罄的商品
|
|
private function getSoldoutGoodsTotal(): string
|
|
{
|
|
return number_format($this->GoodsModel->getSoldoutGoodsTotal());
|
|
}
|
|
|
|
// 获取待处理售后单数量
|
|
private function getRefundTotal(): string
|
|
{
|
|
$model = new OrderRefundModel;
|
|
return number_format($model->getRefundTotal());
|
|
}
|
|
}
|
|
|