<?php


namespace app\api\controller;


use addons\epay\library\Service;
use app\api\model\GoodsComment;
use app\api\model\GoodsSpec;
use app\api\model\RiderOrder;
use app\api\model\SpecValue;
use app\api\model\Third;
use app\api\model\UserAddress;
use app\api\model\UserCoupon;
use app\common\controller\Api;
use fast\Http;
use think\Config;
use think\Db;
use think\exception\PDOException;
use Yansongda\Pay\Pay;

/**
 * 订单
 */
class Order extends Api
{
    protected $noNeedLogin = ['friendPay','commentOrderDetail','pay','cancelOrderAction'];
    protected $noNeedRight = ['*'];

    /**
     * @ApiTitle    (订单列表)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="type", type="integer", required=true, description="类型1全部2待付款3待发货4待收货5待评价")
     * @ApiParams   (name="page", type="integer", required=true, description="页数")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    'data':
        "total": 1, 总条数
        "per_page": 5, 每页数量
        "current_page": 1, 当前页
        "last_page": 1, 最后一页
        "data": [
            {
            "id": 1, 订单id
            "order_no": "adsadasdas", 订单编号
            "discount_price": "0.00", 优惠金额
            "pay_price": "0.00", 实付价格
            "pay_status": "10", 10未支付20已支付
            "freight_status": "10", 10未发货20已发货
            "receipt_status": "10", 10未收货20已收货
            "order_status": "10", 10进行中20已取消30已完成
            "comment_status": "10", 评价状态:10=未评价20=已评价
            "total_sum": 0, 商品总数量
            "goods": [{
                "goods_id": 1, 商品ID
                "goods_name": "asdasd", 商品名
                "goods_attr": "1", 规格名
                "total_num": 0, 数量
                "total_price": "0.00", 价格
                "image_text": "" 图片
                "stock_num": 68, 商品总库存
            }],
            "createtime_text": "" 时间
            }
        ]
    })
     */
    public function orderList()
    {
        $type = $this->request->post('type');
        $page = $this->request->post('page',1);
        if (!in_array($type,[1,2,3,4,5])) $this->error('type参数不合法');
        if (!is_numeric($page)) $this->error('页数不合法');
        switch ($type){
            case 1:
                $where = [
                    'fa_litestore_order.status' => 'normal',
                    'fa_litestore_order.user_id' => $this->auth->id,
                ];
                break;
            case 2:
                $where = [
                    'fa_litestore_order.status' => 'normal',
                    'fa_litestore_order.user_id' => $this->auth->id,
                    'fa_litestore_order.pay_status' => '10',
                ];
                break;
            case 3:
                $where = [
                    'fa_litestore_order.status' => 'normal',
                    'fa_litestore_order.user_id' => $this->auth->id,
                    'fa_litestore_order.pay_status' => '20',
                    'fa_litestore_order.freight_status' => '10',
                ];
                break;
            case 4:
                $where = [
                    'fa_litestore_order.status' => 'normal',
                    'fa_litestore_order.user_id' => $this->auth->id,
                    'fa_litestore_order.pay_status' => '20',
                    'fa_litestore_order.freight_status' => '20',
                    'fa_litestore_order.receipt_status' => '10',
                ];
                break;
            default :
                $where = [
                    'fa_litestore_order.status' => 'normal',
                    'fa_litestore_order.user_id' => $this->auth->id,
                    'fa_litestore_order.pay_status' => '20',
                    'fa_litestore_order.freight_status' => '20',
                    'fa_litestore_order.receipt_status' => '20',
                    'fa_litestore_order.comment_status' => '10',
                ];
                break;
        }

        $model = new \app\api\model\Order();
        $list = $model
            ->with(['goods'])
            ->where($where)
            ->order('id','desc')
            ->paginate(5,false,['page'=>$page])
            ->each(function ($item,$key){
                $sum = 0;
                foreach ($item->getRelation('goods')as $key => $value){
                    $sum += $value['total_num'];
                    // 总库存
                    $value['stock_num'] = GoodsSpec::where('goods_id',$value['goods_id'])->sum('stock_num');
                    $value->visible(['goods_id','goods_name','goods_attr','total_num','total_price'])->append(['stock_num']);
                }
                $item['total_sum'] = $sum;
                $item->visible([
                    'goods','total_sum','order_no','id','pay_price',
                    'discount_price','pay_status','order_status','receipt_status',
                    'freight_status','comment_status'
                ]);
            });
        $this->success('订单列表',$list);
    }

