239 lines
8.7 KiB
PHP
239 lines
8.7 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
*
|
|
*
|
|
*
|
|
* Date: 2021/9/7
|
|
* Time: 16:27
|
|
*/
|
|
|
|
namespace app\frontend\modules\coupon\controllers;
|
|
|
|
|
|
use app\common\components\ApiController;
|
|
use app\common\exceptions\AppException;
|
|
use app\common\facades\Setting;
|
|
use app\common\models\coupon\CouponSlideShow;
|
|
use app\common\models\GoodsCategory;
|
|
use app\common\modules\coupon\models\PreMemberCoupon;
|
|
use app\frontend\models\Goods;
|
|
use app\frontend\models\Member;
|
|
use app\frontend\modules\coupon\models\Coupon;
|
|
use app\frontend\modules\coupon\models\MemberCoupon;
|
|
use app\common\models\MemberShopInfo;
|
|
use Carbon\Carbon;
|
|
use Yunshop\Hotel\common\models\CouponHotel;
|
|
use Yunshop\StoreCashier\common\models\Store;
|
|
|
|
class SearchCouponController extends ApiController
|
|
{
|
|
|
|
//"优惠券中心"的优惠券
|
|
const IS_AVAILABLE = 1; //可领取
|
|
const ALREADY_GOT = 2; //已经领取
|
|
const EXHAUST = 3; //已经被抢光
|
|
|
|
//"个人拥有的优惠券"的状态
|
|
const NOT_USED = 1; //未使用
|
|
const OVERDUE = 2; //优惠券已经过期
|
|
const IS_USED = 3; //已经使用
|
|
|
|
const NO_LIMIT = -1; //没有限制 (比如对会员等级没有限制, 对领取总数没有限制)
|
|
|
|
const TEMPLATEID = 'OPENTM200605630'; //成功发放优惠券时, 发送的模板消息的 ID
|
|
|
|
// const TEMPLATEID = 'tqsXWjFgDGrlUmiOy0ci6VmVtjYxR7s-4BWtJX6jgeQ'; //临时调试用
|
|
|
|
/**
|
|
* coupon.search-coupon.index
|
|
* 提供给用户的"优惠券中心"的数据接口
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function index()
|
|
{
|
|
|
|
$search['goods_id'] = intval(request()->input('goods_id'));
|
|
|
|
$uid = \YunShop::app()->getMemberId();
|
|
|
|
$member = MemberShopInfo::getMemberShopInfo($uid);
|
|
|
|
if (empty($member)) {
|
|
return $this->errorJson('没有找到该用户', []);
|
|
}
|
|
$memberLevel = $member->level_id;
|
|
|
|
$now = strtotime('now');
|
|
$coupons = Coupon::centerCouponsForMember($uid, $memberLevel, null, $now,\YunShop::request()->coupon_type?:'')
|
|
->orderBy('yz_coupon.display_order', 'desc')
|
|
->orderBy('yz_coupon.updated_at', 'desc')
|
|
->get();
|
|
if ($coupons->isEmpty()) {
|
|
return $this->errorJson('没有找到记录', []);
|
|
}
|
|
foreach ($coupons as &$item) {
|
|
$item->has_many_member_coupon_count = MemberCoupon::uniacid()->where('coupon_id' ,$item->id)->pluck('uid')->unique()->count();
|
|
}
|
|
//添加"是否可领取" & "是否已抢光" & "是否已领取"的标识
|
|
$couponsData = $this->getCouponData($coupons, $search);
|
|
|
|
$slideShows = CouponSlideShow::uniacid()
|
|
->where('is_show',1)
|
|
->orderBy('sort','asc')
|
|
->orderBy('id','asc')
|
|
->limit(10)
|
|
->get();
|
|
|
|
$data = [
|
|
'data' => $couponsData,
|
|
'search_array' => $this->getSearchArray(Coupon::$typeComment),//Coupon::$typeComment
|
|
'slide_shows' => $slideShows
|
|
];
|
|
|
|
//领券中心表单
|
|
if (!is_null(\app\common\modules\shop\ShopConfig::current()->get('coupon_form'))) {
|
|
$class = array_get(\app\common\modules\shop\ShopConfig::current()->get('coupon_form'), 'class');
|
|
$function = array_get(\app\common\modules\shop\ShopConfig::current()->get('coupon_form'), 'function');
|
|
$form = $class::$function($uid);
|
|
if($form && $form != -1)
|
|
{
|
|
$data = array_merge($data,['coupon_form' => $form]);
|
|
}
|
|
}
|
|
|
|
return $this->successJson('ok', $data);
|
|
}
|
|
|
|
|
|
protected function filterCoupon($coupon, $search)
|
|
{
|
|
|
|
if (empty($search['goods_id'])) {
|
|
return false;
|
|
}
|
|
|
|
$goods = Goods::find($search['goods_id']);
|
|
$goodsCategory = GoodsCategory::select('category_id')->where('goods_id', $search['goods_id'])->get()->pluck('category_id')->toArray();
|
|
|
|
if ($coupon->time_limit == 1 && (time() < $coupon->time_start || time() > $coupon->time_end)) {
|
|
return true;
|
|
}
|
|
|
|
switch ($coupon->use_type) {
|
|
case Coupon::COUPON_SHOP_USE: //商城通用
|
|
if (!in_array($goods->plugin_id,[31,32,33,36,92,101])) {
|
|
$coupon_list[] = $coupon;
|
|
}
|
|
break;
|
|
case Coupon::COUPON_GOODS_USE: //指定商品
|
|
if (in_array($goods->id, $coupon['goods_ids'])) {
|
|
$coupon_list[] = $coupon;
|
|
}
|
|
break;
|
|
case Coupon::COUPON_GOODS_AND_STORE_USE: //指定商品+指定门店
|
|
$use_conditions = unserialize($coupon->use_conditions);
|
|
if (($use_conditions['is_all_good'] && $goods->plugin_id == 0) || in_array($goods->id, $use_conditions['good_ids'])) {
|
|
$coupon_list[] = $coupon;
|
|
}
|
|
break;
|
|
case Coupon::COUPON_CATEGORY_USE: //指定分类
|
|
|
|
//商品分类存在该优惠卷中
|
|
if ($coupon['category_ids'] && array_intersect($goodsCategory, $coupon['category_ids'])) {
|
|
$coupon_list[] = $coupon;
|
|
}
|
|
break;
|
|
default:
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* 过滤不满足条件的优惠卷 &
|
|
* 添加"是否可领取" & "是否已抢光" & "是否已领取"的标识
|
|
* @param $coupons
|
|
* @param $search
|
|
* @return mixed
|
|
*/
|
|
public function getCouponData($coupons, $search)
|
|
{
|
|
$coupons = $coupons->map(function ($item) use ($search) {
|
|
|
|
|
|
if ($this->filterCoupon($item,$search)) {
|
|
return null;
|
|
}
|
|
|
|
|
|
if (($item->total != self::NO_LIMIT) && ($item->has_many_member_coupon_count >= $item->total)) {
|
|
$item->api_availability = self::EXHAUST;
|
|
} elseif ($item->member_got_count > 0) {
|
|
$item->api_availability = self::ALREADY_GOT;
|
|
} else {
|
|
$item->api_availability = self::IS_AVAILABLE;
|
|
}
|
|
|
|
//增加属性 - 对于该优惠券,用户可领取的数量
|
|
if ($item->get_max != self::NO_LIMIT) {
|
|
$item->api_remaining = $item->get_max - $item->member_got_count;
|
|
if ($item->api_availability < 0) { //考虑到优惠券设置会变更,比如原来允许领取6张,之后修改为3张,那么可领取张数可能会变成负数
|
|
$item->api_availability = 0;
|
|
}
|
|
} elseif ($item->get_max == self::NO_LIMIT) {
|
|
$item->api_availability = -1;
|
|
}
|
|
//添加优惠券使用范围描述
|
|
switch ($item->use_type) {
|
|
case Coupon::COUPON_SHOP_USE:
|
|
$item->api_limit = '商城通用';
|
|
break;
|
|
case Coupon::COUPON_CATEGORY_USE:
|
|
$item->api_limit = '适用于下列分类: '.implode(',', $item['categorynames']);
|
|
break;
|
|
case Coupon::COUPON_GOODS_USE:
|
|
$item->api_limit = '适用于下列商品: '.implode(',', $item['goods_names']);
|
|
break;
|
|
case 8:
|
|
$item->api_limit = '适用于下列商品: '.implode(',', $item['goods_names']);
|
|
break;
|
|
case 9:
|
|
$item->api_limit = '适用范围: ';
|
|
$use_condition = unserialize($item['use_conditions']);
|
|
if (empty($use_condition)) {
|
|
$item->api_limit .= '无适用范围';
|
|
}
|
|
if (app('plugins')->isEnabled('store-cashier')) {
|
|
if ($use_condition['is_all_store'] == 1) {
|
|
$item->api_limit .= "全部门店";
|
|
} else {
|
|
$item->api_limit .= '门店:'.implode(',', Store::uniacid()->whereIn('id', $use_condition['store_ids'])->pluck('store_name')->all());
|
|
}
|
|
}
|
|
if ($use_condition['is_all_good'] == 1) {
|
|
$item->api_limit .= "平台自营商品";
|
|
} else {
|
|
$item->api_limit .= '商品:'.implode(',', Goods::uniacid()->whereIn('id', $use_condition['good_ids'])->pluck('title')->all());
|
|
}
|
|
break;
|
|
}
|
|
|
|
return $item;
|
|
})->filter()->values();
|
|
|
|
return $coupons;
|
|
}
|
|
|
|
private function getSearchArray($arr)
|
|
{
|
|
if (!app('plugins')->isEnabled('store-cashier')) {
|
|
unset($arr[Coupon::TYPE_STORE]);
|
|
}
|
|
if (!app('plugins')->isEnabled('hotel')) {
|
|
unset($arr[Coupon::TYPE_HOTEL]);
|
|
}
|
|
return $arr;
|
|
}
|
|
} |