<?php

namespace Shop\Lib;

use Dever;

class Cron
{
    # 定时更新店铺经纬度
    public function geo_api()
    {
        Dever::config('base')->hook = true;
        $shop = Dever::db('shop/info')->select();
        if ($shop) {
            foreach ($shop as $k => $v) {
                $temp = explode(',', $v['area']);
                if (isset($temp[1]) && $v['address']) {
                    $geo = Dever::load('shop/lib/info')->geo($temp[1], $v['address']);
                    $update['lng'] = $geo[0];
                    $update['lat'] = $geo[1];
                    $update['map'] = $geo[2];
                    $update['coord_address'] = $v['address'];
                    $update['where_id'] = $v['id'];
                    Dever::db('shop/info')->update($update);
                }
            }
        }

        return 'ok';
    }

    # 同步退款状态
    public function refund_status_api()
    {
        $order = Dever::db('shop/sell_order')->select();

        foreach ($order as $k => $v) {
            if ($v['refund_cash'] > 0) {
                if ($v['status'] == 6 || $v['status'] == 8) {
                    $status = 4;
                } else {
                    $status = 3;
                }
            } elseif ($v['refund_status'] == 2) {
                $status = 2;
            } else {
                $status = 1;
            }

            Dever::db('shop/sell_order')->update(array('where_id' => $v['id'], 'refund_status' => $status));
        }

        $order = Dever::db('shop/buy_order')->select();

        foreach ($order as $k => $v) {
            if ($v['refund_cash'] > 0) {
                if ($v['status'] == 6 || $v['status'] == 8) {
                    $status = 4;
                } else {
                    $status = 3;
                }
            } elseif ($v['refund_status'] == 2) {
                $status = 2;
            } else {
                $status = 1;
            }

            Dever::db('shop/buy_order')->update(array('where_id' => $v['id'], 'refund_status' => $status));
        }
    }

    # 获取7天后完成的订单 准备分账
    public function yspay_api()
    {
        $day = Dever::input('day', 7);
        $time = time();
        $where['status'] = '5,6';
        $where['withdraw'] = 1;
        $where['cdate'] = $time - $day*86400;
        $order = Dever::db('shop/sell_order')->getDataByTime($where);

        if ($order) {
            foreach ($order as $k => $v) {
                $this->yspayOne($v);
            }
        }
    }

    public function yspayOne($v)
    {
        $shop = Dever::db('shop/info')->find($v['shop_id']);
        if ($v['withdraw'] == 1 && $shop && $shop['mid'] && $shop['status'] == 1) {

            if ($v['refund_cash']) {
                $v['price'] -= $v['refund_cash'];
                $v['price'] = round($v['price'], 2);
            }
            $cash = $v['price'] * 100;//之后还要加上礼品卡的钱
            Dever::load('shop/yspay')->action($shop['mid'], $v['order_num'], $v['id'], 2, $cash);
        }
    }


    public function setGoodsStatus_api()
    {
        $goods = Dever::db('goods/info')->select();
        if ($goods) {
            foreach ($goods as $k => $v) {
                Dever::db('shop/goods')->updates(array('option_goods_id' => $v['id'], 'set_status' => $v['status']));
                Dever::db('store/goods')->updates(array('option_goods_id' => $v['id'], 'set_status' => $v['status']));
                Dever::db('factory/goods')->updates(array('option_goods_id' => $v['id'], 'set_status' => $v['status']));
            }
        }
    }