    /**
     * @ApiTitle    (下单页面)
     * @ApiSummary ([{id:113 goods_id:22 goods_sku_id:106 number:2} {id:114 goods_id:23 goods_sku_id:66 number:2}])
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="data_json", type="string", required=true, description="下单的商品json数据")
     * @ApiParams   (name="id", type="integer", required=false, description="购物车或我常买id 此值不传 json数组注释用")
     * @ApiParams   (name="goods_id", type="integer", required=false, description="商品id 此值不传 json数组注释用")
     * @ApiParams   (name="goods_sku_id", type="integer", required=false, description="规格id 此值不传 json数组注释用")
     * @ApiParams   (name="number", type="integer", required=false, description="购买数量 此值不传 json数组注释用")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    'data':
        "list": [
            {
            "id": 113, 购物车或我常买id
            "goods_id": 22, 商品id
            "goods_name": "Mate 20 华为 HUAWEI ", 商品名称
            "spec_type": "20", 20多规格10单规格
            "sku_id": 106, 规格id
            "sku_price": "6099.00", 规格单价
            "sku_name": "极光色 8GB+128GB", 规格名称
            "number": 2, 数量
            "image_text": "", 图片
            },
            {
            "id": 114,
            "goods_id": 23,
            "goods_name": "MacBook Pro 13寸",
            "spec_type": "20",
            "sku_id": 66,
            "sku_price": "12688.00",
            "sku_name": "天空灰",
            "number": 2,
            "image_text": "",
            }
        ],
        "price": "37574.00" 总价
    })
     */
    public function orderCalculation()
    {
        $json = $this->request->param('data_json');
        if (!$json) $this->error('data_json参数不能为空');
        $json = str_replace('&quot;','"',$json);
//        $json = '[{"goods_id":22,"goods_sku_id":106,"number":2},{"goods_id":23,"goods_sku_id":66,"number":2}]';
        $data = json_decode($json,true);
        $goodsmodel = new \app\api\model\Goods();
        $skumodel = new GoodsSpec();
        $specmodel = new SpecValue();
        $goods_array = []; //商品列表
        $sum_price = 0; //总价格
        foreach ($data as $key => $value){
            if (!is_numeric($value['goods_id']) || !is_numeric($value['goods_sku_id']) || !is_numeric($value['number'])){
                $this->error('参数不合法');
            }
            $goods = $goodsmodel->where('goods_id',$value['goods_id'])->field('goods_id,goods_name,image,spec_type')->find();
            if (!$goods) $this->error('商品不存在');
//            $goods->visibleAppend(['image_text']);
            $goods->append(['image_text']);
            $goods->hidden(['image']);
            $sku = $skumodel->where('goods_spec_id',$value['goods_sku_id'])
                ->field('goods_spec_id,spec_sku_id,goods_price')->find();
            if (!$sku) $this->error('商品规格不存在');
//            $sku->unsetAppend();

            $goods['sku_id'] = $sku['goods_spec_id'];
            $goods['sku_price'] = $sku['goods_price'];
            if ($goods['spec_type'] == 10){
                $goods['sku_name'] =''; //规格名
            }else{
                $ids = explode('_',$sku['spec_sku_id']);
                $sku_name = $specmodel->whereIn('id',$ids)->column('spec_value');
                $goods['sku_name'] = implode(' ',$sku_name);  //规格名
            }
            $goods['number'] = $value['number'];
            if(!empty($value['id'])){
                $goods['id'] = $value['id'];
            }
            $goods_array[] = $goods;
            $sum_price = bcadd($sum_price,bcmul($sku['goods_price'],$value['number'],2),2);
        }
        $addressmodel = new UserAddress();
        $address = $addressmodel->where('user_id',$this->auth->id)->where('normal_status','1')->find();
        $express_price = 0;
        if ($address){
            // 计算运费
            $lat1 = $address['lat'];
            $lng1 = $address['lng'];
            $admin_address = Db::name('admin_address')->find();
            $lat2 = $admin_address['lat'];
            $lng2 = $admin_address['lng'];
            $express_price = $this->distancePrice($lat1,$lng1,$lat2,$lng2,$sum_price);
            if ($express_price === false)  $express_price = 0;
        }else{
            $address = [];
        }
        $sum_price += $express_price;
        $this->success('下单页详情',['list'=>$goods_array,'price'=>$sum_price,'order_price'=>$sum_price-$express_price,'express_price'=>$express_price,'address'=>$address]);
    }

