Files
xk-api-yii/admin/models/forms/statistics/DataForm.php

344 lines
13 KiB
PHP
Raw Normal View History

2024-09-19 11:32:39 +08:00
<?php
namespace admin\models\forms\statistics;
use admin\exceptions\ApiException;
use common\models\Goods;
use common\models\GoodsWarehouse;
2024-12-19 19:20:27 +08:00
use common\models\oldDb\Order;
use common\models\oldDb\OrderRefund;
use common\models\oldDb\User;
2024-09-19 11:32:39 +08:00
use common\models\OrderDetail;
use yii\base\Model;
class DataForm extends Model
{
public $date_start;
public $date_end;
public $mch_id;
public $name;
public $goods_order;
public $user_order;
public $sign = 'all';//给默认值,后台统计没有传该值
public $status;
public $page;
public $limit;
public $flag;
public $fields;
public $type;
public function rules()
{
return [
[['flag', 'goods_order', 'user_order', 'name', 'sign', 'type'], 'string'],
[['page', 'limit'], 'integer'],
[['page',], 'default', 'value' => 1],
[['status',], 'default', 'value' => -1],
[['date_start', 'date_end', 'fields'], 'trim'],
// [['mch_per',], 'default', 'value' => false],
];
}
public function init()
{
parent::init(); // TODO: Change the autogenerated stub
}
protected function get_all_data()
{
//以下随时间查询改变
$order_query = Order::find()->alias('o')->where(['o.is_recycle' => 0, 'o.is_delete' => 0])
->andWhere(['not', ['o.cancel_status' => 1]]);
if(\Yii::$app->mallId){
$order_query->andWhere(['o.mall_id' => \Yii::$app->mallId]);
}
//插件分类查询
if ($this->sign == 'all') {
} else if ($this->sign == 'mall') {
$order_query->andWhere(['o.sign' => '']);
} else {
$order_query->andWhere(['o.sign' => $this->sign]);
}
$wait_query = clone $order_query;
$data_arr['wait_send_num'] = $wait_query->andWhere(['is_send' => 0])
->andWhere(['or', ['o.is_pay' => 1], ['o.pay_type' => 2]])
->andWhere(['o.cancel_status' => 0, 'o.sale_status' => 0])
->count();
$refund_query = OrderRefund::find()->where([
'status' => 1,
'is_delete' => 0
]);
if(\Yii::$app->mallId){
$refund_query->andWhere(['mall_id' => \Yii::$app->mallId,]);
}
$data_arr['wait_refund_num'] = $refund_query->count();
return $data_arr;
}
//经营概况
public function data_search()
{
if (!$this->validate()) {
throw new ApiException(implode(",",$this->getFirstErrors()));
}
$arr_list = [];
//订单数据
$arr_list['total_data'] = $this->today_order_data();
//wait数据
$arr_list['wait_data'] = $this->get_all_data();
return $arr_list;
}
/**
* 销量排行榜
*/
public function sales_top()
{
$this->goods_order = 'num DESC';
$goods_query = Order::find()->alias('o')
->where([ 'o.is_recycle' => 0, 'o.is_delete' => 0])->andWhere(['not', ['o.cancel_status' => 1]])
->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id = o.id')
->leftJoin(['g' => Goods::tableName()], 'g.id = od.goods_id')
->leftJoin(['gw' => GoodsWarehouse::tableName()], 'g.goods_warehouse_id = gw.id');
if(\Yii::$app->mallId){
$goods_query->andWhere(['g.mall_id' => \Yii::$app->mallId,]);
}
//排序
$goods_query->orderBy('num DESC,g.goods_warehouse_id');
$goods_query->select("COALESCE(SUM(od.`num`),0) AS `num`,gw.brand,gw.name")
->groupBy('g.goods_warehouse_id');
$goods_query_2 = clone $goods_query;
$week_top_list = $goods_query
->andWhere(['>=', 'od.created_at', strtotime(date('Y-m-d',strtotime('-7 day')) . ' 00:00:00')])
->andWhere(['<=', 'od.created_at', strtotime(date('Y-m-d') . ' 23:59:59')])
->limit(10)
->asArray()
->all();
$mouth_top_list = $goods_query_2
->andWhere(['>=', 'od.created_at', strtotime(date('Y-m-d',strtotime('-30 day')) . ' 00:00:00')])
->andWhere(['<=', 'od.created_at', strtotime(date('Y-m-d') . ' 23:59:59')])
->limit(10)
->asArray()
->all();
return [
'week_top_list' => $week_top_list,
'mouth_top_list' => $mouth_top_list
];
}
public function table_search()
{
if (!$this->validate()) {
throw new ApiException(implode(",",$this->getFirstErrors()));
}
$query = $this->table_where();
$query->select("FROM_UNIXTIME(`o`.`created_at`, '%Y-%m-%d') AS `time`,
COALESCE(COUNT(DISTINCT `o`.`id`),0) AS `order_num`,SUM(`o`.`total_pay_price`) AS `total_pay_price`");
//时间查询
if ($this->date_start) {
$query->andWhere(['>=', 'o.created_at', strtotime($this->date_start . ' 00:00:00')]);
}
if ($this->date_end) {
$query->andWhere(['<=', 'o.created_at', strtotime($this->date_end . ' 23:59:59')]);
}
$list = $query->groupBy('time')
->orderBy('time')->asArray()->all();
$day = floor((strtotime($this->date_end) - strtotime($this->date_start)) / 86400) + 1;
for ($i = 0; $i < $day; $i++) {
$date = date('Y-m-d', strtotime("-$i day",strtotime($this->date_end)));
$bool = false;
foreach ($list as $item) {
if ($date == $item['time']) {
$bool = true;
$arr[$i]['created_at'] = $item['time'];
$arr[$i]['order_num'] = $item['order_num'];
$arr[$i]['total_pay_price'] = $item['total_pay_price'];
}
}
if (!$bool) {
$arr[$i]['created_at'] = $date;
$arr[$i]['order_num'] = '0';
$arr[$i]['total_pay_price'] = '0.00';
}
}
$list = !empty($arr) ? array_reverse($arr) : [];
return $list;
}
protected function table_where()
{
$orderQuery = OrderDetail::find()->alias('od')->where(['is_delete' => 0])
->select(['od.order_id', 'SUM(`od`.`num`) num'])->groupBy('od.order_id');
//时间查询
if ($this->date_start) {
$orderQuery->andWhere(['>=', 'od.created_at', strtotime($this->date_start . ' 00:00:00')]);
}
if ($this->date_end) {
$orderQuery->andWhere(['<=', 'od.created_at', strtotime($this->date_end . ' 23:59:59')]);
}
$query = Order::find()->alias('o')
->where(['o.is_recycle' => 0, 'o.is_pay' => 1])
->andWhere(['o.is_delete' => 0])->andWhere(['not', ['o.cancel_status' => 1]])
->leftJoin(['d' => $orderQuery], 'd.order_id = o.id');
// ->leftJoin(['d' => OrderDetail::tableName()], 'd.order_id = o.id');
if(\Yii::$app->mallId){
$query->andWhere(['o.mall_id' => \Yii::$app->mallId]);
}
//插件分类查询
if ($this->sign == 'all') {
} else if ($this->sign == 'mall') {
$query->andWhere(['o.sign' => '']);
} else {
$query->andWhere(['o.sign' => $this->sign]);
}
return $query;
}
protected function goods_where()
{
$query = Order::find()->alias('o')
->where(['o.is_recycle' => 0, 'o.is_delete' => 0])->andWhere(['not', ['o.cancel_status' => 1]])
->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id = o.id and od.is_refund = 0')//过滤退款
->leftJoin(['g' => Goods::tableName()], 'g.id = od.goods_id');
//时间查询
if ($this->date_start) {
$query->andWhere(['>=', 'od.created_at', $this->date_start . ' 00:00:00']);
}
if ($this->date_end) {
$query->andWhere(['<=', 'od.created_at', $this->date_end . ' 23:59:59']);
}
if(\Yii::$app->mallId){
$query->andWhere(['g.mall_id' => \Yii::$app->mallId, ]);
}
//排序
$query->orderBy((!empty($this->goods_order) ? $this->goods_order : 'total_price DESC') . ',g.goods_warehouse_id');
return $query;
}
public function today_order_data()
{
$this->date_start = date('Y-m-d',time());
$this->date_end = date('Y-m-d',time());
$order_query = $this->table_where();
$order_query->select("COALESCE(COUNT(DISTINCT `o`.`id`),0) AS `order_num`,
COALESCE(SUM(`o`.`total_pay_price`),0) AS `total_pay_price`");
//比较昨日
$list_1 = [
'order_num' => 0,
'total_pay_price' => 0,
];
$order_query_1 = clone $order_query;
$order_query_1->andWhere(['>=', 'o.created_at', strtotime(date('Y-m-d', strtotime('-1 day')) . ' 00:00:00')]);
$order_query_1->andWhere(['<=', 'o.created_at', strtotime(date('Y-m-d', strtotime('-1 day')) . ' 23:59:59')]);
$list_1 = $order_query_1->asArray()->one();
//比较上周的这一日
$list_2 = [
'order_num' => 0,
'total_pay_price' => 0,
];
$order_query_2 = clone $order_query;
$order_query_2->andWhere(['>=', 'o.created_at', strtotime(date('Y-m-d', strtotime('-7 day')) . ' 00:00:00')]);
$order_query_2->andWhere(['<=', 'o.created_at', strtotime(date('Y-m-d', strtotime('-7 day')) . ' 23:59:59')]);
$list_2 = $order_query_2->asArray()->one();
//时间查询
if ($this->date_start) {
$order_query->andWhere(['>=', 'o.created_at', strtotime($this->date_start . ' 00:00:00')]);
}
if ($this->date_end) {
$order_query->andWhere(['<=', 'o.created_at', strtotime($this->date_end . ' 23:59:59')]);
}
$list = $order_query->asArray()->one();
//------------------------------------------------------------------------
$user_query = User::find();
//比较昨日
$user_num_1 = 0;
$user_query_1 = clone $user_query;
$user_query_1->andWhere(['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-1 day')) . ' 00:00:00')]);
$user_query_1->andWhere(['<=', 'created_at', strtotime(date('Y-m-d', strtotime('-1 day')) . ' 23:59:59')]);
$user_num_1 = $user_query_1->count();
//比较上周的这一日
$user_num_2 = 0;
$user_query_2 = clone $user_query;
$user_query_2->andWhere(['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-7 day')) . ' 00:00:00')]);
$user_query_2->andWhere(['<=', 'created_at', strtotime(date('Y-m-d', strtotime('-7 day')) . ' 23:59:59')]);
$user_num_2 = $user_query_2->count();
if ($this->date_start) {
$user_query->andWhere(['>=', 'created_at', strtotime($this->date_start . ' 00:00:00')]);
}
if ($this->date_end) {
$user_query->andWhere(['<=', 'created_at', strtotime($this->date_end . ' 23:59:59')]);
}
$user_num = $user_query->count();
//------------------------------------------------------------------------
$yestoday = [];
$yestoday['order_num_status'] = empty($list_1) || $list['order_num'] > $list_1['order_num'] ? 'up' : ($list['order_num'] < $list_1['order_num'] ? 'down' : 'equal');
$yestoday['order_num_abs'] = abs($list['order_num']-$list_1['order_num']);
$yestoday['total_pay_price_status'] = empty($list_1) || $list['total_pay_price'] > $list_1['total_pay_price'] ? 'up' : ($list['total_pay_price'] < $list_1['total_pay_price'] ? 'down' : 'equal');
$yestoday['total_pay_price_abs'] = abs($list['total_pay_price']-$list_1['total_pay_price']);
$yestoday['user_num_status'] = $user_num > $user_num_1 ? 'up' : ($user_num < $user_num_1 ? 'down' : 'equal');
$yestoday['user_num_abs'] = abs($user_num-$user_num_1);
$lastweek = [];
$lastweek['order_num_status'] = empty($list_2) || $list['order_num'] > $list_2['order_num'] ? 'up' : ($list['order_num'] < $list_2['order_num'] ? 'down' : 'equal');
$lastweek['order_num_abs'] = abs($list['order_num']-$list_2['order_num']);
$lastweek['total_pay_price_status'] = empty($list_2) || $list['total_pay_price'] > $list_2['total_pay_price'] ? 'up' : ($list['total_pay_price'] < $list_2['total_pay_price'] ? 'down' : 'equal');
$lastweek['total_pay_price_abs'] = abs(bcsub($list['total_pay_price'],$list_2['total_pay_price'],2));
$lastweek['user_num_status'] = $user_num > $user_num_2 ? 'up' : ($user_num < $user_num_2 ? 'down' : 'equal');
$lastweek['user_num_abs'] = abs($user_num-$user_num_2);
$list['user_num'] = $user_num;
return [
'today' => $list,
'yestoday' => $yestoday,
'lastweek' => $lastweek
];
}
}