<?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\admin\controller;

use app\admin\lists\statistics\StoreProductLists;
use app\admin\lists\store_order_cart_info\StoreOrderCartInfoGroupLists;
use app\admin\lists\store_order_cart_info\StoreOrderCartInfoGroupMonthLists;
use app\admin\lists\warehouse_product_storege\WarehouseProductStoregeTwoLists;
use app\admin\logic\statistic\ProductStatisticLogic;
use app\admin\logic\statistic\TradeStatisticLogic;
use app\admin\logic\statistic\UserStatisticLogic;
use app\admin\logic\statistic\WarehouseLogic;
use app\admin\logic\WorkbenchLogic;
use app\store\logic\WorkbenchLogic as LogicWorkbenchLogic;
use DateInterval;
use DateTime;

/**
 * 工作台
 * Class WorkbenchCotroller
 * @package app\admin\controller
 */
class WorkbenchController extends BaseAdminController
{

    /**
     * @notes 工作台
     * @author 乔峰
     * @date 2021/12/29 17=>01
     */
    public function index()
    {
        $result = WorkbenchLogic::index();
        return $this->data($result);
    }
    /**
     * @notes 门店
     * @author 乔峰
     * @date 2021/12/29 17=>01
     */
    public function store_index()
    {
        $params = $this->request->get();
        if (!isset($params['store_id']) || $params['store_id'] == '') {
            $params['store_id'] = 0;
        }
        if (!isset($params['start_time']) || $params['start_time'] == '') {
            $time = explode('-', $this->getDay(''));
            $params['start_time'] = $time[0];
            $params['end_time'] = $time[1];
        }

        $result = LogicWorkbenchLogic::index($params);
        return $this->data($result);
    }
    /**
     * @notes 工作台
     * @author 乔峰
     * @date 2021/12/29 17=>01
     */
    public function store_index_new()
    {
        $params['store_id'] = $this->request->adminInfo['store_id'];
        $result = WorkbenchLogic::index($params);
        return $this->data($result);
    }

    //-------------------------------商品统计---------------------------------------//

    /**
     * 商品概况
     */
    public function get_basic()
    {
        $startTime = $this->request->get('start_time'); //开始时间
        $endTime = $this->request->get('end_time'); //结束时间
        if (empty($startTime)) { //如果没有传开始时间,则默认获取最近7天的数据
            $startTime = strtotime(date('Y-m-d'));
            $endTime = $startTime + 86400;
        }
        $where = [
            ['create_time', 'between', [$startTime, $endTime]]
        ];
        $data = WorkbenchLogic::get_basic($where);
        return $this->data($data);
    }

    /**
     * 商品趋势
     */
    public function get_trend()
    {
        $dates = [];
        $date = $this->request->get('date', '');
        $days = 31;
        if ($date) {
            $arr = explode('-', $date);
            if ($arr[0] == $arr[1]) {
                $date = new DateTime($arr[0]);
                $dates[] = $date->format("Y-m-d");
            } else {
                $datetime_start = new DateTime($arr[0]);
                $datetime_end = new DateTime($arr[1]);
                $days = $datetime_start->diff($datetime_end)->days;
                for ($i = 0; $i <= $days; $i++) {
                    $date = new DateTime($datetime_start->format('Y-m-d'));
                    $date->modify('+' . $i . ' days');
                    $dates[] = $date->format('Y-m-d');
                }
            }
        } else {
            $today = new DateTime();
            $thirtyDaysAgo = new DateTime($today->format('Y-m-d'));
            $thirtyDaysAgo->modify('-30 days');
            for ($i = 0; $i < $days; $i++) {
                $date = new DateTime($thirtyDaysAgo->format('Y-m-d'));
                $date->modify('+' . $i . ' days');
                $dates[] = $date->format('Y-m-d');
            }
        }
        $data = [
            "xAxis" => $dates,
            "series" => [
                [
                    "name" => "商品浏览量",
                    "data" => WorkbenchLogic::store_visit_count($dates),
                    "type" => "line",
                    "smooth" => "true",
                    "yAxisIndex" => 1
                ],
                [
                    "name" => "商品访客量",
                    "data" => WorkbenchLogic::store_visit_user($dates),
                    "type" => "line",
                    "smooth" => "true",
                    "yAxisIndex" => 1
                ],
                [
                    "name" => "支付金额",
                    "data" => WorkbenchLogic::payPrice($dates),
                    "type" => "bar"
                ],
                [
                    "name" => "退款金额",
                    "data" => WorkbenchLogic::refundPrice($dates),
                    "type" => "bar"
                ]
            ]
        ];
        return $this->data($data);
    }

    /**
     * 获取商品排名数据
     */
    public function get_product_ranking()
    {
        $date = $this->request->get('date', '');
        $where['create_time'] = $this->getDay($date);
        $data = (new ProductStatisticLogic())->get_product_ranking($where);
        return $this->success('', $data);
    }