    /**
     * @ApiTitle    (找人付页面)
     * @ApiMethod   (POST)
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单id")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    'data':
        detail:
            pay_price:实付款
            "goods": [
                {
                "goods_id": 22, 商品id
                "goods_name": "Mate 20 华为 HUAWEI ", 商品名称
                "spec_type": "20", 20多规格10单规格
                "sku_id": 106, 规格id
                "sku_price": "6099.00", 规格单价
                "sku_name": "极光色 8GB+128GB", 规格名称
                "number": 2, 数量
                "image_text": "", 图片
                },
                {
                "goods_id": 23,
                "goods_name": "MacBook Pro 13寸",
                "spec_type": "20",
                "sku_id": 66,
                "sku_price": "12688.00",
                "sku_name": "天空灰",
                "number": 2,
                "image_text": "",
                }
            ],
        "user": 用户信息
    })
     */
    public function friendPay()
    {
        $order_id = $this->request->post('order_id');
        if (!$order_id) $this->error('订单id参数不能为空');
        $ordermodel = new \app\api\model\Order();
        $order = $ordermodel
            ->with(['goods'])
            ->where('id',$order_id)
            ->find();
        $user = \app\api\model\User::get($order['user_id']);
        $user->visible(['nickname']);
        $this->success('下单页详情',['detail'=>$order,'user'=>$user]);
    }

    /**
     * @ApiTitle    (判断库存)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="sku_id", type="integer", required=true, description="规格id")
     * @ApiParams   (name="number", type="integer", required=true, description="购买数量")
     * @ApiReturn   ({
    'code':'1',
    'msg':'SUCCESS'
    'data': code 等于1表示未超出最大值
    })
     */
    public function checkStock()
    {
        $sku_id = $this->request->post('sku_id');
        $number = $this->request->post('number');
        if (!$number) $this->error('请选择购买数量');
        if (!$sku_id) $this->error('请选择规格');
        $model = new GoodsSpec();
        $sku = $model::get($sku_id);
        if (!$sku) $this->error('规格已失效,请重新选择');
        $cart_number = \app\api\model\Cart::where('sku_id',$sku_id)->sum('number');
        if ($sku['stock_num'] < $number+$cart_number) $this->error('已超出最大库存');
        $this->success('SUCCESS');
    }

    /**
     * @ApiTitle    (计算运费)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="address_id", type="integer", required=true, description="地址id")
     * @ApiParams   (name="goods_total_price", type="string", required=true, description="商品总价")
     * @ApiReturn   ({
    'code':'1',
    'msg':'计算运费'
    'data':
        "price": "37574.00", 总价
        "delivery_threshold": "20.00", 起送价
    })
     */
    public function freightCalculation()
    {
        $address_id = $this->request->post('address_id');
        $goods_total_price = $this->request->post('goods_total_price');
        if (!$address_id) $this->error('请选择地址');
        if (!$goods_total_price) $this->error('请计算商品总价');
        $model = new UserAddress();
        $address = $model::get($address_id);
        if (!$address) $this->error('地址不存在');
        $lat1 = $address['lat'];
        $lng1 = $address['lng'];
        $admin_address = Db::name('admin_address')->find();
        $lat2 = $admin_address['lat'];
        $lng2 = $admin_address['lng'];
        $sum_price = $this->distancePrice($lat1,$lng1,$lat2,$lng2,$goods_total_price);
        if ($sum_price === false) $this->error('地址超出配送距离');
        $delivery_threshold = Db::name('litestore_rider_rule')->value('delivery_threshold');
        $this->success('计算运费',[
            'price' => $sum_price,
            'delivery_threshold' => $delivery_threshold
        ]);
    }