    /**
     * 处理优惠券到期时间
     *
     * @return mixed
     */
    public function coupon_api()
    {
        $coupon = Dever::db('shop/user_coupon')->getAll(array('status' => 1, 'edate' => time() - 86400));

        if ($coupon && Dever::project('message')) {
            foreach ($coupon as $k => $v) {
                $coupon_info = Dever::db('goods/coupon')->find($v['coupon_id']);
                $msg = $coupon_info['name'] . ",要到期啦!";
                $msg_param['type'] = 2;//消息类型2是优惠券
                $msg_param['id'] = $v['id'];
                $msg_param['coupon_id'] = $v['coupon_id'];
                $msg_param = Dever::json_encode($msg_param);
                Dever::load('message/lib/data')->push(-1, $v['uid'], '优惠劵到期提醒', $msg, 4, 1, false, $msg_param);


                if (Dever::load('wechat_applet') && $v['uid'] && $v['uid'] > 0) {
                    $user = Dever::db('passport/wechat')->one(array('uid' => $v['uid'], 'system_id' => 1, 'system_source' => 5));
                    if ($user && $user['openid']) {
                        $send = array
                        (
                            'thing1' => array
                            (
                                'value' => $coupon_info['name'],
                            ),
                            'time2' => array
                            (
                                'value' => date('Y-m-d H:i', $v['edate']),
                            ),
                            'thing3' => array
                            (
                                'value' => '您有一张优惠券即将到期,请尽快使用',
                            ),
                        );

                        $send = Dever::json_encode($send);
                        Dever::load('wechat_applet/subscribe')->sendOne('act_2', 1, $user['openid'], 'pages/my/coupon/coupon', $send, Dever::config('base')->wechat_applet);
                    }
                }
            }
        }
    }

    /**
     * 处理待支付订单提醒
     *
     * @return mixed
     */
    public function order_api()
    {
        # 获取超过5分钟未支付的订单
        $time = time();
        $where['status'] = 1;
        $where['cdate'] = $time - 300;
        $order = Dever::db('shop/sell_order')->getDataByTime($where);

        if ($order && Dever::project('message')) {
            $config = Dever::db('shop/sell_order')->config;
            foreach ($order as $k => $v) {
                if ($time - $v['cdate'] >= 900) {
                    Dever::load('shop/lib/sell')->set(1, 2)->cancel($v['uid'], $v['id'], 11);
                    Dever::db('shop/sell_order')->update(array('where_id' => $v['id'], 'status' => 11, 'notice' => 2));
                } elseif ($v['notice'] == 1) {
                    Dever::db('shop/sell_order')->update(array('where_id' => $v['id'], 'notice' => 2));
                    $msg = "您有一笔待付款订单,请及时付款。\r\n订单15分钟内未付款自动取消~";
                    $shop = Dever::db('shop/info')->one($v['shop_id']);
                    $msg_param = array();
                    $msg_param['type'] = 1;//消息类型1是订单消息
                    $msg_param['id'] = $v['id'];
                    $msg_param['name'] = $shop['name'];
                    $msg_param = Dever::json_encode($msg_param);
                    Dever::load('message/lib/data')->push(-1, $v['uid'], '订单待支付提醒', $msg, 2, 1, false, $msg_param);

                    if (Dever::load('wechat_applet') && $v['uid'] && $v['uid'] > 0) {
                        $user = Dever::db('passport/wechat')->one(array('uid' => $v['uid'], 'system_id' => 1, 'system_source' => 5));
                        if ($user && $user['openid']) {
                            $v['status_name'] = $config['status'][$v['status']];
                            $send = array
                            (
                                'character_string5' => array
                                (
                                    'value' => $v['order_num'],
                                ),
                                'amount11' => array
                                (
                                    'value' => $v['price'] . '元',
                                ),
                                'phrase13' => array
                                (
                                    'value' => $v['status_name'],
                                ),
                                'thing12' => array
                                (
                                    'value' => '您有一笔待付款订单,请及时付款。',
                                ),
                            );

                            $send = Dever::json_encode($send);
                            Dever::load('wechat_applet/subscribe')->sendOne('order_pay', 1, $user['openid'], 'pages/app/order/order?id=' . $v['id'], $send, Dever::config('base')->wechat_applet);
                        }
                    }
                }
            }
        }
    }

    /**
     * 处理待支付订单提醒
     *
     * @return mixed
     */
    public function buy_order_api()
    {
        $time = time();
        $where['status'] = 1;
        $where['cdate'] = $time - 7200;
        $order = Dever::db('shop/buy_order')->getDataByTime($where);

        if ($order) {
            foreach ($order as $k => $v) {
                Dever::db('shop/buy_order')->update(array('where_id' => $v['id'], 'status' => 11));
            }
        }
    }

