Order.php 16.7 KB
<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\controller\Wechat;
use think\Db;

/**
 * 订单
 */
class Order extends Api
{
    protected $noNeedLogin = [];
    protected $noNeedRight = '*';

    public function _initialize()
    {
        parent::_initialize();
        $this->model = model('app\common\model\Order');
        $this->user = $this->auth->getUser();
    }

    /**
     * 我的订单-列表
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="type", type="string", required=true, description="订单类型:all=全部,payment=待付款,delivery=待发货,receive=待收货,appraise=待评价")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function index($type)
    {
        $list = $this->model->getList($this->user['id'], $type);
        $this->success(__('成功'),compact('list'));
    }

    /**
     * 我的订单-修改地址
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiParams   (name="user_address_id", type="integer", required=true, description="用户地址")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function editAddress($order_id,$user_address_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        if(!$address = \app\common\model\UserAddress::detail($this->user['id'],$user_address_id)){
            $this->error(__('地址不存在'));
        }
        $res = $order['address']->allowField(true)->save([
            'user_address_id' => $user_address_id,
            'name' => $address['name'],
            'phone' => $address['phone'],
            'province_id' => $address['province_id'],
            'city_id' => $address['city_id'],
            'district_id' => $address['district_id'],
            'detail' => $address['detail'],
        ]);
        $this->success(__('地址修改成功'));
    }

    /**
     * 我的订单-详情
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功',
         'data':'订单状态:payment=待支付,delivery=待发货,receive:待收货,appraise=待评价,completed=已完成,refund_1=退款申请中,refund_2=已退款,refund_3=已拒绝,return_goods_1=退货申请中,return_goods_2=已退款,return_goods_3=已拒绝'
        })
     */
    public function detail($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        $this->success(__('成功'),compact('order'));
    }