    /**
     * @ApiTitle    (选择优惠券)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="price", type="float", required=true, description="订单价格")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "coupon_id": 1,
            "name": "手动阀手动阀",
            "price": "1.00", 优惠券金额
            "full_price": "10.00", 满减金额
            "createtime": 111122244,
            "endtime": 1641869388,
            "status": "0",
            "endtime_text": "2022年01月11日到期"
        }
    ]
    })
     */
    public function chooseCoupon()
    {
        $model = new UserCoupon();

        // 更新已过期状态
        $model->where('status','0')->where('user_id',$this->auth->id)->where('endtime','<',time())->update(['status'=>'2']);

        $price = $this->request->post('price');
        if (!is_numeric($price)) $this->error('订单价格不合法');

        $list = $model
            ->where('status','0')
            ->where('user_id',$this->auth->id)
            ->where('full_price','<',$price)
            ->select();
        $this->success('用户优惠券列表',$list);
    }

    /**
     * @ApiTitle    (下单)
     * @ApiMethod   (POST)
     * @ApiSummary ([{goods_id:22 goods_sku_id:106 number:2} {goods_id:23 goods_sku_id:66 number:2}])
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="data_json", type="string", required=true, description="下单的商品json数据")
     * @ApiParams   (name="goods_id", type="integer", required=false, description="商品id 此值不传 json数组注释用")
     * @ApiParams   (name="goods_sku_id", type="integer", required=false, description="规格id 此值不传 json数组注释用")
     * @ApiParams   (name="number", type="integer", required=false, description="购买数量 此值不传 json数组注释用")
     * @ApiParams   (name="coupon_id", type="integer", required=true, description="优惠券id 无优惠券传0")
     * @ApiParams   (name="address_id", type="integer", required=true, description="地址id")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    'data':

    })
     */
    public function addOrder()
    {
        $json = $this->request->param('data_json');
        $coupon_id = $this->request->param('coupon_id');
        $address_id = $this->request->param('address_id');
        if (!$json) $this->error('data_json参数不能为空');
//        $json = '[{"goods_id":22,"goods_sku_id":106,"number":2},{"goods_id":23,"goods_sku_id":66,"number":2}]';
        $address = Db::name('user_address')
            ->where('id',$address_id)
            ->where('user_id',$this->auth->id)
            ->find();
        if (!$address) $this->error('地址不存在');
        $coupon = [];
        if ($coupon_id > 0){
            $coupon = Db::name('user_coupon')
                ->where('id',$coupon_id)
                ->where('user_id',$this->auth->id)
                ->where('status','0')
                ->find();
            if (!$coupon) $this->error('优惠券不存在');
        }
        $json = str_replace('&quot;','"',$json);
        $data = json_decode($json,true);
        $goodsmodel = new \app\api\model\Goods();
        $skumodel = new GoodsSpec();
        $ordermodel = new \app\api\model\Order();
        $ordergoodsmodel = new \app\api\model\OrderGoods();
        $orderaddressmodel = new \app\api\model\OrderAddress();
        $cartmodel = new \app\api\model\Cart();
        $specmodel = new SpecValue();
        $goods_array = []; //商品列表
        $sum_price = 0; //总价格
        $user_id = $this->auth->id;

        foreach ($data as $key => $value){
            if (!is_numeric($value['goods_id']) || !is_numeric($value['goods_sku_id']) || !is_numeric($value['number'])){
                $this->error('参数不合法');
            }
            $goods = $goodsmodel->where('goods_id',$value['goods_id'])->find();
            if (!$goods) $this->error('商品不存在');
            $sku = $skumodel->where('goods_spec_id',$value['goods_sku_id'])->find();
            if (!$sku) $this->error('商品规格不存在');
            if ($sku['stock_num'] < $value['number']) $this->error('库存不足');
            if ($goods['spec_type'] == 10){
                $sku_name =''; //规格名
            }else{
                $ids = explode('_',$sku['spec_sku_id']);
                $sku_name = $specmodel->whereIn('id',$ids)->column('spec_value');
                $sku_name = implode(' ',$sku_name);  //规格名
            }

            // 组装订单商品数组
            $goods_array[] = [
                'goods_id' => $goods['goods_id'],
                'goods_name' => $goods['goods_name'],
                'image' => $goods['image'],
                'deduct_stock_type' => $goods['deduct_stock_type'],
                'spec_type' => $goods['spec_type'],
                'spec_sku_id' => $sku['spec_sku_id'],
                'goods_spec_id' => $sku['goods_spec_id'],
                'goods_attr' => $sku_name,
                'content' => $goods['content'],
                'goods_no' => $goods['number'],
                'goods_price' => $sku['goods_price'],
                'goods_weight' => $sku['goods_weight'],
                'total_num' => $value['number'],
                'total_price' => bcmul($sku['goods_price'],$value['number'],2),
                'user_id' => $user_id,
            ];

            $sum_price = bcadd($sum_price,bcmul($sku['goods_price'],$value['number'],2),2);
        }

        // 计算运费
        $lat1 = $address['lat'];
        $lng1 = $address['lng'];
        $admin_address = Db::name('admin_address')->find();
        $lat2 = $admin_address['lat'];
        $lng2 = $admin_address['lng'];
        $distance_price = $this->distancePrice($lat1,$lng1,$lat2,$lng2,$sum_price);
        if ($distance_price === false) $this->error('地址超出配送距离');

        if ($coupon !== [] && $coupon['full_price'] > $sum_price) $this->error('优惠券不可使用');

        // 给骑手佣金
        $rider_rule = Db::name('litestore_rider_rule')->find();
        if ($sum_price < $rider_rule['delivery_threshold']){
            $last_price = $rider_rule['delivery_threshold'] - $sum_price;
            $this->error('差'.$last_price.'元起送');
        }
        $distance = ceil(getDistance($lat1,$lng1,$lat2,$lng2));
        if ($distance > $rider_rule['first']){
            $first_rider_fee = $rider_rule['first_rider_fee'];
            $subdistance = $distance-$rider_rule['first'];
            $count = ceil(bcdiv($subdistance,$rider_rule['additional'],1));
            $second_rider_price = bcmul($count,$rider_rule['additional_rider_fee'],2);
            $rider_price = bcadd($first_rider_fee,$second_rider_price,2);
        }else{
            $rider_price = $rider_rule['first_rider_fee'];
        }

        // 订单地址
        $order_address = [
            'name' => $address['username'],
            'phone' => $address['mobile'],
            'address' => $address['address'],
            'detail' => $address['address_detail'],
            'lng' => $address['lng'],
            'lat' => $address['lat'],
            'user_id' => $user_id,
        ];


        $sum_price += $distance_price; // 订单总价
        $order_no = 'LQ-'.time().mt_rand(1000,9999); // 订单号
        $couponprice = isset($coupon['price'])?$coupon['price']:0;  // 优惠价格

        // 订单信息
        $order = [
            'order_no' => $order_no,
            'total_price' => $sum_price,  // 订单总价
            'discount_price' => $couponprice,  // 优惠价格
            'pay_price' => bcsub($sum_price,$couponprice,2),  // 支付总价
            'express_price' => $distance_price,  // 骑手费用
            'user_id' => $user_id,
            'user_coupon_id' => $coupon_id > 0 ? $coupon_id : 0,
            'rider_price' => $rider_price
        ];

        // 添加订单
        try {
            Db::startTrans();
            $ordermodel->save($order);
            foreach ($goods_array as $key => &$value){
                $value['order_id'] = $ordermodel->id;
                // 减少库存
                if ($value['deduct_stock_type'] == 10){
                    $skumodel->where('goods_spec_id',$value['goods_spec_id'])->setDec('stock_num',$value['total_num']);
                }
            }
            $ordergoodsmodel->saveAll($goods_array);
            $order_address['order_id'] = $ordermodel->id;
            $orderaddressmodel->save($order_address);
            // 删除购物车
            $goodsids = [];
            $skuids = [];
            foreach ($goods_array as $key => $value){
                $goodsids[] = $value['goods_id'];
                $skuids[] = $value['goods_spec_id'];
            }
            $cartmodel->whereIn('goods_id',$goodsids)
                ->whereIn('sku_id',$skuids)
                ->where('user_id',$this->auth->id)
                ->delete();
            // 如果使用了优惠券,就把优惠券状态变为已使用
            UserCoupon::where('id',$coupon_id)->update(['status'=>'1']);
            // 待支付自动关闭
            $close_minue = 2;
            \think\Queue::later(($close_minue * 60), '\app\api\job\OrderAutoOper@autoClose', ['order_id' => $ordermodel->id], 'temporaryfood');
            Db::commit();
        }catch (PDOException $e){
            Db::rollback();
            $this->error($e->getMessage());
        }

        $this->success('下单成功',$ordermodel->id);
    }