    //-------------------------------用户统计---------------------------------------//

    /**
     * 获取用户概况
     */
    public function get_user_basic()
    {
        $date = $this->request->get('date', '');
        $store_id = $this->request->get('store_id');
        $where['create_time'] = $this->getDay($date);
        if ($store_id) {
            $where['store_id'] = $store_id;
        }
        $data = (new UserStatisticLogic())->getBasic($where);
        return $this->data($data);
    }

    /**
     * 获取用户趋势
     */
    public function get_user_trend()
    {
        $date = $this->request->get('date', '');
        $store_id = $this->request->get('store_id');
        $where['create_time'] = $this->getDay($date);
        if ($store_id) {
            $where['store_id'] = $store_id;
        }
        $data = (new UserStatisticLogic())->getTrend($where);

        return $this->data($data);
    }
    //-------------------------------交易统计---------------------------------------//
    //当日订单金额
    public function top_trade()
    {
        $logic = (new TradeStatisticLogic());
        $leftToday = $logic->getTopLeftTrade(['create_time' => 'today']);
        $leftyestoday = $logic->getTopLeftTrade(['create_time' => 'yestoday']);
        $rightOne = $logic->getTopRightOneTrade();
        $rightTwo = $logic->getTopRightTwoTrade();
        $right = ['today' => $rightOne, 'month' => $rightTwo];
        $totalleft = [$leftToday, $leftyestoday];
        $left = [];
        foreach ($totalleft as $k => $v) {
            $left['name'] = "当日订单金额";
            $left['x'] = $v['curve']['x'];
            $left['series'][$k]['money'] = round($v['total_money'], 2);
            $left['series'][$k]['value'] = array_values($v['curve']['y']);
        }

        $data['left'] = $left;
        $data['right'] = $right;
        return $this->data($data);
    }

    //交易趋势
    public function bottom_trade()
    {
        $date = $this->request->get('date', '');
        $data = (new TradeStatisticLogic())->getBottomTrade(['data' => $this->getDay($date)]);
        return $this->data($data);
    }

    /**
     * 实时商品统计
     */
    public function product_order()
    {
        return $this->dataLists(new StoreOrderCartInfoGroupLists());
    }

    /**
     * 月销售商品统计
     */
    public function product_month_order()
    {
        return $this->dataLists(new StoreOrderCartInfoGroupMonthLists());
    }
    /**
     * 格式化时间
     * @param $time
     * @return string
     */
    public function getDay($time)
    {
        if (strstr($time, '-') !== false) {
            [$startTime, $endTime] = explode('-', $time);
            if (!$startTime && !$endTime) {
                return date("Y/m/d", strtotime("-30 days", time())) . '-' . date("Y/m/d", time());
            } else {
                if ($startTime == $endTime) {
                    return $startTime . '-' . $endTime . ' 23:59:59';
                } else {
                    return $startTime . '-' . $endTime;
                }
            }
        } else {
            return date("Y/m/d", strtotime("-30 days", time())) . '-' . date("Y/m/d", time());
        }
    }
    //-------------------------------统计仓库---------------------------------------//

    /**
     * 统计仓库头
     * @return array
     */
    public function total_warehouse()
    {
        $data = WarehouseLogic::total_warehouse();
        return $this->data($data);
    }

    /**
     * 统计仓库列表
     * @return array
     */
    public function warehouse_list()
    {
        return $this->dataLists(new StoreProductLists());
    }

    /**
     * 统计门店仓库总库存
     * @return array
     */
    public function total_warehouse_list()
    {
        $parmas = $this->request->get();
        $data = WarehouseLogic::total_warehouse_list($parmas, $parmas['type'] ?? 1);
        return $this->data($data);
    }

    /**
     * 统计门店仓库总库存
     * @return array
     */
    public function total_warehouse_product_list()
    {
        $parmas = $this->request->get();
        $data = WarehouseLogic::total_warehouse_product_list($parmas, $parmas['type'] ?? 1);
        return $this->data($data);
    }

    /**
     * 负库存检测
     */
    public function negative_inventory()
    {
        $parmas = $this->request->get();
        if($parmas['type'] == 3){
            return $this->dataLists(new WarehouseProductStoregeTwoLists());
        }
        $data = WarehouseLogic::negativeInventory($parmas);
        return $this->data($data);
    }

    /**
     * 负库存归零
     */
    public function update_negative_zero()
    {
        $parmas = $this->request->get();
        $res = WarehouseLogic::updateNegativeZero($parmas,$this->adminId);
        if($res){
            return $this->data([], '操作成功');
        }else{
            return $this->data([], '操作失败', 400);
        }
    }
    /**
     * 更新库存和价值
     */
    public function stock_product_price()
    {
        $parmas = $this->request->get();
        $res = WarehouseLogic::stockProductPrice($parmas);
        if($res){
            return $this->success('操作成功,请刷新页面',[],1,1);
        }else{
            return $this->fail('操作失败');
        }
    }
}