    /**
     * 我的订单-取消订单
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function cancel($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        if ($order->cancel()) {
            $this->success(__('订单取消成功'));
        }
        $this->error($order->getError());
    }

    /**
     * 我的订单-去支付
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function pay($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        if ($order['pay_status'] == '1') {
            $this->error(__('该订单不合法'));
        }
        // 判断商品状态、库存
        if (!$order->checkGoodsStatusFromOrder($order['goods'])) {
            return $this->renderError($order->getError());
        }
        // 发起微信支付
        $Wechat = new Wechat;
        $order['order_price'] = 0.01;//测试金额
        if(!$payment = $Wechat->wxPay($order['order_no'], $this->user['openid'], $order['order_price'])){
            $this->error($Wechat->getError());
        }
        $this->success(__('订单支付成功'),[
            'payment' => $payment,
            'order_id' => $order['id']
        ]);
        // (new Cart)->notifyTest($order['order_no']);
        $this->success(__('订单支付成功'));
    }

    /**
     * 我的订单-提醒发货
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function remind($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        if ($order->remind()) {
            $this->success(__('提醒发货成功'));
        }
        $this->error($order->getError());
    }

    /**
     * 我的订单-查询物流
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function orderTraces($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        if ($data = $order->orderTraces()) {
            $this->success(__('查询物流成功'),[
                'express_company' => $order['express_company'],
                'express_no' => $order['express_no'],
                'list' => $data
            ]);
        }
        $this->error($order->getError());
    }

    /**
     * 我的订单-确认收货
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function receive($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        if ($order->receive()) {
            $this->success(__('确认收货成功'));
        }
        $this->error($order->getError());
    }

    /**
     * 我的订单-申请退款页面
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function refundView($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        $refund_reason = config('site.refundreason') ?: [];//退款理由
        $refund_reason = str_replace("\r\n", "\n", $refund_reason);//防止不兼容
        $refund_reason = explode("\n", $refund_reason);
        $this->success(__('成功'),compact('order','refund_reason'));
    }

    /**
     * 我的订单-申请退款
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiParams   (name="reason", type="string", required=true, description="退款原因")
     * @ApiParams   (name="explain", type="string", required=true, description="退款说明")
     * @ApiParams   (name="images", type="string", required=true, description="退款凭证,多个图片用英文逗号分隔")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function refund()
    {
        $post = $this->request->post();
        if(!$order = $this->model->getUserOrderDetail($post['order_id'], $this->user['id'])){
            $this->error($this->model->getError());
        }
        if ($order->toRefund($post)) {
            $this->success(__('申请退款成功,请耐心等待'));
        }
        $this->error($order->getError());
    }

    /**
     * 我的订单-申请退货页面
     * @ApiMethod   (GET)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function returnGoodsView($order_id)
    {
        if(!$order = $this->model->getUserOrderDetail($order_id, $this->user['id'])){
            $this->error($this->model->getError());
        }
        // 退款理由
        $refund_reason = config('site.refundreason') ?: [];
        $refund_reason = str_replace("\r\n", "\n", $refund_reason);//防止不兼容
        $refund_reason = explode("\n", $refund_reason);
        // 退货理由
        $return_goods_reason = config('site.return_goods_reason') ?: [];
        $return_goods_reason = str_replace("\r\n", "\n", $return_goods_reason);//防止不兼容
        $return_goods_reason = explode("\n", $return_goods_reason);
        $this->success(__('成功'),compact('order','refund_reason','return_goods_reason'));
    }

    /**
     * 我的订单-申请退货
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiParams   (name="goods_status", type="string", required=true, description="商品状态")
     * @ApiParams   (name="reason", type="string", required=true, description="退货原因")
     * @ApiParams   (name="explain", type="string", required=true, description="退货说明")
     * @ApiParams   (name="images", type="string", required=true, description="退货凭证,多个图片用英文逗号分隔")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function returnGoods()
    {
        $post = $this->request->post();
        if(!$order = $this->model->getUserOrderDetail($post['order_id'], $this->user['id'])){
            $this->error($this->model->getError());
        }
        if ($order->returnGoods($post)) {
            $this->success(__('申请退货成功,请耐心等待'));
        }
        $this->error($order->getError());
    }

    /**
     * 我的订单-评价
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="order_id", type="integer", required=true, description="订单ID")
     * @ApiParams   (name="goods_appraise", type="object", required=true, description="[{'goods_id':'商品一ID','star':'评价星级','content':'评价内容','images':'评价图片,多图用英文逗号分隔'},{'goods_id':'商品二ID','star':'评价星级','content':'评价内容','images':'评价图片,多图用英文逗号分隔'}]")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object", description="扩展数据返回")
     * @ApiReturn   ({
         'code':'1',
         'msg':'返回成功'
        })
     */
    public function appraise()
    {
        $post = $this->request->post();
        if(!$order = $this->model->getUserOrderDetail($post['order_id'], $this->user['id'])){
            $this->error($this->model->getError());
        }
        empty($post['goods_appraise']) && $this->error(__('请填写评价'));
        if(is_string($post['goods_appraise'])){
            $post['goods_appraise'] = htmlspecialchars_decode($post['goods_appraise']);
            $post['goods_appraise'] = json_decode($post['goods_appraise'],true);
        }elseif(is_object($post['goods_appraise'])){
            $post['goods_appraise'] = json_decode($post['goods_appraise'],true);
        }
        $appraiseList = [];
        foreach ($post['goods_appraise'] as $appraise) {
            $appraiseList[] = [
                'user_id' => $this->user['id'],
                'order_id' => $post['order_id'],
                'goods_id' => $appraise['goods_id'],
                'star' => $appraise['star'],
                'content' => $appraise['content'],
                'images' => $appraise['images']
            ];
        }
        Db::startTrans();
        // 保存评价信息
        (new \app\common\model\GoodsAppraise)->saveAll($appraiseList);
        $order->save([
            'appraise_status' => '1',
            'appraise_time' => time(),
        ]);
        Db::commit();
        $this->success(__('评价成功'));
    }
}