    /**
     * @ApiTitle    (支付订单)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="订单ID")
     * @ApiParams   (name="code", type="string", required=false, description="代付人code")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    })
     */
    public function pay()
    {
        $order_id = $this->request->post('id');
        $code = $this->request->post('code');
        empty($order_id) && $this->error('缺少必需参数');

        $model = new \app\api\model\Order();
        $order = $model::get($order_id);
        if (!$order) $this->error('订单不存在');
        $third = Third::alias('a')
            ->join('user b','b.id = a.user_id')
            ->where('a.user_id',$order['user_id'])
            ->field('a.openid')
            ->find();
        if (!$third) $this->error('下单人未注册');

        // 获取代付人的openid
        $openid = $third['openid'];
        if(!empty($code)){
            $wxapi = Http::get('https://api.weixin.qq.com/sns/jscode2session',[
                'js_code' => $code,
                'grant_type' => 'authorization_code',
                'secret' => Config::get('site.secret'),
                'appid' => Config::get('site.appid')
            ]);//请求openid
            $wxapi = json_decode($wxapi,true);
            if (isset($wxapi['errcode'])){
                $this->error($wxapi['errmsg']);
            }
            $openid = $wxapi['openid'];
        }

        $params = [
            'type'         => 'wechat',
            'orderid'      => $order['order_no'],
            'title'        => '订单号-'.$order['order_no'],
            'amount'       => $order['pay_price'],
//            'amount'       => 0.01,
            'method'       => 'miniapp',
            'openid'       => $openid,
            'notifyurl'    => $this->request->domain().'/api/notify/orderNotify/type/wechat',
            'returnurl'    => '',
        ];
        $result = Service::submitOrder($params);
        $this->success('支付信息',$result);
    }