    /**
     * 处理销售数据 生成每天的销量统计
     *
     * @return mixed
     */
    public function sell_api()
    {
        $num = Dever::input('num', 1);
        $start = Dever::input('start', date('Y-m-d', strtotime('-'.$num.' day')));
        $end = Dever::input('end', date('Y-m-d'));

        $where['status'] = '2,3,4,5,6';
        $start = Dever::maketime($start . ' 00:00:00');
        $end = Dever::maketime($end . ' 23:59:59');
        $day = intval(($end - $start)/86400);

        $shop = Dever::db('shop/info')->select();

        foreach ($shop as $k => $v) {
            $where['shop_id'] = $v['id'];
            for($i=0; $i<=$day; $i++) {
                $where['start'] = $start + 86400*$i;
                $where['end'] = $start + 86400*$i + 86399;
                $data = array();
                $data['shop_id'] = $v['id'];
                $data['day'] = $where['start'];
                $info = Dever::db('shop/sell_stat')->find($data);
                $cash = Dever::db('shop/sell_order')->getCashNum($where);
                $data['cash'] = round($cash['total'], 2);
                $data['order'] = Dever::db('shop/sell_order')->getOrderNum($where);
                
                if ($data['order'] > 0) {
                    $goods = Dever::db('shop/sell_order')->getGoodsNum($where);
                    $data['goods'] = $goods['total'];
                    $data['area'] = $v['area'];
                    $data['province'] = $v['province'];
                    $data['city'] = $v['city'];
                    $data['county'] = $v['county'];
                    $data['town'] = $v['town'];
                    if (!$info) {
                        Dever::db('shop/sell_stat')->insert($data);
                    } else {
                        $data['where_id'] = $info['id'];
                        Dever::db('shop/sell_stat')->update($data);
                    }
                }
            }
        }
    }

    public function buy_api()
    {
        $num = Dever::input('num', 1);
        $start = Dever::input('start', date('Y-m-d', strtotime('-'.$num.' day')));
        $end = Dever::input('end', date('Y-m-d'));

        $where['status'] = '2,3,4,5,6';
        $start = Dever::maketime($start . ' 00:00:00');
        $end = Dever::maketime($end . ' 23:59:59');
        $day = intval(($end - $start)/86400);

        $shop = Dever::db('shop/info')->select();

        foreach ($shop as $k => $v) {
            $where['type'] = 1;
            $where['type_id'] = $v['id'];
            for($i=0; $i<=$day; $i++) {
                $where['start'] = $start + 86400*$i;
                $where['end'] = $start + 86400*$i + 86399;
                $data = array();
                $data['shop_id'] = $v['id'];
                $data['day'] = $where['start'];
                $info = Dever::db('shop/buy_stat')->find($data);
                $cash = Dever::db('shop/buy_order')->getCashNum($where);
                $data['cash'] = round($cash['total'], 2);
                $cash = Dever::db('shop/buy_order')->getPCashNum($where);
                $data['p_cash'] = round($cash['total'], 2);

                $data['order'] = Dever::db('shop/buy_order')->getOrderNum($where);

                if ($data['order'] > 0) {
                    $goods = Dever::db('shop/buy_order')->getGoodsNum($where);

                    $data['goods'] = $goods['total'];

                    $data['area'] = $v['area'];
                    $data['province'] = $v['province'];
                    $data['city'] = $v['city'];
                    $data['county'] = $v['county'];
                    $data['town'] = $v['town'];
                    if (!$info) {
                        Dever::db('shop/buy_stat')->insert($data);
                    } else {
                        $data['where_id'] = $info['id'];
                        Dever::db('shop/buy_stat')->update($data);
                    }
                }
            }
        }
    }

