HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot//my.esfyn.top/Modules/Api/Http/Controllers/OrderController.php
<?php

namespace Modules\Api\Http\Controllers;

use Expand\Pay\Pay;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use Modules\Api\Http\Requests\OrderSubmitRequest;
use Modules\Order\Models\Order;
use Modules\Order\Models\OrderGoods;
use Modules\Shop\Models\Cart;
use Modules\Shop\Models\Goods;

class OrderController extends ApiController
{
    /**
     * 购物车结算
     * @return JsonResponse
     */
    public function cartSettle(): JsonResponse
    {
        $uid = $this->getUserId();
        $cartIds = json_decode($this->param('cart_ids'), true);

        if ($cartIds) {

            $goodsList = [];

            $carts = Cart::with('goods:id,goods_name,goods_image,shop_price,market_price')
                ->whereIn('id', $cartIds)
                ->where('user_id', $uid)
                ->get()
                ->toArray();

            foreach ($carts as $cart) {

                $goods = $this->objectFilterField($cart['goods'], ['id'], true);

                $goodsList[] = array_merge($goods, [
                    'id' => $cart['id'],
                    'goods_id' => $cart['goods_id'],
                    'number' => $cart['number'],
                    'goods_image' => system_image_url($goods['goods_image']),
                    'total' => $cart['number'] * $goods['shop_price']
                ]);

            }

            $result = [
                'result' => [
                    'total' => array_sum(array_column($goodsList, 'total')),
                    'goodsList' => $goodsList,
                ]
            ];

            return $this->success($result);
        }

        return $this->error(['msg' => '请选择结算商品']);

    }

    /**
     * 商品直接购买
     * @return JsonResponse
     */
    public function directSettle(): JsonResponse
    {
        $goodsId = $this->param('goods_id', 'intval');
        $number = $this->param('number', 'intval');

        if ($goodsId && $number) {

            if (app('store')->checkGoodsStock($goodsId, $number) == false) {

                return $this->error(['msg' => "商品库存不足"]);
            }

            $goods = Goods::find($goodsId)->toArray();

            if (!$goods) {

                return $this->error(['msg' => "商品不存在"]);
            }

            $goods = $this->objectFilterField($goods, ['goods_name', 'goods_image', 'shop_price', 'market_price']);

            $result = [
                'result' => [
                    'total' => $goods['shop_price'] * $number,
                    'goodsList' => [
                        array_merge($goods, [
                            'total' => $goods['shop_price'] * $number,
                            'goods_id' => $goodsId,
                            'goods_image' => system_image_url($goods['goods_image'])
                        ])
                    ],
                ]
            ];

            return $this->success($result);
        }

        return $this->error(['msg' => '请选择结算商品']);
    }


    /**
     * 提交订单
     * @param OrderSubmitRequest $request
     * @return JsonResponse
     */
    public function submit(OrderSubmitRequest $request): JsonResponse
    {

        $uid = $this->getUserId();
        $data = $request->validated();

        $params = json_decode($data['param_json'], true);

        if ($params) {

            $cartIds = array_column($params, 'cart_id');

            if ($cartIds) {

                $carts = app('store')->cart($uid, $cartIds);

                if ($carts->count() == 0) {

                    return $this->error(['msg' => '购物车里没有该商品']);
                }
            }

            foreach ($params as &$param) {

                $param['sku_id'] = $param['sku_id'] ?? 0;

                if ($param['goods_id'] && $param['number']) {

                    $stock = app('store')->checkGoodsStock($param['goods_id'], $param['number'], $param['sku_id']);

                    if (!$stock) {

                        return $this->error(['msg' => "商品库存不足"]);
                    }


                    $goods = Goods::find($param['goods_id']);

                    $param['sku_val'] = '';
                    $param['goods_name'] = $goods->goods_name;
                    $param['goods_image'] = $goods->goods_image;
                    $param['market_price'] = $goods->market_price;
                    $param['shop_price'] = $goods->shop_price;


                    if ($param['sku_id'] > 0) {

                        $sku = app('store')->getGoodsSkuInfo($param['goods_id'], $param['sku_id']);

                        $param['sku_val'] = $sku->spec_name;
                        $param['goods_image'] = $sku->img ?: $goods->goods_image;
                        $param['market_price'] = $sku->market_price;
                        $param['shop_price'] = $sku->shop_price;
                    }

                    $param['total'] = $param['number'] * $param['shop_price'];

                }
            }

            $address = app('user')->address($data['address_id'], $uid);

            if (!$address) {

                return $this->error(['msg' => '收货地址不存在']);
            }

            DB::beginTransaction();

            $goodsMoney = array_sum(array_column($params, 'total'));
            $freight = app('store')->freightTotal($goodsMoney);

            $order = [
                'user_id' => $uid,
                'order_sn' => app('store')->makeOrderSn(),
                'out_trade_no' => '',
                'order_amount' => $goodsMoney + $freight,
                'goods_money' => $goodsMoney,
                'delivery_money' => $freight,
                'order_status' => Order::ORDER_STATUS_WAIT_PAY,
                'pay_status' => Order::PAY_STATUS_WAIT,
                'delivery_status' => Order::DELIVERY_STATUS_WAIT,
                'pay_type' => '',
                'delivery_type' => '',
                'delivery_code' => '',
                'receive_name' => $address->name,
                'receive_telephone' => $address->telephone,
                'receive_province' => $address->province_id,
                'receive_city' => $address->city_id,
                'receive_district' => $address->district_id,
                'receive_address' => $address->address,
                'create_time' => time(),
                'pay_time' => 0,
                'delivery_time' => 0,
                'close_time' => 0,
                'remark' => $data['remark'] ?? '',
            ];

            $orderId = Order::insert($order);

            foreach ($params as $item) {

                $orderGoods = [
                    'order_id' => $orderId,
                    'user_id' => $uid,
                    'goods_id' => $item['goods_id'],
                    'goods_name' => $item['goods_name'],
                    'goods_image' => $item['goods_image'],
                    'market_price' => $item['market_price'],
                    'shop_price' => $item['shop_price'],
                    'number' => $item['number'],
                    'sku_id' => $item['sku_id'],
                    'sku_val' => $item['sku_val'],
                    'goods_money' => $item['number'] * $item['shop_price'],
                ];

                OrderGoods::insert($orderGoods);

                app('store')->reduceGoodsStock($item['goods_id'], $item['number'], $item['sku_id']);
            }

            if ($orderId) {

                if ($cartIds) {

                    Cart::whereIn('id', $cartIds)->delete();
                }

                DB::commit();

                return $this->success(['order_sn' => $order['order_sn']]);

            } else {

                DB::rollBack();

                return $this->error();
            }
        }

        return $this->error(['msg' => '请选择结算商品']);
    }