    /**
     * @ApiTitle    (确认收货)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="订单ID")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    })
     */
    public function takeover()
    {
        $order_id = $this->request->post('id');
        if (!is_numeric($order_id)) $this->error('参数不合法');

        $model = new \app\api\model\Order();
        $order = $model->get($order_id);
        empty($order) && $this->error('订单不存在');
        $order['receipt_status'] == '20' && $this->error('订单已收货,请勿重复提交');
        $rider_order = RiderOrder::where('order_id',$order_id)->find();
        empty($rider_order) && $this->error('骑手订单不存在');

        // 修改订单信息
        $order->rider_status = '20'; //送达状态:已送达
        $order->receipt_status = '20'; //收货状态:已收货
        $order->receipt_time = time(); //收货时间
        $order->order_status = '30'; //订单状态变为已完成
        $order->save();
        // 修改配送单信息
        $rider_order->status = '2'; //已送达
        $rider_order->sendtime = time(); //送达时间
        $rider_order->save();
        // 发放订单运费
        \app\common\model\User::money($order->rider_price,$order->rider_user_id,'订单运费');

        $this->success('收货成功');
    }


    /**
     * @ApiTitle    (提醒发货)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="订单ID")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    })
     */
    public function remind()
    {
        $order_id = $this->request->post('id');
        if (!is_numeric($order_id)) $this->error('参数不合法');

        $model = new \app\api\model\Order();
        $model->where('id',$order_id)->update(['remind_status'=>'20']);
        $this->success('提醒成功');
    }


