admin/app/common/model/release/Cart.php
New file
@@ -0,0 +1,231 @@
<?php
namespace app\api\model\plus\repair;
use app\api\model\order\Order as OrderModel;
use think\facade\Cache;
use app\api\model\plus\repair\Project as ProjectModel;
use app\common\model\supplier\Supplier as SupplierModel;
use app\common\library\helper;
use app\common\model\plus\repair\Cart as CartModel;
/**
 * 购物车管理
 */
class Cart extends CartModel
{
    // 错误信息
    public $error = '';
    /**
     * 购物车列表 (含商品信息)
     */
    public function getList($user, $cart_ids = [])
    {
        // 获取购物车商品列表
        return $this->getOrderProjectList($user, $cart_ids);
    }
    /**
     * 获取购物车列表
     */
    public function getCartList($cartIds = null)
    {
        if (empty($cartIds)) return static::$cart;
        $cartList = [];
        $indexArr = (strpos($cartIds, ',') !== false) ? explode(',', $cartIds) : [$cartIds];
        foreach ($indexArr as $index) {
            isset(static::$cart[$index]) && $cartList[$index] = static::$cart[$index];
        }
        return $cartList;
    }
    /**
     * 获取购物车中的商品列表
     */
    public function getOrderProjectList($user, $cart_ids = [])
    {
        // 购物车列表
        $projectList = [];
        // 获取购物车列表
        $model = $this;
        if ($cart_ids) {
            $model = $model->where('cart_id', 'in', explode(',', $cart_ids));
        }
        $cartList = $model->where('user_id', '=', $user['user_id'])->select();
        if (empty($cartList)) {
            $this->setError('当前购物车没有项目');
            return $projectList;
        }
        // 购物车中所有商品id集
        $projectIds = array_unique(helper::getArrayColumn($cartList, 'project_id'));
        // 获取并格式化商品数据
        $sourceData = (new ProjectModel)->getListByIds($projectIds);
        $sourceData = helper::arrayColumn2Key($sourceData, 'project_id');
        // 供应商信息
        $supplierData = [];
        // 格式化购物车数据列表
        foreach ($cartList as $key => $item) {
            // 判断商品不存在则自动删除
            if (!isset($sourceData[$item['project_id']])) {
                $this->delete($key);
                continue;
            }
            // 项目信息
            $project = clone $sourceData[$item['project_id']];
            // 判断商品是否已删除
            if (empty($project)) {
                $this->delete($key);
                continue;
            }
            // 购买数量
            $project['total_num'] = $item['total_num'];
            // 总价
            $project['total_price'] = bcmul($project['price'], $item['total_num'], 2);
            // 总佣金
            $project['total_money'] = bcmul($project['money'], $item['total_num'], 2);
            // 供应商
            $project['shop_supplier_id'] = $item['shop_supplier_id'];
            //购物车id
            $project['cart_id'] = $item['cart_id'];
            $projectList[] = $project;
        }
        $supplierIds = array_unique(helper::getArrayColumn($projectList, 'shop_supplier_id'));
        foreach($supplierIds as $supplierId){
            $supplierData[] = [
                'shop_supplier_id' => $supplierId,
                'supplier' => SupplierModel::detail($supplierId),
                'projectList' => $this->getProjectBySupplier($supplierId, $projectList)
            ];
        }
        return $supplierData;
    }
    private function getProjectBySupplier($supplierId, $projectList)
    {
        $result = [];
        foreach ($projectList as $project){
            if($project['shop_supplier_id'] == $supplierId){
                array_push($result, $project);
            }
        }
        return $result;
    }
    /**
     * 加入购物车
     */
    public function add($user, $projectId, $projectNum)
    {
        $model = $this;
        // 获取信息
        $project = ProjectModel::detail($projectId);
        // 获取商品购物车信息
        $cartDetail = $model->where('user_id', '=', $user['user_id'])
            ->where('project_id', '=', $projectId)
            ->find();
        // 验证能否加入
        if (!$project_price = $this->checkProject($project)) {
            return false;
        }
        // 记录到购物车列表
        if ($cartDetail) {
            return $cartDetail->save(['total_num' => $cartDetail['total_num'] + $projectNum]);
        } else {
            return $this->save([
                'user_id' => $user['user_id'],
                'project_id' => $projectId,
                'total_num' => $projectNum,
                'join_price' => $project_price,
                'shop_supplier_id' => $project['shop_supplier_id'],
                'app_id' => self::$app_id,
            ]);
        }
    }
    /**
     * 验证是否可以下单
     */
    private function checkProject($project)
    {
        // 判断项目
        if (!$project) {
            $this->setError('很抱歉,信息不存在');
            return false;
        }
        return $project['price'];
    }
    /**
     * 减少购物车中某商品数量
     */
    public function sub($user, $projectId)
    {
        $cartDetail = $this->where('user_id', '=', $user['user_id'])
            ->where('project_id', '=', $projectId)
            ->find();
        if ($cartDetail['total_num'] <= 1) {
            return $cartDetail->delete();
        } else {
            $cartDetail->save(['total_num' => $cartDetail['total_num'] - 1]);
        }
    }
    /**
     * 删除购物车中指定商品
     * @param string $cartIds (支持字符串ID集)
     */
    public function setDelete($user, $cart_id)
    {
        return $this->where('user_id', '=', $user['user_id'])->where('cart_id', 'in', explode(',', $cart_id))->delete();
    }
    /**
     * 获取当前用户购物车商品总数量(含件数)
     */
    public function getTotalNum($user)
    {
        $num = $this->where('user_id', '=', $user['user_id'])->sum('total_num');
        return $num ? $num : 0;
    }
    /**
     * 获取当前用户购物车商品总数量(不含件数)
     */
    public function getProductNum($user)
    {
        return $this->where('user_id', '=', $user['user_id'])->count();
    }
    /**
     * 清空当前用户购物车
     */
    public function clearAll($user, $cartIds)
    {
        return $this->where('user_id', '=', $user['user_id'])
            ->where('cart_id', 'in', explode(',', $cartIds))
            ->delete();
    }
    /**
     * 设置错误信息
     */
    private function setError($error)
    {
        empty($this->error) && $this->error = $error;
    }
    /**
     * 获取错误信息
     */
    public function getError()
    {
        return $this->error;
    }
}