| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 | <?php/** * Created by PhpStorm. * User: zhengmingwei * Date: 2019/10/27 * Time: 5:37 下午 */namespace addons\unishop\controller;use addons\unishop\extend\Hashids;use addons\unishop\model\Config;use addons\unishop\model\Product;use addons\unishop\model\Cart as CartModel;use think\Exception;/** * 购物车 */class Cart extends Base{    /**     * 允许频繁访问的接口     * @var array     */    protected $frequently = ['number_change', 'choose_change'];    /**     * @ApiTitle    (列表)     * @ApiSummary  (购物车列表)     * @ApiMethod   (GET)     * @ApiHeaders  (name=token, type=string, required=true, description="用户登录的Token", sample="a2e3cc70-d2d1-41e6-9c14-f1d774ee5e1e")     * @ApiHeaders  (name=cookie, type=string, required=false, description="用户会话的cookie")     * @ApiReturn   ({"code":1,"msg":"","data":[]})     *     * @ApiReturnParams  (name="market_price", type="string", description="市场价")     * @ApiReturnParams  (name="sales_price", type="string", description="销售价")     * @ApiReturnParams  (name="stock", type="integer", description="库存")     * @ApiReturnParams  (name="sales", type="integer", description="销量")     * @ApiReturnParams  (name="image", type="string", description="图片")     * @ApiReturnParams  (name="title", type="string", description="商品名称")     * @ApiReturnParams  (name="choose", type="integer", description="是否选中")     * @ApiReturnParams  (name="isset", type="integer", description="是否生效")     * @ApiReturnParams  (name="cart_id", type="integer", description="购物车id")     * @ApiReturnParams  (name="spec", type="string", description="选中的规格")     * @ApiReturnParams  (name="number", type="integer", description="数量")     * @ApiReturnParams  (name="oldPrice", type="string", description="旧价格")     * @ApiReturnParams  (name="nowPrice", type="string", description="现价格")     * @ApiReturnParams  (name="product_id", type="string", description="商品id")     *     */    public function index()    {        $carts = (new CartModel)->where(['user_id' => $this->auth->id])            ->with([                'product' => function ($query) {                    $query->field(['id', 'image', 'title', 'specTableList','sales','market_price','sales_price','stock','use_spec', 'switch']);                }            ])            ->order(['createtime' => 'desc'])            ->select();        if (!$carts) {            $this->success('', []);        }        $data = [];        $productExtend = new \addons\unishop\extend\Product;        foreach ($carts as $item) {            $oldProduct = json_decode($item['snapshot'], true);            $oldData = $productExtend->getBaseData($oldProduct, $item['spec'] ?? '');            if (empty($item['product'])) {                $tempData = $oldData;                $tempData['isset'] = false; // 失效                $tempData['title'] = $oldProduct['title'];                $tempData['choose'] = 0;            } else {                $productData = $item['product']->getData();                $tempData = $productExtend->getBaseData($productData, $item['spec'] ?? '');                $tempData['title'] = $item['product']['title'];                $tempData['choose'] = $item['choose']; //是否选中                $tempData['isset'] = true;                if ($productData['switch'] == Product::SWITCH_OFF) {                    $tempData['isset'] = false; // 失效                    $tempData['choose'] = 0;                }            }            $tempData['cart_id'] = $item['id'];            $tempData['spec'] = $item['spec'];            $tempData['number'] = $item['number'];            $tempData['image'] = Config::getImagesFullUrl($oldData['image']);            $tempData['oldPrice'] = round($oldData['sales_price'], 2);            $tempData['nowPrice'] = round($tempData['sales_price'], 2);            $tempData['product_id'] = Hashids::encodeHex($item['product_id']);            $data[] = $tempData;        }        $this->success('', $data);    }    /**     * @ApiTitle    (添加)     * @ApiSummary  (添加商品到购物车)     * @ApiMethod   (GET)     * @ApiHeaders  (name=token, type=string, required=true, description="用户登录的Token", sample="a2e3cc70-d2d1-41e6-9c14-f1d774ee5e1e")     * @ApiHeaders  (name=cookie, type=string, required=false, description="用户会话的cookie")     * @ApiParams   (name="id", type="string", description="商品id")     * @ApiReturn   ({"code":1,"msg":"添加成功","data":1})     */    public function add()    {        $id = $this->request->get('id', 0);        $id = \addons\unishop\extend\Hashids::decodeHex($id);        $product = (new Product)->where(['id' => $id, 'switch' => Product::SWITCH_ON])->find();        if (!$product) {            $this->error('产品不存在或已下架');        }        $spec = $this->request->get('spec', '');        $productBase = (new \addons\unishop\extend\Product())->getBaseData($product->getData(), $spec);        if (!$productBase['stock'] || $productBase['stock'] <= 0) {            $this->error('库存不足');        }        $user_id = $this->auth->id;        $cartModel = new \addons\unishop\model\Cart();        $cartModel->where(['user_id' => $user_id, 'product_id' => $id]);        $spec && $cartModel->where('spec', $spec);        $oldCart = $cartModel->find();        if ($oldCart) {            $this->error('商品已存在购物车');//            $oldCart->number++;//            $result = $oldCart->save();        } else {            $cartModel->user_id = $user_id;            $cartModel->product_id = $id;            $spec && $cartModel->spec = $spec;            $cartModel->number = 1;            $cartModel->snapshot = json_encode($product->getData(), true);            $result = $cartModel->save();        }        if ($result) {            $this->success('添加成功', 1);        } else {            $this->error('添加失败');        }    }    /**     * @ApiTitle    (删除)     * @ApiSummary  (删除购物车的商品支持多个删除用','号隔开购物车id)     * @ApiMethod   (POST)     * @ApiHeaders  (name=token, type=string, required=true, description="用户登录的Token", sample="a2e3cc70-d2d1-41e6-9c14-f1d774ee5e1e")     * @ApiHeaders  (name=cookie, type=string, required=false, description="用户会话的cookie")     * @ApiParams   (name="id", type="string", description="购物车id,多个的话用','号隔开")     * @ApiReturn   ({"code":1,"msg":"删除成功","data":1})     */    public function delete()    {        $id = $this->request->post('id', 0);        $userId = $this->auth->id;        $result = CartModel::destroy(function ($query) use ($id, $userId) {            $query->whereIn('id', $id)->where(['user_id' => $userId]);        });        if ($result) {            $this->success('删除成功', 1);        } else {            $this->error('删除失败', 0);        }    }    /**     * @ApiTitle    (修改购物车数量)     * @ApiSummary  (修改购物车数量)     * @ApiMethod   (GET)     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")     * @ApiParams  (name="id", type=integer, required=true, description="购物车id")     * @ApiParams  (name="number", type=integer, required=true, description="数量")     * @ApiReturn   ({"code":1,"msg":"更改成功","data":数量})     */    public function number_change()    {        $cart_id = $this->request->get('id', 0);        $number = $this->request->get('number', 1);        $cart = CartModel::get(['id' => $cart_id, 'user_id' => $this->auth->id]);        if (empty($cart)) {            $this->error('此商品不存在购物车');        }        $cart->number = $number;        $result = $cart->save();        if ($result) {            $this->success('更改成功', $number);        } else {            $this->error('更改失败', $number);        }    }    /**     * @ApiTitle    (修改购物车选中状态)     * @ApiSummary  (修改购物车选中状态)     * @ApiMethod   (POST)     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")     * @ApiParams  (name="trueArr", type=string, required=true, description="选中的购物车id,多个的话用','号隔开")     * @ApiParams  (name="falseArr", type=string, required=true, description="不选的购物车id,多个的话用','号隔开")     * @ApiReturn   ({"code":1,"msg":"","data":数量})     */    public function choose_change()    {        $trueArr = $this->request->post('trueArr', false);        $falseArr = $this->request->post('falseArr', false);        $user_id = $this->auth->id;        try {            $cart = new CartModel();            if ($trueArr) {                $cart->save(['choose' => CartModel::CHOOSE_ON], function ($query) use ($user_id, $trueArr) {                    $query->where('user_id', $user_id)->where('id', 'IN', $trueArr);                });            }            if ($falseArr) {                $cart->save(['choose' => CartModel::CHOOSE_OFF], function ($query) use ($user_id, $falseArr) {                    $query->where('user_id', $user_id)->where('id', 'IN', $falseArr);                });            }        } catch (Exception $e) {            $this->error('更新失败', 0);        }        $this->success('', 1);    }}
 |