问题说明:平台和门店的运费模版均设置了不送达区域,门店下单未做拦截
修改文件:app/services/order/StoreCartServices.php
修改方法:handleCartList()
public function handleCartList(int $uid, array $cartList, array $addr = [], int $shipping_type = 1, int $store_id = 0, int $is_store_delivery_type = 0)
{
if (!$cartList) {
return [$cartList, [], [], [], 0, [], []];
}
/** @var StoreProductServices $productServices */
$productServices = app()->make(StoreProductServices::class);
/** @var MemberCardServices $memberCardService */
$memberCardService = app()->make(MemberCardServices::class);
//付费会员状态
$vipStatus = $memberCardService->isOpenMemberCardCache('vip_price', false);
/** @var UserLevelServices $userLevelServices */
$userLevelServices = app()->make(UserLevelServices::class);
//用户等级折扣
[$userInfo, $discount] = $userLevelServices->getUserInfoAndLevelDiscount($uid);
$tempIds = [];
$cityId = (int)($addr['city_id'] ?? 0);
$latitude = $this->getItem('latitude', '');
$longitude = $this->getItem('longitude', '');
$user_store_id = $this->getItem('store_id', 0);
$store_id = $store_id > 0 ? $store_id : $user_store_id;
/** @var SystemStoreServices $storeServices */
$storeServices = app()->make(SystemStoreServices::class);
$store_mention = $store_delivery = $store_city_delivery_status = true;
$deliveryType = [];
if ($store_id) {
//配送方式:1、平台配送,2、到店自提,3、门店配送
$deliverySettings = $storeServices->get(['id' => $store_id, 'is_del' => 0], ['delivery_type','city_delivery_status','city_delivery_type']);
$deliveryType = is_string($deliverySettings['delivery_type']) ? explode(',', $deliverySettings['delivery_type']) : $deliverySettings['delivery_type'];
$store_mention = in_array(2, $deliveryType);
$store_delivery = in_array(3, $deliveryType);
$store_city_delivery_status = $deliverySettings['city_delivery_status'];
}
//平台是否开启门店核销
$store_self_mention = sys_config('store_func_status', 1) && sys_config('store_self_mention') && $store_mention;
//同城配送开关
$delivery_status_mention = sys_config('city_delivery_status') && $store_delivery;
//商家自配开关
$self_delivery_status = sys_config('self_delivery_status') && $store_city_delivery_status;
if ($is_store_delivery_type != 2 && $shipping_type == 3) {
$shipping_type = 1;
}
//不送达运费模板
if ($shipping_type == 1 && $cityId) {
/** @var ShippingTemplatesServices $shippingService */
$shippingService = app()->make(ShippingTemplatesServices::class);
$tempIds = $shippingService->getNoDeliveryTempIdsByCartList($cityId, $cartList);
}
$productIds = $allStock = $attrUniquesArr = [];
if ($store_id > 0) {//平台商品,在门店购买 验证门店库存
/** @var StoreProductAttrValueServices $skuValueServices */
$skuValueServices = app()->make(StoreProductAttrValueServices::class);
/** @var StoreBranchProductServices $branchProductServics */
$branchProductServics = app()->make(StoreBranchProductServices::class);
foreach ($cartList as $cart) {
$productInfo = $cart['productInfo'] ?? [];
if (!$productInfo) continue;
$product_id = 0;
if (in_array($productInfo['type'], [0, 2])) {
$product_id = $productInfo['id'];
} else {//门店商品
if ($productInfo['pid'] && $productInfo['relation_id'] != $store_id) {//平台共享商品到另一个门店购买
$product_id = $productInfo['pid'];
}
}
if (!$product_id) {//自己门店购买不用再次验证库存
continue;
}
$productIds[] = $cart['product_id'];
$suk = '';
//类型 0:普通、1:秒杀、2:砍价、3:拼团、4:积分、5:套餐、6:预售、7:新人礼、8:抽奖、9:拼单、10:桌码、11:卡项、12:预约 、13:配送
switch ($cart['type']) {
case 0:
case 6:
case 8:
case 9:
case 10:
case 11:
case 12:
$suk = $skuValueServices->value(['unique' => $cart['product_attr_unique'], 'product_id' => $cart['product_id'], 'type' => 0], 'suk');
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 7:
if ($cart['type'] == 5 && isset($cart['discount_product_id'])) {
$product_id = $cart['discount_product_id'];
} else {
$product_id = $cart['activity_id'];
}
$suk = $skuValueServices->value(['unique' => $cart['product_attr_unique'], 'product_id' => $product_id, 'type' => $cart['type']], 'suk');
break;
}
$branchProductInfo = $branchProductServics->isValidStoreProduct((int)$cart['product_id'], $store_id);
if (!$branchProductInfo) {
continue;
}
$attrValue = '';
if ($suk) {
$attrValue = $skuValueServices->get(['suk' => $suk, 'product_id' => $branchProductInfo['id'], 'type' => 0]);
}
if (!$attrValue) {
continue;
}
$allStock[$attrValue['unique']] = $attrValue['stock'];
$attrUniquesArr[$cart['product_attr_unique']] = $attrValue['unique'];
}
} else {
$productIds = array_unique(array_column($cartList, 'product_id'));
}
$storeInfo = [];
if ($store_id) {
$storeInfo = $storeServices->getNearbyStore(['id' => $store_id], '', '', '', 1);
} else if ($latitude && $longitude) {
$storeInfo = $storeServices->getNearbyStore([], $latitude, $longitude, '', 1);
}
$valid = $invalid = [];
/** @var StoreProductLabelServices $storeProductLabelServices */
$storeProductLabelServices = app()->make(StoreProductLabelServices::class);
$productServices->setItem('isVip', $this->getItem('isVip', 0));
$siteUrl = sys_config('site_url');
//验证是否在配送范围
$isCityStoreDeliveryScope = true;
if ($shipping_type == 3) {
if (isset($addr['isCityStoreDeliveryScope'])) {
$isCityStoreDeliveryScope = $addr['isCityStoreDeliveryScope'];
} else {
$isCityStoreDeliveryScope = $storeServices->checkCityStoreDeliveryScope($uid, $store_id, $addr);
}
}
foreach ($cartList as &$item) {
$item['is_gift'] = 0;
if (isset($item['cart_type']) && $item['cart_type'] == 3) {//无码商品
$item['productInfo'] = [
'id' => 0, 'pid' => 0, 'type' => 1, 'relation_id' => $item['store_id'], 'store_name' => '无码商品', 'image' => $siteUrl . '/statics/images/product/uncensored_product_image.png', 'price' => $item['price'], 'delivery_type' => [], 'code' => '', 'bar_code' => '',
'attrInfo' => ['id' => 0, 'type' => 0, 'product_id' => 0, 'suk' => '默认', 'unique' => $item['product_attr_unique'], 'image' => $siteUrl . '/statics/images/product/uncensored_product_image.png', 'price' => $item['price'], 'stock' => 1, 'code' => '', 'bar_code' => '']
];
}
if (isset($item['productInfo']['delivery_type'])) {
$item['productInfo']['delivery_type'] = is_string($item['productInfo']['delivery_type']) ? explode(',', $item['productInfo']['delivery_type']) : $item['productInfo']['delivery_type'];
} else {
$item['productInfo']['delivery_type'] = [];
}
if (!isset($item['productInfo']['attrInfo']) || !$item['productInfo']['attrInfo']) {
$item['productInfo']['attrInfo'] = $item['attrInfo'] ?? [];
}
$item['productInfo'] = get_thumb_water($item['productInfo']);
$productInfo = $item['productInfo'];
$item['productInfo']['attrInfo'] = get_thumb_water($item['productInfo']['attrInfo']);
$item['attrStatus'] = isset($item['productInfo']['attrInfo']['stock']) && $item['productInfo']['attrInfo']['stock'];
$item['productInfo']['attrInfo']['image'] = $item['productInfo']['attrInfo']['image'] ?? $item['productInfo']['image'] ?? '';
$item['productInfo']['attrInfo']['suk'] = $item['productInfo']['attrInfo']['suk'] ?? '已失效';
//门店独立商品
$isBranchProduct = isset($productInfo['type']) && isset($productInfo['pid']) && $productInfo['type'] == 1 && !$productInfo['pid'];
$product_store_id = $isBranchProduct ? $productInfo['relation_id'] : 0;
$item['costPrice'] = $productInfo['attrInfo']['cost'] ?? $productInfo['cost'] ?? 0;
$item['trueStock'] = $item['branch_stock'] = $productInfo['attrInfo']['stock'] ?? $productInfo['stock'] ?? 0;
$item['branch_sales'] = $productInfo['attrInfo']['sales'] ?? $productInfo['sales'] ?? 0;
$item['vip_price'] = $productInfo['attrInfo']['vip_price'] ?? $productInfo['vip_price'] ?? 0;
$item['vip_truePrice'] = 0;
$item['price_type'] = '';
$item['truePrice'] = $item['sum_price'] = (float)($productInfo['attrInfo']['price'] ?? $productInfo['price'] ?? 0);
$item['service_price'] = $productInfo['reservationTimeInfo']['service_price'] ?? 0;
$item['total_price'] = bcmul((string)$item['truePrice'], (string)$item['cart_num'], 2);
$item['settle_price'] = bcmul((string)($productInfo['attrInfo']['settle_price'] ?? 0), (string)$item['cart_num'], 2);
if ((!$item['type'] || !$item['activity_id']) && !$isBranchProduct) {
[$truePrice, $vip_truePrice, $price_type] = $productServices->setLevelPrice($item['truePrice'], $uid, $userInfo, $vipStatus, $discount, $item['vip_price'], $productInfo['is_vip'] ?? 0, true, ['level_type' => $productInfo['level_type'] ?? 1, 'level_price' => $productInfo['attrInfo']['level_price'] ?? '']);
$item['truePrice'] = $truePrice;
$item['vip_truePrice'] = $vip_truePrice;
$item['price_type'] = $price_type;
}
$item['member_price'] = bcmul((string)$item['vip_truePrice'], (string)$item['cart_num'], 2);
$item['pay_price'] = bcmul((string)$item['truePrice'], (string)$item['cart_num'], 2);
$item['productInfo']['store_label'] = [];
if (isset($item['productInfo']['store_label_id']) && $item['productInfo']['store_label_id']) {
$item['productInfo']['store_label'] = $storeProductLabelServices->getLabelCache($item['productInfo']['store_label_id'], ['id', 'label_name', 'style_type', 'color', 'bg_color', 'border_color', 'icon']);
}
unset($item['attrInfo']);
$applicable_type = $item['productInfo']['applicable_type'] ?? 1;
$applicable_store_id = [];
if (isset($item['productInfo']['applicable_store_id'])) {
$applicable_store_id = is_string($item['productInfo']['applicable_store_id']) ? explode(',', $item['productInfo']['applicable_store_id']) : $item['productInfo']['applicable_store_id'];
}
$applicableStatus = $store_id <= 0 || $applicable_type == 1 || ($applicable_type == 2 && in_array($store_id, $applicable_store_id));
if (isset($item['status']) && $item['status'] == 0) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品已失效';
$invalid[] = $item;
} elseif (($item['productInfo']['type'] ?? 0) == 1 && ($item['productInfo']['pid'] ?? 0) == 0 && $storeInfo && ($item['productInfo']['relation_id'] ?? 0) != $storeInfo['id'] && $item['type'] != 10) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不属于该门店';
$invalid[] = $item;
} elseif ((isset($item['productInfo']['delivery_type']) && !$item['productInfo']['delivery_type']) || in_array($item['productInfo']['product_type'], [1, 2, 3])) {
$item['is_valid'] = 1;
$valid[] = $item;
} elseif (!$applicableStatus) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品未同步至该门店';
$invalid[] = $item;
} else {
$condition = !in_array(isset($item['productInfo']['product_id']) ? $item['productInfo']['product_id'] : $item['productInfo']['id'], $productIds) || $item['cart_num'] > ($allStock[$attrUniquesArr[$item['product_attr_unique']] ?? ''] ?? 0);
if ($item['type'] != 10) {
switch ($shipping_type) {
case -1://购物车列表展示
if ($isBranchProduct && $store_id > 0 && ($store_id != $product_store_id)) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不属于该门店';
$invalid[] = $item;
} else {
$item['is_valid'] = 1;
$valid[] = $item;
}
break;
case 1:
//快递不送达
if ($is_store_delivery_type && $deliveryType) {
if (in_array($item['productInfo']['temp_id'], $tempIds) || isset($item['productInfo']['delivery_type']) && !in_array(3, $item['productInfo']['delivery_type']) || isset($item['productInfo']['store_delivery_type']) && !in_array(1, $item['productInfo']['store_delivery_type']) || !in_array(1, $deliveryType)) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不支持快递配送/在非配送区域/门店不支持快递';
$invalid[] = $item;
} elseif ($isBranchProduct && $store_id > 0 && $store_id != $product_store_id) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不是该门店添加的独立商品';
$invalid[] = $item;
} else {
$item['is_valid'] = 1;
$valid[] = $item;
}
} else {
if (in_array($item['productInfo']['temp_id'], $tempIds) || (isset($item['productInfo']['delivery_type']) && !in_array(1, $item['productInfo']['delivery_type']))) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不支持快递配送/在非配送区域';
$invalid[] = $item;
} elseif ($isBranchProduct && $store_id > 0 && ($store_id != $product_store_id || !in_array(1, $item['productInfo']['delivery_type']))) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不支持门店快递配送/商品是属于该门店';
$invalid[] = $item;
} elseif ((in_array($productInfo['type'], [0, 2]) || $productInfo['relation_id'] != $store_id) && $store_id > 0 && ($condition || (!in_array(1, $item['productInfo']['delivery_type'])))) {//平台商品 在门店购买 验证门店库存
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品在门店中没有库存/不支持门店配送';
$invalid[] = $item;
} else {
$item['is_valid'] = 1;
$valid[] = $item;
}
}
break;
case 2:
//不支持到店核销
if (!$store_self_mention) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '平台/门店已关闭核销';
$invalid[] = $item;
} elseif (isset($item['productInfo']['delivery_type']) && $item['productInfo']['delivery_type'] && !in_array(2, $item['productInfo']['delivery_type'])) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不支持到店核销';
$invalid[] = $item;
} elseif ($isBranchProduct && $store_id > 0 && $store_id != $product_store_id) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不属于该门店';
$invalid[] = $item;
} elseif ($item['productInfo']['product_type'] == 1) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品是卡密商品';
$invalid[] = $item;
} elseif ((in_array($productInfo['type'], [0, 2]) || $productInfo['relation_id'] != $store_id) && $store_id > 0 && $condition) {//平台、供应商商品 在门店购买 验证门店库存
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品在门店中没有库存';
$invalid[] = $item;
} else {
$item['is_valid'] = 1;
$valid[] = $item;
}
break;
case 3:
//不支持同城配送
if (!$delivery_status_mention) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '平台/门店已关闭同城配送';
$invalid[] = $item;
}elseif (!$self_delivery_status) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '平台/门店已关闭了同城配送商家自配';
$invalid[] = $item;
} elseif (isset($item['productInfo']['delivery_type']) && $item['productInfo']['delivery_type'] && !in_array(3, $item['productInfo']['delivery_type'])) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不支持门店配送';
$invalid[] = $item;
} elseif (isset($item['productInfo']['store_delivery_type']) && $item['productInfo']['store_delivery_type'] && !in_array(2, $item['productInfo']['store_delivery_type'])) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品门店配送方式不正确';
$invalid[] = $item;
} elseif ($isBranchProduct && $store_id > 0 && $store_id != $product_store_id) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不属于该门店';
$invalid[] = $item;
} elseif ((in_array($productInfo['type'], [0, 2]) || $productInfo['relation_id'] != $store_id) && $store_id > 0 && $condition) {//平台、供应商商品 在门店购买 验证门店库存
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品在门店中没有库存';
$invalid[] = $item;
} elseif (!$isCityStoreDeliveryScope) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品超出配送/核销范围';
$invalid[] = $item;
} else {
$item['is_valid'] = 1;
$valid[] = $item;
}
break;
case 4:
//无库存||下架
if ($isBranchProduct && $store_id > 0 && $store_id != $product_store_id) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品超出配送/核销范围';
$invalid[] = $item;
} elseif (in_array($productInfo['type'], [0, 2]) && $store_id > 0 && $condition) {
$item['is_valid'] = 0;
$invalid[] = $item;
} else {
$item['is_valid'] = 1;
$valid[] = $item;
}
break;
default:
$item['is_valid'] = 1;
$valid[] = $item;
break;
}
} else {
if ($isBranchProduct && $store_id > 0 && $store_id != $product_store_id) {
$item['is_valid'] = 0;
$item['invalid_desc'] = '此商品不属于该门店';
$invalid[] = $item;
} elseif (in_array($productInfo['type'], [0, 2]) && $store_id > 0 && $condition) {
$item['is_valid'] = 0;
$invalid[] = $item;
} else {
$item['is_valid'] = 1;
$valid[] = $item;
}
}
}
unset($item['attrInfo']);
}
return [$cartList, $valid, $invalid];
}