    /**
     * @ApiTitle    (取消订单)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="id", type="integer", required=true, description="订单ID")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    })
     */
    public function cancelOrder()
    {
        $order_id = $this->request->post('id');
        if (!is_numeric($order_id)) $this->error('参数不合法');
        $model = new \app\api\model\Order();
        $order = $model->where('id',$order_id)->find();
        empty($order) && $this->error('订单不存在');

        $res = self::cancelOrderAction($order);
        $res['code'] == 0 && $this->error($res['msg']);

        $this->success('取消成功');
    }

    /**
     * 取消订单操作
     * @ApiInternal
     */
    public static function cancelOrderAction($order)
    {
        \think\Log::write('订单数据:'.json_encode($order));
        if($order['freight_status'] == '20'){
            return ['code' => 0,'msg' => '订单已发货无法取消'];
        }
        $goodsmodel = new \app\api\model\OrderGoods();
        $skumodel = new \app\api\model\GoodsSpec();

        Db::startTrans();
        try {
            // 增加库存
            $list = $goodsmodel->where('order_id',$order['id'])->select();
            foreach ($list as $key => $value){
                if ($value['deduct_stock_type'] == 10){
                    $skumodel->where('goods_spec_id',$value['goods_spec_id'])->setInc('stock_num',$value['total_num']);
                }
            }

            // 已支付就退款
            if($order['pay_status'] == '20'){
                $config = Service::getConfig('wechat');
                $config['app_id'] = $config['miniapp_id'];
                $config['notify_url'] = request()->domain().'api/notify/refund/type/wechat';
                $config['return_url'] = '';
                $wechat = Pay::wechat($config);
                $refund_no = 'LQ-'.time().mt_rand(10000,99999);
                $param = [
                    'total_fee' => $order['pay_price'],
                    'refund_fee' => $order['pay_price'],
//                    'total_fee' => 1,
//                    'refund_fee' => 1,
                    'out_trade_no' => $order['order_no'],
                    'out_refund_no' => $refund_no
                ];
                $wechat->refund($param);
                $order->refund_no = $refund_no;
                $order->refund_time = time();
            }
            // 状态变为已取消
            $order->order_status = '20';
            $order->status = 'hidden';
            $order->isUpdate(true)->save();

            // 如果使用了优惠券,就把优惠券状态变为待使用或者已过期
            if($order['user_coupon_id'] > 0){
                $user_coupon = UserCoupon::get($order['user_coupon_id']);
                if($user_coupon){
                    $status = $user_coupon['endtime'] > time() ? '0' : '2';
                    $user_coupon->save(['status'=>$status]);
                }
            }
            Db::commit();
        }catch (PDOException $e){
            Db::rollback();
            return ['code' => 0,'msg' => $e->getMessage()];
        }
        return ['code' => 1,'msg' => '取消成功'];
    }

    /**
     * @ApiTitle    (评价订单详情页)
     * @ApiMethod   (POST)
     * @ApiParams   (name="id", type="integer", required=true, description="订单ID")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    'data':
        order_id:订单id
        goods_name:商品名称
        goods_id:商品id
        goods_attr:规格描述
        image_text:商品图片
    })
     */
    public function commentOrderDetail()
    {
        $order_id = $this->request->post('id');
        if (!is_numeric($order_id)) $this->error('订单id参数不合法');

        $model = new \app\api\model\OrderGoods();
        $list = $model
            ->where('order_id',$order_id)
            ->field('order_id,goods_name,goods_id,goods_attr,image')
            ->select();

        $this->success('商品列表',$list);
    }

