Order.php 14.5 KB
<?php

namespace app\api\controller;

use app\common\controller\Api;
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($user['id'],$address)){
            $this->error(__('地址不存在'));
        }
        $res = \app\common\model\OrderAddress::save([
            'name' => $order['address']['name'],
            'phone' => $order['address']['phone'],
            'province_id' => $order['address']['province_id'],
            'city_id' => $order['address']['city_id'],
            'district_id' => $order['address']['district_id'],
            'detail' => $order['address']['detail'],
        ],['order_id'=>$order['id']]);
        $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 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;
        // if(!$payment = $Wechat->wxPay($model['order_no'], $this->user['openid'], $order['order_price']);){
        //     $this->error($Wechat->getError());
        // }
        $this->notifyTest($model['order_no']);
        $this->success(__('成功'),[
            'payment' => '成功',
            'order_id' => $model['id']
        ]);
    }

    /**
     * 我的订单-提醒发货
     * @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 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")
     * @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(__('请填写评价'));
        $goods_appraise = json_decode($post['goods_appraise'],true);
        $appraiseList = [];
        foreach ($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(__('评价成功'));
    }
}