    /**
     * 用户订单列表
     * @return JsonResponse
     */
    public function orders(): JsonResponse
    {
        $uid = $this->getUserId();
        $status = $this->param('status');
        $status = $status === '' || intval($status) < 0 ? false : intval($status);
        $page = $this->param('page', 'intval', 1);
        $limit = $this->param('limit', 'intval', 10);

        $result = [];
        $orders = app('order')->userOrders($uid, $status, $page, $limit);

        if ($orders) {

            $result = $this->pageFilterField($orders);
            $result['data'] = [];

            foreach ($orders as $item) {

                $item = app('order')->formatOrder($item);

                $result['data'][] = $this->objectFilterField($item, [
                    'updated_at', 'created_at'
                ], true);
            }
        }

        return $this->success(['result' => $result]);
    }


    /**
     * 订单详情
     * @param $orderSn
     * @return JsonResponse
     */
    public function orderDetail($orderSn): JsonResponse
    {
        $result = [];
        $uid = $this->getUserId();

        $order = Order::with([
            'goods',
            'province:id,name',
            'city:id,name',
            'district:id,name'
        ])->where('order_sn', $orderSn)
            ->where('user_id', $uid)
            ->first();

        if ($order) {

            if ($order->delivery_status > 0) {

                $order->logistics = order_logistics_detail($order->delivery_type, $order->delivery_code);
            }

            $result = app('order')->formatOrder($order);
        }

        return $this->success(['result' => $result]);
    }

    /**
     * 订单完成
     * @param $orderSn
     * @return JsonResponse
     */
    public function finish($orderSn): JsonResponse
    {
        $uid = $this->getUserId();

        $order = Order::where('order_sn', $orderSn)->where('user_id', $uid)->first();

        if ($order && $order->order_status == Order::ORDER_STATUS_WAIT_RECEIVE) {

            $order->order_status = Order::ORDER_STATUS_FINISH;
            $order->finish_time = time();
            $order->save();

            return $this->success(['msg' => '订单完成']);
        }

        return $this->error(['msg' => '订单确认失败,请检查订单信息']);
    }


    /**
     * 取消订单
     * @param $orderSn
     * @return JsonResponse
     */
    public function cancel($orderSn): JsonResponse
    {
        $uid = $this->getUserId();

        $order = Order::where('order_sn', $orderSn)->where('user_id', $uid)->first();

        if ($order && in_array($order->order_status, [Order::ORDER_STATUS_WAIT_PAY, Order::ORDER_STATUS_WAIT_DELIVER])) {

            if ($order->order_status == Order::ORDER_STATUS_WAIT_DELIVER) {

                $pay = new Pay($order->pay_type);
                $pay->refund($order->toArray());

                $order->order_status = Order::ORDER_STATUS_REFUND;

            } else {

                $order->order_status = Order::ORDER_STATUS_CANCEL;
            }

            $order->close_time = time();
            $order->save();

            return $this->success(['msg' => '订单取消成功']);
        }

        return $this->error(['msg' => '订单取消失败']);
    }
}