    /**
     * @ApiTitle    (评价订单)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="data_json", type="string", required=true, description="评价数据 json对象")
     * @ApiParams   (name="order_id", type="integer", required=false, description="订单ID 不传")
     * @ApiParams   (name="score", type="integer", required=false, description="评价分数 不传")
     * @ApiParams   (name="comment", type="string", required=false, description="评价内容 不传")
     * @ApiParams   (name="goods_id", type="string", required=false, description="商品id 不传")
     * @ApiParams   (name="images", type="string", required=false, description="评价图片逗号隔开 不传")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    })
     */
    public function commentOrder()
    {
        $data = $this->request->post('data_json');
        if (!$data) $this->error('data_json参数缺失');

        $data = json_decode(htmlspecialchars_decode($data),true);
        $params = [];
        $orderids = [];
        foreach ($data as $key => $value){
            if (!is_numeric($value['order_id'])) $this->error('订单id参数不合法');
            if (!is_numeric($value['goods_id'])) $this->error('商品id参数不合法');
            if (!is_numeric($value['score']) || $value['score']>5 || $value['score']<1) $this->error('评价分数不合法');
            if (!$value['comment']) $this->error('请填写评价内容');
            if ($value['images']){
                $arr = explode(',',$value['images']);
                if (count($arr) > 3) $this->error('请上传最多3张评价图片');
            }
            $params[] = [
                'user_id' => $this->auth->id,
                'order_id' => $value['order_id'],
                'goods_id' => $value['goods_id'],
                'comment' => $value['comment'],
                'images' => $value['images'],
                'score' => $value['score'],
            ];
            $orderids[] = $value['order_id'];
        }

        $ordermodel = new \app\api\model\Order();
        $ordermodel->whereIn('id',$orderids)->update(['comment_status'=>'20','comment_time'=>time()]);
        $commentmodel = new GoodsComment();
        $commentmodel->isUpdate(false)->saveAll($params);
        $this->success('评价成功');
    }


    /**
     * @ApiTitle    (删除订单)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturn   ({
    'code':'1',
    'msg':'SUCCESS'
    })
     */
    public function delOrder()
    {
        $order_id = $this->request->post('order_id');
        if (!is_numeric($order_id)) $this->error('order_id参数不合法');
        $ordermodel = new \app\api\model\Order();
        $ordermodel->where('id',$order_id)->isUpdate()->save(['status'=>'hidden']);
        $this->success('SUCCESS');
    }

    /**
     * @ApiTitle    (订单数量)
     * @ApiMethod   (GET)
     * @ApiHeaders (name=token, type=string, required=true, description="请求的Token")
     * @ApiReturn({
        "code": 1,
        "msg": "订单数量",
        "time": "1609138878",
        "data": {
            "nopay": 2, //待支付(数量)
            "nosend": 3, //待发货(数量)
            "noget": 0, //待收货(数量)
            "nocomment": 0, //待评价(数量)
            "coupon": 0, //待使用优惠券(数量)
        }
    })
     */
    public function statusNum () {
        $model = new \app\api\model\Order();
        $nopay = $model->where([
                'status' => 'normal',
                'user_id' => $this->auth->id,
                'pay_status' => '10',
            ])->count();
        $nosend = $model->where([
            'status' => 'normal',
            'user_id' => $this->auth->id,
            'pay_status' => '20',
            'freight_status' => '10',
        ])->count();
        $noget = $model->where([
            'status' => 'normal',
            'user_id' => $this->auth->id,
            'pay_status' => '20',
            'freight_status' => '20',
            'receipt_status' => '10',
        ])->count();
        $nocomment = $model->where([
            'status' => 'normal',
            'user_id' => $this->auth->id,
            'pay_status' => '20',
            'freight_status' => '20',
            'receipt_status' => '20',
            'comment_status' => '10'
        ])->count();
        $coupon = UserCoupon::where([
            'user_id' => $this->auth->id,
            'status' => '0'
        ])->count();
        $this->success('订单数量', compact('nopay','nosend','noget','nocomment','coupon'));
    }
}