bztang-admin/app/common/services/member/center/MemberCenterService.php

537 lines
21 KiB
PHP

<?php
namespace app\common\services\member\center;
use app\backend\modules\order\models\Order;
use app\common\helpers\Cache;
use app\common\models\Income;
use app\common\models\Member;
use app\common\models\MemberShopInfo;
use app\common\services\LangService;
use app\common\services\popularize\PortType;
use app\frontend\models\Goods;
use app\frontend\models\Order as FrontendOrder;
use app\frontend\modules\coupon\models\MemberCoupon;
use app\frontend\modules\member\models\MemberFavorite;
use app\frontend\modules\member\models\MemberHistory;
class MemberCenterService extends BaseMemberCenterService
{
public function getData(): array
{
$langSet = LangService::getCurrentLang();
$data[] = [
'name' => 'member_code',
'title' => '会员卡号',
'class' => 'icon-member_posvip_cardnum',
'url' => 'uidCode',
'image' => 'member_a(83).png',
'mini_url' => '/mircoApp/codePage/codePageIndex/codePageIndex',
'type_1' => 'essential_tool',
'type_2' => 'tool',
'weight_1' => 600,
'weight_2' => 300,
'default_weight' => 4
];
$data[] = [
'name' => 'member_pay_code',
'title' => '动态验证码',
'class' => 'icon-member_pospay_validation',
'url' => 'codePage',
'image' => 'member_a(82).png',
'mini_url' => '/packageI/dynamic_code/code/code',
'type_1' => 'essential_tool',
'type_2' => 'tool',
'weight_1' => 700,
'weight_2' => 400,
'default_weight' => 5
];
$data[] = [
'name' => 'findpwd',
'title' => '忘记密码',
'class' => 'icon-fontclass-wangjimima2',
'url' => 'findpwd',
'image' => 'member_a(124).png',
'mini_url' => '/packageE/findpwd/findpwd',
'type_1' => 'essential_tool',
'type_2' => 'tool',
'weight_1' => 500,
'weight_2' => 900,
];
//推广中心
if (PortType::popularizeShow(request()->input('type'))) {
$data[] = [
'name' => 'extension',
'title' => '推广中心',
'class' => 'icon-member-extension1',
'url' => 'extension',
'image' => 'member_a(38).png',
'mini_url' => '/packageG/pages/member/extension/extension',
'type_1' => 'my_assets',
'type_2' => 'asset_equity',
'weight_1' => 12100,
'weight_2' => 3200,
];
}
if (\Setting::getByGroup('coupon')['exchange_center'] == 1) {
$data[] = [
'name' => 'exchange',
'title' => '兑换中心',
'class' => 'icon-member_changer_centre',
'url' => 'CouponExchange',
'image' => 'member_a(74).png',
'mini_url' => '/packageC/CouponExchange/index',
'type_1' => 'service',
'type_2' => 'market',
'weight_1' => 2600,
'weight_2' => 10700,
'default_weight' => 28
];
}
$data[] = [
'name' => "m-pinglun",
'title' => $langSet['en']['member']['评论'] ? : "评论",
'class' => 'icon-fontclass-pinglun',
'url' => "myEvaluation",
'image' => 'tool_a(4).png',
'mini_url' => "/packageD/member/myEvaluation/myEvaluation",
'type_1' => 'interactive',
'type_2' => 'market',
'weight_1' => 4100,
'weight_2' => 20,
'default_weight' => 2
];
$data[] = [
'name' => "m-guanxi",
'title' => $langSet['en']['member']["客户"] ? : "客户",
'class' => 'icon-fontclass-kehu',
'url' => "myRelationship",
'image' => 'tool_a(3).png',
'mini_url' => "/packageD/member/myRelationship/myRelationship",
'type_1' => 'essential_tool',
'type_2' => 'market',
'weight_1' => 800,
'weight_2' => 30,
'default_weight' => 3
];
$data[] = [
'name' => "m-collection",
'title' => $langSet['en']['member']["收藏"] ? : "收藏",
'class' => 'icon-fontclass-1',
'url' => "collection",
'image' => 'tool_a(6).png',
'mini_url' => "/packageD/member/collection/collection",
'type_1' => 'essential_tool',
'type_2' => 'tool',
'weight_1' => 100,
'weight_2' => 10,
];
$data[] = [
'name' => "m-footprint",
'title' => $langSet['en']['member']["足迹"] ? : "足迹",
'class' => 'icon-fontclass-zuji2',
'url' => "footprint",
'image' => 'tool_a(8).png',
'mini_url' => "/packageD/member/footprint/footprint",
'type_1' => 'essential_tool',
'type_2' => 'tool',
'weight_1' => 200,
'weight_2' => 20,
];
$data[] = [
'name' => "m-address",
'title' => $langSet['en']['member']["地址管理"] ? : "地址管理",
'class' => 'icon-fontclass-dizhi',
'url' => "address",
'image' => 'tool_a(1).png',
'mini_url' => "/packageD/member/addressList/addressList",
'type_1' => 'essential_tool',
'type_2' => 'tool',
'weight_1' => 300,
'weight_2' => 30,
];
$data[] = [
'name' => "m-info",
'title' => $langSet['en']['member']["设置"] ? : "设置",
'class' => 'icon-fontclass-shezhi',
'url' => "info",
'image' => 'tool_a(5).png',
'mini_url' => "/packageA/member/info/info",
'type_1' => 'essential_tool',
'type_2' => 'tool',
'weight_1' => 400,
'weight_2' => 40,
];
$data[] = [
'name' => "m-coupon",
'title' => $langSet['en']['member']["优惠券"] ? : "优惠券",
'class' => 'icon-fontclass-youhuiquan',
'image' => 'tool_a(7).png',
'url' => "coupon",
'mini_url' => "/packageA/member/coupon_v2/coupon_v2",
'type_1' => 'essential_tool',
'type_2' => 'market',
'value' => MemberCoupon::getCouponsOfMember(\YunShop::app()->getMemberId())
->where('used', '=', 0)
->where('is_member_deleted', 0)
->where('is_expired', 0)
->count(),
'weight_1' => 1100,
'weight_2' => 40,
];
$is_agent = MemberShopInfo::uniacid()->where('member_id', \YunShop::app()->getMemberId())->value('is_agent');
if ($this->isBackendRoute() || $is_agent == 1) {
$data[] = [
'name' => "m-erweima",
'title' => "分享码",//$langSet['en']['member']['二维码'] ? : "二维码",
'class' => 'icon-fontclass-erweima',
'url' => 'm-erweima',
'mini_url' => 'm-erweima',
'image' => 'tool_a(2).png',
'type_1' => 'interactive',
'type_2' => 'market',
'weight_1' => 4000,
'weight_2' => 10,
'default_weight' => 1,
];
}
return $data;
}
public function getOrderData(): array
{
$status_list = [Order::WAIT_PAY, Order::WAIT_SEND, Order::WAIT_RECEIVE, Order::REFUND];
$list = collect(FrontendOrder::getOrderCountGroupByStatus($status_list))->sortBy('status')->values()->toArray();
$list[] = [
'status' => -2,
'status_name' => '全部订单',
'class' => 'icon-fontclass-quanbudingdan',
'total' => 0
];
$data[] = [
'key' => 'shop',
'name' => '商城订单',
'weight' => 0,
'diy_key' => 'U_memberorder',
'data' => $list,
];
return $data;
}
public function getAssetsData(): array
{
$data = [];
$lang = LangService::getLangSet('member_center');
//余额
if (!\Setting::get('shop.member.show_balance')) {
$data[] = [
'key' => 'balance',
'name' => ($lang['credit'] ?: '余额'),
'value' => Member::current()['credit2'],
'unit' => '¥',
'url' => 'balance',
'min_url' => '/packageA/member/balance/balance/balance',
'diy_key' => 'balance',
'weight' => 60
];
}
//积分
if (!\Setting::get('shop.member.show_point')) {
$data[] = [
'key' => 'point',
'name' => ($lang['credit1'] ?: '积分'),
'value' => Member::current()['credit1'],
'unit' => '',
'url' => 'integral_v2',
'min_url' => '/packageB/member/integral/integral',
'diy_key' => 'integral_v2',
'weight' => 70
];
}
//优惠券
if (!app('MemberCenter')->isDiy()) {
$data[] = [
'key' => 'coupon',
'name' => '优惠券',
'value' => MemberCoupon::getCouponsOfMember(\YunShop::app()->getMemberId())
->where('used', '=', 0)
->where('is_member_deleted', 0)
->where('is_expired', 0)
->count(),
'unit' => '',
'url' => 'coupon',
'min_url' => '/packageA/member/coupon_v2/coupon_v2',
'weight' => 80,
];
}
if (app('MemberCenter')->isDiy()) {
$data[] = [
'key' => 'extension',
'name' => \Setting::get('shop.lang.zh_cn.income.name_of_withdrawal') ?: '提现',
'value' => function ($item) {
if ($item['extension_radio'] == 1) {
$amount = Income::getIncomes()->where('member_id', \YunShop::app()->getMemberId())->sum('amount') ?? 0;
} else {
$amount = Income::getIncomes()->where('member_id', \YunShop::app()->getMemberId())->where('status', 0)->sum('amount') ?? 0;
}
return number_format($amount, 2);
},
'unit' => '¥',
'url' => 'extension',
'min_url' => '/packageG/pages/member/extension/extension',
'diy_key' => 'extension',
'weight' => 110
];
}
// 权重值
$data[] = [
'key' => 'weight_value',
'name' => '权重值',
'value' => Member::current()['weight_value'],
'unit' => '',
'url' => 'weight_value',
'min_url' => '',
'diy_key' => 'weight_value',
'weight' => 60
];
return $data;
}
public function getPluginHead(): array
{
return [
[
'title' => '商品收藏',
'class' => 'icon-fontclass-shoucang',
'value' => MemberFavorite::getFavoriteCount(\YunShop::app()->getMemberId()) ?: 0,
'mini_url' => "/packageD/member/collection/collection",
'url' => "collection"
],
[
'title' => '浏览记录',
'class' => 'icon-fontclass-liulan',
'value' => MemberHistory::getMemberHistoryCount(\YunShop::app()->getMemberId()) ?: 0,
'mini_url' => "/packageD/member/footprint/footprint",
'url' => "footprint"
],
];
}
public function getPluginData(): array
{
$data = [];
if ($this->getEnabledRecommendGoods()) {
$data[] = [
'code' => 'recommendGoods',
'diy_code' => 'recommend_goods',
'name' => '推荐商品',
'sort' => 0,
'class' => __CLASS__,
];
}
if ($this->getEnabledLimitBuyGoods()) {
$data[] = [
'code' => 'limitBuyGoods',
'diy_code' => 'limitBuy_goods',
'name' => '限时抢购',
'sort' => 1,
'class' => __CLASS__
];
}
return $data;
}
public function getOtherData(): array
{
return [
'service' => \Setting::get('shop.shop')['cservice'] ?: '',
'setting' => [
'wechat_login_mode' => (bool)\Setting::get('shop.member')['wechat_login_mode'],
'has_avatar' => Member::current()->has_avatar,
'member_auth_pop_switch' => \Setting::get('plugin.min_app.member_auth_pop_switch') ? 1 : 0
]
];
}
public function recommendGoods()
{
$size = 20;
$goods = Goods::uniacid()->select('yz_goods.id', 'yz_goods.title', 'yz_goods.thumb', 'yz_goods.market_price',
'yz_goods.show_sales', 'yz_goods.virtual_sales', 'yz_goods.price', 'yz_goods.stock', 'yz_goods.has_option', 'yz_goods.plugin_id')
->with(['hasManyOptions' => function ($query) {
$query->select('goods_id', 'product_price', 'market_price');
}])
->whereIn('yz_goods.plugin_id', [0, 92, 40, 57, 58, 103, 101, 113])
->where('yz_goods.status', 1)
->where('yz_goods.is_recommand', 1) //推荐商品
->orderBy('yz_goods.id', 'desc');
if (app('plugins')->isEnabled('video-demand')) {
//排除掉视频点播插件的商品
$goods = $goods->whereNotIn('id', function ($query) {
$query->from('yz_video_course_goods')->select('goods_id')->where('is_course', 1);
});
}
$goods = $goods->paginate($size);
foreach ($goods as &$good) {
$good['name'] = $good->title;
$good['img'] = yz_tomedia($good->thumb);
$good['stock_status'] = 0;
$good['price_level'] = $good->vip_next_price ? 1 : 0;
$good['sales'] = $good->show_sales + $good->virtual_sales;
$good['vip_level_status'] = $good->vip_level_status;
if ($good->has_option) {
$minMarketPrice = $good->hasManyOptions->sortBy('market_price')->first()['market_price'] ?: 0;
$minPrice = $good->hasManyOptions->sortBy('product_price')->first()['product_price'] ?: 0;
$maxMarketPrice = $good->hasManyOptions->sortByDesc('market_price')->first()['market_price'] ?: 0;
$maxPrice = $good->hasManyOptions->sortByDesc('product_price')->first()['product_price'] ?: 0;
if ($minMarketPrice == $maxMarketPrice) {
$good['priceold'] = $minMarketPrice;
}
$good['priceold'] = ($minMarketPrice == $maxMarketPrice) ? $minMarketPrice : ($minMarketPrice . '-' . $maxMarketPrice);
$good['pricenow'] = ($minPrice == $maxPrice) ? $minPrice : ($minPrice . '-' . $maxPrice);
} else {
$good['priceold'] = $good->market_price;
$good['pricenow'] = $good->price;
}
}
$goods = $goods->toArray();
$vip_not_shop = 0;
if (!app('plugins')->isEnabled('member-price') || \Setting::get('plugin.member-price.is_open_micro') != 1) {
$vip_not_shop = 1;
}
foreach ($goods['data'] as &$item) {
$item['vip_next_price'] = $item['next_level_price'];
$item['notshow'] = $vip_not_shop;
}
unset($item);
return $goods;
}
public function limitBuyGoods()
{
$size = 20;
$goods = Goods::uniacid()->select('yz_goods.id', 'yz_goods.title', 'yz_goods.thumb', 'yz_goods.market_price',
'yz_goods.show_sales', 'yz_goods.virtual_sales', 'yz_goods.price', 'yz_goods.stock', 'yz_goods.has_option', 'yz_goods.plugin_id', 'yz_goods_limitbuy.start_time', 'yz_goods_limitbuy.end_time')
->join('yz_goods_limitbuy', function ($join) {
$join->on('yz_goods.id', '=', 'yz_goods_limitbuy.goods_id')->where(function ($where) {
return $where->where('yz_goods_limitbuy.status', 1)
->where('yz_goods_limitbuy.start_time', '<=', time())
->where('yz_goods_limitbuy.end_time', '>', time());
});
})
->with(['hasManyOptions' => function ($query) {
$query->select('goods_id', 'product_price', 'market_price');
}])
->whereIn('yz_goods.plugin_id', [0, 92, 40, 57, 58, 103, 101, 113])
->where('yz_goods.status', 1)
->orderBy('yz_goods.id', 'desc');
if (app('plugins')->isEnabled('video-demand')) {
//排除掉视频点播插件的商品
$goods = $goods->whereNotIn('yz_goods.id', function ($query) {
$query->from('yz_video_course_goods')->select('goods_id')->where('is_course', 1);
});
}
$goods = $goods->paginate($size);
foreach ($goods as &$good) {
$good['name'] = $good->title;
$good['img'] = yz_tomedia($good->thumb);
$good['stock_status'] = 0;
$good['price_level'] = $good->vip_next_price ? 1 : 0;
$good['sales'] = $good->show_sales + $good->virtual_sales;
$good['vip_level_status'] = $good->vip_level_status;
if ($good->has_option) {
$minMarketPrice = $good->hasManyOptions->sortBy('market_price')->first()['market_price'] ?: 0;
$minPrice = $good->hasManyOptions->sortBy('product_price')->first()['product_price'] ?: 0;
$maxMarketPrice = $good->hasManyOptions->sortByDesc('market_price')->first()['market_price'] ?: 0;
$maxPrice = $good->hasManyOptions->sortByDesc('product_price')->first()['product_price'] ?: 0;
if ($minMarketPrice == $maxMarketPrice) {
$good['priceold'] = $minMarketPrice;
}
$good['priceold'] = ($minMarketPrice == $maxMarketPrice) ? $minMarketPrice : ($minMarketPrice . '-' . $maxMarketPrice);
$good['pricenow'] = ($minPrice == $maxPrice) ? $minPrice : ($minPrice . '-' . $maxPrice);
} else {
$good['priceold'] = $good->market_price;
$good['pricenow'] = $good->price;
}
}
$goods = $goods->toArray();
$vip_not_shop = 0;
if (!app('plugins')->isEnabled('member-price') || \Setting::get('plugin.member-price.is_open_micro') != 1) {
$vip_not_shop = 1;
}
foreach ($goods['data'] as &$item) {
$item['vip_next_price'] = $item['next_level_price'];
$item['notshow'] = $vip_not_shop;
}
unset($item);
return $goods;
}
public function getEnabledRecommendGoods(): bool
{
$key = 'member_center_recommend__' . \Yunshop::app()->uniacid;
if (!Cache::has($key)) {
$count = Goods::uniacid()
->whereIn('yz_goods.plugin_id', [0, 92, 40, 57, 58, 103, 101, 113])
->where('yz_goods.status', 1)
->where('yz_goods.is_recommand', 1); //推荐商品
if (app('plugins')->isEnabled('video-demand')) {
//排除掉视频点播插件的商品
$count = $count->whereNotIn('yz_goods.id', function ($query) {
$query->from('yz_video_course_goods')->select('goods_id')->where('is_course', 1);
});
}
$count = $count->count();
Cache::put($key, ($count ?: 0), 5);
} else {
$count = Cache::get($key);
}
if ($count > 0) {
return true;
}
return false;
}
private function getEnabledLimitBuyGoods(): bool
{
$key = 'member_center_limit_buy_' . \Yunshop::app()->uniacid;
if (!Cache::has($key)) {
$count = Goods::uniacid()->join('yz_goods_limitbuy', function ($join) {
$join->on('yz_goods.id', '=', 'yz_goods_limitbuy.goods_id')->where(function ($where) {
return $where->where('yz_goods_limitbuy.status', 1)
->where('yz_goods_limitbuy.start_time', '<=', time())
->where('yz_goods_limitbuy.end_time', '>', time());
});
});
if (app('plugins')->isEnabled('video-demand')) {
//排除掉视频点播插件的商品
$count = $count->whereNotIn('yz_goods.id', function ($query) {
$query->from('yz_video_course_goods')->select('goods_id')->where('is_course', 1);
});
}
$count = $count->whereIn('yz_goods.plugin_id', [0, 92, 40, 57, 58, 103, 101, 113])
->where('yz_goods.status', 1)
->count();
Cache::put($key, ($count ?: 0), 5);
} else {
$count = Cache::get($key);
}
if ($count > 0) {
return true;
}
return false;
}
}