love_php/app/Http/Controllers/Server/H5/CouponController.php

556 lines
26 KiB
PHP
Raw Normal View History

2026-04-02 09:20:51 +08:00
<?php
namespace App\Http\Controllers\Server\H5;
use App\Http\Controllers\Controller;
use App\Models\CommunityActivity;
use App\Models\ConsultAccount;
use App\Models\Consultation;
use App\Models\ConsultationRecords;
use App\Models\Coupon;
use App\Models\Course\Course;
use App\Models\Course\UserCourses;
use App\Models\Live\Anchor;
use App\Models\MerchantShop;
use App\Models\Server\EvaluateList;
use App\Models\Server\MerchantAccount;
use App\Models\Server\MerchantEvaluate;
use App\Models\Server\MerchantUser;
use App\Models\Server\TouristOrder;
use App\Models\UserCoupon;
use App\Models\UserMember;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CouponController extends Controller
{
/**
* 优惠券详情
* *
* @param Request $request
* @param $id
* @return JsonResponse|string
*/
public function CouponDetail(Request $request, $id)
{
try {
$m_id = $request->merchant_id;
$result = Coupon::select('id', 'type_id', 'total_num', 'remain_num', 'm_id', 'type', 'sku','coupon_type', 'discount_rate')
->where('m_id', $m_id)->where('id', $id)
->first();
if (!$result)
return $this->failure('该优惠券不存在或已下架');
if ($result->type == 'course') {
$result->thumb = $result->course->thumb ?? '';
$result->title = $result->course->title ?? '';
$result->short_description = $result->course->short_description ?? '';
unset($result->course);
} elseif ($result->type == 'community') {
$result->thumb = $result->community->pic ?? '';
$result->title = $result->community->title ?? '';
$result->short_description = $result->community->Subtitle ?? '';
$result->sku = json_decode($result->sku, true);
//免费卷
if($result->coupon_type === 1){
$result->sku = json_decode($result->community->sku, true);
}
unset($result->community);
} elseif ($result->type == 'evaluate') {
$result->thumb = $result->evaluate->image ?? '';
$result->title = $result->evaluate->title ?? '';
$result->short_description = $result->evaluate->title ?? '';
$eval = MerchantEvaluate::where('id', $result->type_id)
->first();
if ($eval) {
$list = EvaluateList::where('test_item_id', $eval->test_item_id)
->first();
if ($list) {
$result->evaluate_type = $list->type;
} else {
return $this->failure('评测不存在');
}
} else {
return $this->failure('商家未添加此评测');
}
} elseif ($result->type == 'consult'){
$consult = Consultation::query()->where('id',$result->type_id)->first();
if (!$consult){
return $this->failure('咨询数据不存在');
}
$result->thumb = $consult->pic;
$result->title = $consult->title;
$result->short_description = $consult->title;
} else {
$result->thumb = '';
$result->title = '';
$result->short_description = '';
}
// 是否领取过
$get_status = UserCoupon::where('m_user_id', $request->merchant_user_id)->where('coupons_id', $id)->exists();
$result->get_status = $get_status;
//是否曾经购买过
$has_buy = TouristOrder::where('type',$result->type)->where('type_id',$result->type_id)->whereIn('pay_status',[1,4])
->where('account_id',$request->merchant_user_id)
->exists();
$result->has_buy = $has_buy;
//是否有咨询中的订单
$consulting_order = null;
if (isset($consult)) {
$consulting_order = ConsultationRecords::query()
->select('id','consulation_id')
->where('consulation_id', $consult->id)
->where('pay_status', 1)
->whereIn('status', [0, 1])
->where('merchant_user_id',$request->merchant_user_id)
->orderBy('id','desc')
->first();
if ($consulting_order){
$consulation = Consultation::find($consulting_order->consulation_id);
$consulting_order->teacher_mobile = ConsultAccount::query()
->where('id',$consulation->consult_account_id)
->value('mobile');
}
}
$result->consulting_order = $consulting_order;
$result->has_consulting_order = $consulting_order ? 1 : 0;
$m_user = MerchantUser::where('id', $request->merchant_user_id)->first();
$linkmen['mobile'] = $m_user->mobile;
$linkmen['name'] = $m_user->nickname;
$user_status = UserCoupon::where('m_user_id', $request->merchant_user_id)->where('coupons_id', $id)->value('status');
$result->user_status = $user_status;
$result->linkmen = $linkmen;
return $this->success('ok', $result);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息,请稍后再试');
}
}
/**
* 领取优惠券
* @param Request $request
* @return JsonResponse|string
*/
public function ReceiveCoupon(Request $request)
{
try {
$merchant_id = $request->merchant_id;
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$openid = $wechatUser->getId();
} else {
$openid = $request->openid;
}
$m_id = $request->merchant_id;
$m_user_id = $request->merchant_user_id;
$coupon_id = $request->coupon_id;
$linkmen = $request->linkmen;
$user_id = $this->matchFulinkUser($m_user_id);
DB::beginTransaction();
$get_status = UserCoupon::where('m_user_id', $m_user_id)->where('coupons_id', $coupon_id)->exists();
if ($get_status)
return $this->failure('您已经领取过该优惠券了');
// echo $coupon_id.'--'.$merchant_id;exit;
$result = Coupon::where('id', $coupon_id)->where('status', 1)->where('m_id', $merchant_id)->first();
if (!$result)
return $this->failure('该优惠券已失效。');
if ($result->expiration_time && $result->expiration_time < now())
return $this->failure('该优惠券已过期');
if ($result->remain_num <= 0)
return $this->failure('该优惠券无库存');
$merchant_user = MerchantUser::where('id', $m_user_id)->first();
if ($result->type == 'course') {
$user_course = UserCourses::where('merchant_user_id', $m_user_id)->where('course_id', $result->type_id)
->where('status', 1)
->first();
if ($user_course)
return $this->failure('您已经是该课程的成员啦');
$UserCoupon = new UserCoupon();
$UserCoupon->openid = $openid;
$UserCoupon->coupons_id = $coupon_id;
$UserCoupon->status = 0;
$UserCoupon->m_user_id = $m_user_id;
$UserCoupon->m_id = $m_id;
$UserCoupon->linkmen = json_encode($request->linkmen);
$UserCoupon->save();
$result->decrement('remain_num', 1);
$result->save();
}
if ($result->type == 'community' || $result->type == 'activity' || $result->type == 'service') {
$userMember = UserMember::where('m_user_id', $m_user_id)->where('type', $result->type)
->where('type_id', $result->type_id)
->first();
if ($userMember && $result->remark == 'one') {
return $this->failure('您已经参加了此活动啦~');
}
$UserCoupon = new UserCoupon();
$UserCoupon->openid = $openid;
$UserCoupon->coupons_id = $coupon_id;
$UserCoupon->status = 0;
$UserCoupon->m_user_id = $m_user_id;
$UserCoupon->m_id = $m_id;
$UserCoupon->linkmen = json_encode($request->linkmen);
$UserCoupon->save();
$result->decrement('remain_num', 1);
$result->save();
}
if($result->type == 'evaluate'){
$UserCoupon = new UserCoupon();
$UserCoupon->openid = $openid;
$UserCoupon->coupons_id = $coupon_id;
$UserCoupon->status = 0;
$UserCoupon->m_user_id = $m_user_id;
$UserCoupon->m_id = $m_id;
$UserCoupon->linkmen = json_encode($request->linkmen);
$UserCoupon->save();
$result->decrement('remain_num', 1);
$result->save();
$UserCoupon['state'] = 1; //跳转的条件,不可删除
}
if ($result->type == 'consult'){
$UserCoupon = new UserCoupon();
$UserCoupon->openid = $openid;
$UserCoupon->coupons_id = $coupon_id;
$UserCoupon->status = 0;
$UserCoupon->m_user_id = $m_user_id;
$UserCoupon->m_id = $m_id;
$UserCoupon->linkmen = json_encode($request->linkmen);
$UserCoupon->save();
$result->decrement('remain_num', 1);
$result->save();
}
$filter_type = ['evaluate','consult'];
if($result->coupon_type == 1 && !in_array($result->type,$filter_type)) {
$trade_no = \CommonUtilsService::getTradeNO();
$UserCoupon->status = 1;
$UserCoupon->save();
$goods = '领取优惠券';
//优惠券规格
if($request->sku_id){
$coupon_sku_id = $request->sku_id;
}else{
$coupon_sku_id = Coupon::where('id', $coupon_id)->value('sku_id');
}
$sku_price = 0;
if ($coupon_sku_id) {
if ($result->type = 'community') {
$skus = CommunityActivity::where('id', $result->type_id)->value('sku');
$skus = json_decode($skus, true);
$sku_name = '';
foreach ($skus as $sku) {
if ($sku['sku_id'] == $coupon_sku_id) {
$sku_name = $sku['name'];
// $sku_price = $sku['price'];
break;
}
}
$goods = $goods.'-'.$sku_name;
}
}
//生成订单
$order = new TouristOrder();
$order->open_id = $openid;
$order->price = '0.00';
$order->num = 1;
$order->pay_type = 'free';
$order->pay_status = 4;
$order->trade_no = $trade_no;
$order->withdrawal_radio = 100;
$order->from_openid = $request->from_openid;
$order->goods = $goods;
$order->merchant_id = $m_id;
$order->user_coupon_id = $UserCoupon->id;
$order->account_id = $m_user_id;
$order->channel = 0;
$order->linkmen = json_encode([$request->linkmen]);
if ($linkmen && $linkmen['mobile'] && $linkmen['name']) {
if ($merchant_user) {
if (!$merchant_user->mobile) {
$old_mobile_user = MerchantUser::where('mobile', $linkmen['mobile'])->first();
if (!$old_mobile_user) {
//$merchant_user->mobile = $linkmen['mobile'];
} else {
if ($old_mobile_user->openid) {
//throw new \Exception('merchant_user_id='.$m_user_id.'手机号已存在,请联系客服');
}
}
}
if (!$merchant_user->nickname) {
$merchant_user->nickname = $linkmen['name'];
}
$merchant_user->save();
}
}
$price = '0.00';
if ($result->type == 'course') {
$com = Course::where('id', $result->type_id)->first();
$non_encode_url = 'https://love.ufutx.com/pu/#/receiveCoupons/' . $coupon_id;
$price = $com->charge;
} elseif ($result->type == 'community' || $result->type == 'activity' || $result->type == 'service') {
$com = CommunityActivity::where('id', $result->type_id)->first();
$non_encode_url = $com->class == 'one' ? 'https://love.ufutx.com/pu/#/activityCoupons/' . $coupon_id :
'https://love.ufutx.com/pu/#/serveCoupons/' . $coupon_id;
if ($coupon_sku_id) {
$price = $sku_price;
}else {
$price = $com->price;
}
} elseif ($result->type == 'consult'){
$com = Consultation::where('id', $result->type_id)->first();
$non_encode_url = 'https://love.ufutx.com/pu/#/consultCoupons/' . $coupon_id;
$price = $com->price;
}
$link_name = $request->linkmen['name'] ?? ($request->linkmen[0]['name'] ?? null);
$link_mobile = $request->linkmen['mobile'] ?? ($request->linkmen[0]['mobile'] ?? '');
$order->name = ($request->name ?? ($merchant_user->nickname ?? $link_name)) ?? "";
$order->mobile = ($request->mobile ?? ($merchant_user->mobile ?? $link_mobile)) ?? '';
$order->type = $result->type;
if ($result->type == 'evaluate') {
$merchant_evaluates_id = MerchantEvaluate::where('merchant_id', $merchant_id)
->where('test_item_id', $result->type_id)
->value('id');
$order->type_id = $merchant_evaluates_id;
} else {
$order->type_id = $result->type_id;
}
if(empty($com)){
throw new \Exception('未获取到实体,type_id='.$result->type_id);
}
$order->desc = $com->title.'-领取优惠券';
$order->save();
if ($result->type == 'community') {
$remark = $this->numMember($order);
$order->remark = $remark;
$order->save();
}elseif($result->type == 'course'){
$user_course = new UserCourses();
$user_course->user_id = $user_id;
$user_course->course_id = $result->type_id;
$user_course->type = 'business';
$user_course->trade_no = $trade_no;
$user_course->status = 1;
$user_course->open_id = $openid;
$user_course->merchant_user_id = $m_user_id;
$user_course->save();
}
// $openid,$name,$goods,$price,$amount,$url
$merchant_openid = MerchantAccount::where('id', $m_id)->value('openid');
if (!$merchant_openid) $merchant_openid = Anchor::where('m_id', $m_id)->value('openid');
$encode_url = urlencode($non_encode_url);
$url = 'https://love.ufutx.com/api/official/live/wechat/FamilyAuth?merchant_id=' . $m_id . '&url=' . $encode_url;
\CommonUtilsService::reciveCoupon($merchant_openid, $merchant_user->nickname, $com->title, $price, $result->remain_num, $url);
//咨询的订单
if ($result->type == 'consult'){
$consult_order = new ConsultationRecords();
$consult_order->anchor_id = 0;
$consult_order->merchant_id = $m_id;
$consult_order->consulation_id = $com->id;
$consult_order->name = ($request->name ?? ($merchant_user->nickname ?? $link_name)) ?? "";
$consult_order->phone = ($request->mobile ?? ($merchant_user->mobile ?? $link_mobile)) ?? '';
$consult_order->price = 0;
$consult_order->num = 1;
$consult_order->type = 'consult';
$consult_order->class = '';
$consult_order->desc = '';
$consult_order->pay_status = 1;
$consult_order->trade_no = $trade_no;
$consult_order->save();
}
}
DB::commit();
return $this->success('ok', $UserCoupon);
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
return $this->failure($e->getMessage().'-'.$e->getLine());
}
}
/**
* 我的优惠券列表
*/
public function getCouponList(Request $request)
{
try {
$merchant_id = $request->merchant_id;
$type = $request->type;
$type_id = $request->type_id;
$merchant_user_id = $request->merchant_user_id;
$sku_id = $request->input('sku_id');
$nopage = $request->nopage;
$status = $request->status;
$class = $request->class;
if (config('app.debug')) {
if (!$merchant_id) {
return $this->failure('参数不全');
}
}
// print_r(compact('merchant_id','type','type_id','merchant_user_id','status'));exit;
$user_coupons = UserCoupon::where('m_user_id', $merchant_user_id)->where('m_id', $merchant_id)
->with(['coupon' => function ($query) use ($type, $type_id, $class) {
$query->where('status', 1);
if ($type) {
$query->where('type', $type);
}
if ($type_id) {
$query->where('type_id', $type_id);
}
if ($class) {
$query->where('class', $class);
}
}])
->whereHas('coupon', function ($query) use ($type, $type_id, $class, $sku_id) {
$query->where('status', 1);
if ($type) {
$query->where('type', $type);
}
if ($type_id) {
$query->where('type_id', $type_id);
}
if ($class) {
$query->where('class', $class);
}
if ($sku_id) {
$query->where(function ($sql) use($sku_id){
$sql->where('sku_id', $sku_id)->orWhereNull('sku_id');
});
}
})
->orderBy('status', 'asc')->orderBy('id', 'desc');
if (isset($request->status)) {
$user_coupons = $user_coupons->where('status', $status);
}
if ($nopage) {
$user_coupons = $user_coupons->get();
} else {
$user_coupons = $user_coupons->paginate();
}
foreach ($user_coupons as $key => $coupon) {
if ($coupon->coupon) {
switch ($coupon->coupon->type) {
case 'course':
$service = Course::where('id', $coupon->coupon->type_id)->where('merchant_id', $merchant_id)
->first();
if (!$service) {
$price = 0.00;;
} else {
$price = $service->charge;
}
switch ($coupon->coupon->coupon_type) {
case 1:
$coupon->coupon->discount_amount = $price;
break;
case 2:
$temp = $coupon->coupon->discount_rate;
$coupon->coupon->discount_rate = number_format(10 * $coupon->coupon->discount_rate, 1);
$coupon->coupon->discount_amount = number_format($price * (1 - $temp), 2);
break;
case 3:
$coupon->coupon->discount_amount = $coupon->coupon->discount_rate;
break;
default:
$coupon->coupon->discount_amount = 0;
break;
}
break;
case 'activity':
case 'service':
case 'community':
$service = CommunityActivity::where('id', $coupon->coupon->type_id)->where('merchant_id', $merchant_id)
->first();
if (!$service) {
$price = 0.00;
} else {
$price = $service->price;
$sku = json_decode($service->sku)?:[];
$sku_price = [];
foreach ($sku as $val) {
$sku_price[] = $val->price;
}
switch ($coupon->coupon->coupon_type) {
case 1:
$coupon->coupon->discount_amount = max($sku_price);
break;
case 2:
$temp = $coupon->coupon->discount_rate;
$coupon->coupon->discount_rate = number_format(10 * $coupon->coupon->discount_rate, 1);
$coupon->coupon->discount_amount = number_format((1- $temp) * max($sku_price), 2);
break;
case 3:
$coupon->coupon->discount_amount = $coupon->coupon->discount_rate;
break;
default:
$coupon->coupon->discount_amount = 0;
break;
}
}
break;
case 'shop':
$service = MerchantShop::where('id', $coupon->coupon->type_id)->where('merchant_id', $merchant_id)
->first();
if (!$service) {
$price = 0.00;
} else {
$price = $service->charge;
}
break;
case 'evaluate':
$service = MerchantEvaluate::where('id', $coupon->coupon->type_id)->where('merchant_id', $merchant_id)
->first();
if (!$service) {
$price = 0.00;
} else {
$price = $service->charge;
}
break;
case 'consult':
$service = Consultation::query()->where('id', $coupon->coupon->type_id)
->first();
switch ($coupon->coupon->coupon_type){
case 1:
$coupon->coupon->discount_amount = $service->price;
break;
case 2:
$temp = $coupon->coupon->discount_rate;
$coupon->coupon->discount_rate = number_format(10 * $coupon->coupon->discount_rate, 1);
$coupon->coupon->discount_amount = number_format((1- $temp) * $service->price, 2);
break;
case 3:
$coupon->coupon->discount_amount = $coupon->coupon->discount_rate;
break;
default:
$coupon->coupon->discount_amount = 0;
break;
}
break;
default:
break;
}
} else {
return $this->failure('优惠券不存在');
}
}
return $this->success('ok', $user_coupons);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息,请稍后再试');
}
}
}