    /**
     * 门店数据统计
     *
     * @return mixed
     */
    public function shop_api()
    {
        $num = Dever::input('num', 1);
        $start = Dever::input('start', date('Y-m-d', strtotime('-'.$num.' day')));
        $end = Dever::input('end', date('Y-m-d'));

        $start = Dever::maketime($start . ' 00:00:00');
        $end = Dever::maketime($end . ' 23:59:59');
        $day = intval(($end - $start)/86400);

        $shop = Dever::db('shop/info')->select();

        foreach ($shop as $k => $v) {
            $where = array();
            $where['status'] = '2,3,4,5,6';
            $where['shop_id'] = $v['id'];
            for($i=0; $i<=$day; $i++) {
                $where['start'] = $start + 86400*$i;
                $where['end'] = $start + 86400*$i + 86399;
                $data = array();
                $data['shop_id'] = $v['id'];
                $data['day'] = $where['start'];
                $info = Dever::db('shop/shop_stat')->find($data);
                $cash = Dever::db('shop/sell_order')->getCashNum($where);
                $data['sell_cash'] = round($cash['total'], 2);
                $data['sell_num'] = Dever::db('shop/sell_order')->getOrderNum($where);
                
                $where['type'] = 1;
                $where['type_id'] = $v['id'];
                $cash = Dever::db('shop/buy_order')->getCashNum($where);
                $data['buy_cash'] = round($cash['total'], 2);
                $data['buy_num'] = Dever::db('shop/buy_order')->getOrderNum($where);

                $data['sl_num'] = 0;

                $data['area'] = $v['area'];
                $data['province'] = $v['province'];
                $data['city'] = $v['city'];
                $data['county'] = $v['county'];
                $data['town'] = $v['town'];

                if ($data['buy_num'] > 0) {
                    if (!$info) {
                        Dever::db('shop/shop_stat')->insert($data);
                    } else {
                        $data['where_id'] = $info['id'];
                        Dever::db('shop/shop_stat')->update($data);
                    }
                }
            }
        }
    }

    /**
     * 商品数据统计
     *
     * @return mixed
     */
    public function goods_api()
    {
        $num = Dever::input('num', 1);
        $start = Dever::input('start', date('Y-m-d', strtotime('-'.$num.' day')));
        $end = Dever::input('end', date('Y-m-d'));

        $where['status'] = '1';
        $start = Dever::maketime($start . ' 00:00:00');
        $end = Dever::maketime($end . ' 23:59:59');
        $day = intval(($end - $start)/86400);

        $shop = Dever::db('shop/info')->select();

        foreach ($shop as $k => $v) {
            $where['shop_id'] = $v['id'];
            $goods = Dever::db('shop/goods')->select(array('shop_id' => $v['id']));
            if ($goods) {
                foreach ($goods as $k1 => $v1) {
                    $where['goods_id'] = $v1['goods_id'];
                    $goods_info = Dever::db('goods/info')->one($v1['goods_id']);
                    for($i=0; $i<=$day; $i++) {
                        $where['start'] = $start + 86400*$i;
                        $where['end'] = $start + 86400*$i + 86399;
                        $data = array();
                        $data['shop_id'] = $v['id'];
                        $data['goods_id'] = $v1['goods_id'];
                        $data['day'] = $where['start'];
                        $info = Dever::db('shop/goods_stat')->find($data);
                        $cash = Dever::db('shop/sell_order_goods')->getCashNum($where);
                        $data['cash'] = round($cash['total'], 2);
                        $data['num'] = Dever::db('shop/sell_order_goods')->getOrderNum($where);
                        if ($data['num'] > 0) {
                            $data['area'] = $v['area'];
                            $data['category'] = $goods_info['category'];
                            if (!$info) {
                                Dever::db('shop/goods_stat')->insert($data);
                            } else {
                                $data['where_id'] = $info['id'];
                                Dever::db('shop/goods_stat')->update($data);
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * 门店数据统计
     *
     * @return mixed
     */
    public function user_api()
    {
        $num = Dever::input('num', 1);
        $start = Dever::input('start', date('Y-m-d', strtotime('-'.$num.' day')));
        $end = Dever::input('end', date('Y-m-d'));

        $start = Dever::maketime($start . ' 00:00:00');
        $end = Dever::maketime($end . ' 23:59:59');
        $day = intval(($end - $start)/86400);

        $shop = Dever::db('shop/info')->select();

        foreach ($shop as $k => $v) {
            $where = array();
            $where['status'] = '2,3,4,5,6';
            $where['shop_id'] = $v['id'];
            for($i=0; $i<=$day; $i++) {
                $where['start'] = $start + 86400*$i;
                $where['end'] = $start + 86400*$i + 86399;
                $data = array();
                $data['shop_id'] = $v['id'];
                $data['day'] = $where['start'];
                $info = Dever::db('shop/user_stat')->find($data);
                $total = Dever::db('shop/sell_order')->getUser($where);
                $data['total'] = count($total);
                foreach ($total as $k1 => $v1) {
                    if ($v1['total'] <= 1) {
                        unset($total[$k1]);
                    }
                }
                $data['num'] = count($total);

                $data['order_num'] = Dever::db('shop/sell_order')->getOrderNum($where);
                
                if ($data['num'] > 0 || $data['order_num'] > 0) {
                    $data['area'] = $v['area'];
                    if (!$info) {
                        Dever::db('shop/user_stat')->insert($data);
                    } else {
                        $data['where_id'] = $info['id'];
                        Dever::db('shop/user_stat')->update($data);
                    }
                }
            }
        }
    }

    /**
     * 用户排名统计
     *
     * @return mixed
     */
    public function user_rank_api()
    {
        $num = Dever::input('num', 1);
        $start = Dever::input('start', date('Y-m-d', strtotime('-'.$num.' day')));
        $end = Dever::input('end', date('Y-m-d'));

        $start = Dever::maketime($start . ' 00:00:00');
        $end = Dever::maketime($end . ' 23:59:59');
        $day = intval(($end - $start)/86400);

        $w['start'] = $start;
        $w['end'] = $end;
        $w['status'] = '2,3,4,5,6';
        $data = Dever::db('shop/sell_order')->getAllByDate($w);

        if ($data) {
            $where = array();
            $result = array();
            foreach ($data as $k => $v) {
                $day = Dever::maketime(date('Y-m-d 00:00:00', $v['cdate']));

                $key = $v['shop_id'] . '_' . $day . '_' . $v['mobile'];
                if (!isset($result[$key])) {
                    $result[$key] = array();
                    $result[$key]['num'] = 0;
                    $result[$key]['cash'] = 0;
                }

                $result[$key]['num'] += $v['num'];
                $result[$key]['cash'] = $v['total'];
            }

            if ($result) {
                foreach ($result as $k => $v) {
                    $temp = explode('_', $k);

                    $where['shop_id'] = $temp[0];
                    $where['day'] = $temp[1];
                    $where['mobile'] = $temp[2];
                    $where['clear'] = true;
                    $info = Dever::db('shop/user_rank_stat')->find($where);

                    $up = array();
                    if (!$info) {
                        $up = $where;
                        $shop = Dever::db('shop/info')->one($where['shop_id']);
                        $up['area'] = $shop['area'];
                        $up['num'] = $v['num'];
                        $up['cash'] = $v['cash'];
                        Dever::db('shop/user_rank_stat')->insert($up);
                    } else {
                        $up = array();
                        $up['where_id'] = $info['id'];;
                        $up['num'] = $v['num'];
                        $up['cash'] = $v['cash'];
                        Dever::db('shop/user_rank_stat')->update($up);
                    }
                }
            }
        }
    }

    # 获取下单用户量
    public function order_user($where)
    {
        $where['status'] = '1,2,3,4,5,6';
        $user = Dever::db('shop/sell_order')->getUser($where);
        return $user;
    }

    # 处理月度对账数据 废弃,直接用结算单处理
    public function sell_month_api()
    {
        return;
        $num = Dever::input('num', -1);
        if ($num > 0) {
            $month = Dever::input('start', date('Y-m', strtotime('-'.$num.' month')));
        } else {
            $month = Dever::input('start', date('Y-m'));
        }

        $where['status'] = 2;
        $start = Dever::maketime($month . '-01 00:00:00');
        $end = Dever::maketime($month . '-31 23:59:59');

        $shop = Dever::db('shop/info')->select();

        foreach ($shop as $k => $v) {
            $where['shop_id'] = $v['id'];
            $where['start'] = $start;
            $where['end'] = $end;
            $data = array();
            $data['shop_id'] = $v['id'];
            $data['month'] = $start;
            $info = Dever::db('shop/sell_stat_month')->find($data);
            $data['cash'] = Dever::db('shop/sell_order')->getCashNum($where);
            $data['order'] = Dever::db('shop/sell_order')->getOrderNum($where);
            $data['goods'] = Dever::db('shop/sell_order')->getGoodsNum($where);
            if (!$info) {
                Dever::db('shop/sell_stat_month')->insert($data);
            } else {
                $data['where_id'] = $info['id'];
                Dever::db('shop/sell_stat_month')->update($data);
            }
        }
    }

    # 处理月度对账数据:门店采购 废弃,直接用结算单处理
    public function buy_month_api()
    {
        return;
        $num = Dever::input('num', -1);
        if ($num > 0) {
            $month = Dever::input('start', date('Y-m', strtotime('-'.$num.' month')));
        } else {
            $month = Dever::input('start', date('Y-m'));
        }

        $where['status'] = '5,6';
        $start = Dever::maketime($month . '-01 00:00:00');
        $end = Dever::maketime($month . '-31 23:59:59');

        $shop = Dever::db('shop/info')->select();

        foreach ($shop as $k => $v) {
            $where['type'] = 1;
            $where['type_id'] = $v['id'];
            $where['start'] = $start;
            $where['end'] = $end;
            $data = array();
            $data['shop_id'] = $v['id'];
            $data['month'] = $start;
            $info = Dever::db('shop/buy_stat_month')->find($data);
            $data['cash'] = Dever::db('shop/buy_order')->getCashNum($where);
            $data['order'] = Dever::db('shop/buy_order')->getOrderNum($where);
            $data['goods'] = Dever::db('shop/buy_order')->getGoodsNum($where);
            if (!$info) {
                Dever::db('shop/buy_stat_month')->insert($data);
            } else {
                $data['where_id'] = $info['id'];
                Dever::db('shop/buy_stat_month')->update($data);
            }
        }
    }

    # 处理月度对账数据:仓库对账 废弃,直接用结算单处理
    public function store_month_api()
    {
        return;
        $num = Dever::input('num', -1);
        if ($num > 0) {
            $month = Dever::input('start', date('Y-m', strtotime('-'.$num.' month')));
        } else {
            $month = Dever::input('start', date('Y-m'));
        }

        $where['status'] = '5,6';
        $start = Dever::maketime($month . '-01 00:00:00');
        $end = Dever::maketime($month . '-31 23:59:59');

        $store = Dever::db('store/info')->select();

        foreach ($store as $k => $v) {
            $where['type'] = 2;
            $where['type_id'] = $v['id'];
            $where['start'] = $start;
            $where['end'] = $end;
            $data = array();
            $data['store_id'] = $v['id'];
            $data['month'] = $start;
            $info = Dever::db('shop/store_stat_month')->find($data);
            $data['cash'] = Dever::db('shop/buy_order')->getCashNum($where);
            $data['order'] = Dever::db('shop/buy_order')->getOrderNum($where);
            $data['goods'] = Dever::db('shop/buy_order')->getGoodsNum($where);
            if (!$info) {
                Dever::db('shop/store_stat_month')->insert($data);
            } else {
                $data['where_id'] = $info['id'];
                Dever::db('shop/store_stat_month')->update($data);
            }
        }
    }

    # 处理月度对账数据:工厂对账 废弃,直接用结算单处理
    public function factory_month_api()
    {
        return;
        $num = Dever::input('num', -1);
        if ($num > 0) {
            $month = Dever::input('start', date('Y-m', strtotime('-'.$num.' month')));
        } else {
            $month = Dever::input('start', date('Y-m'));
        }

        $where['status'] = '5,6';
        $start = Dever::maketime($month . '-01 00:00:00');
        $end = Dever::maketime($month . '-31 23:59:59');

        $factory = Dever::db('factory/info')->select();

        foreach ($factory as $k => $v) {
            $where['source_type'] = 3;
            $where['source_id'] = $v['id'];
            $where['start'] = $start;
            $where['end'] = $end;
            $data = array();
            $data['factory_id'] = $v['id'];
            $data['month'] = $start;
            $info = Dever::db('shop/factory_stat_month')->find($data);
            $data['cash'] = Dever::db('shop/buy_order')->getCashNum($where);
            $data['order'] = Dever::db('shop/buy_order')->getOrderNum($where);
            $data['goods'] = Dever::db('shop/buy_order')->getGoodsNum($where);
            if (!$info) {
                Dever::db('shop/factory_stat_month')->insert($data);
            } else {
                $data['where_id'] = $info['id'];
                Dever::db('shop/factory_stat_month')->update($data);
            }
        }
    }
}