ufutx.dma/app/Http/Controllers/H5/ActivityController.php

973 lines
43 KiB
PHP
Raw Normal View History

2026-03-04 14:42:40 +08:00
<?php
namespace App\Http\Controllers\H5;
use App\Exports\AgentStocksExport;
use App\Facades\CommonService;
use App\Facades\HttpService;
use App\Facades\WechatService;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Jobs\AddErrorLog;
use App\Jobs\AddShareLog;
use App\Jobs\SendEasySms;
use App\Jobs\SendTemplateNotice;
use App\Models\Activity;
use App\Models\ActivityIntroduceLog;
use App\Models\ActivityMeeting;
use App\Models\ActivityMeetingApply;
use App\Models\ActivityOrder;
use App\Models\ActivityOrderLog;
use App\Models\ActivityShareRefund;
use App\Models\AgentUser;
use App\Models\Band;
use App\Models\ImportApplyUser;
use App\Models\Message;
use App\Models\PartnerCommission;
use App\Models\RecommendUser;
use App\Models\RegularActivity;
use App\Models\RegularActivityOrder;
use App\Models\S2ShopOrder;
use App\Models\User;
use App\Models\UrlLink;
use App\Models\UserIntroduceLog;
use App\Models\Wechat;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Facades\Excel;
class ActivityController extends Controller
{
use ResponseJson;
public function activityOrders(Request $request, $activity_id)
{
$params = $request->all();
$param = http_build_query($params);
$url = config('app.shop_url') . "activities/{$activity_id}/orders?$param";
$res = HttpService::getData($url);
if ($res['code'] == 1)
return $this->failure($res['message']);
$data = $res['data'];
if (isset($params['export']) && $params['export']) {
return Excel::download(new AgentStocksExport($data), '提取记录.xlsx');
}
return $this->success('ok', $data);
}
public function activities()
{
$list = Activity::valid()->select('id', 'price', 'pic', 'title')->orderByDesc("id")->paginate();
return $this->success('ok', $list);
}
public function activitiesV2()
{
$activities = [];
$list1 = Activity::valid()->select('id', 'price', 'pic', 'title', 'start_time', 'end_time')->orderBy("start_time")->limit(2)->get();
foreach ($list1 as $activity) {
$activity_array = $activity->toArray();
$activity_array['type'] = "activity";
$activities[] = $activity_array;
}
// $list2 = RegularActivity::valid()->select("id", 'title', 'pic', 'start_time', 'end_time')->orderBy("start_time")->limit(2)->get();
// foreach ($list2 as $activity) {
// $activity_array = $activity->toArray();
// $activity_array['type'] = "regular";
// $activity_array['price'] = 0;
//// $activity_array['pic'] = RegularActivity::DEFAULT_PIC;
// $activities[] = $activity_array;
// }
return $this->success('ok', $activities);
}
public function regularActivity(RegularActivity $activity)
{
$user = auth()->user();
//是否已报名
$activity->is_paid = RegularActivityOrder::where(["user_id" => $user->id, 'activity_id' => $activity->id])->exists() ? 1 : 0;
//大会id
$activity_id = Activity::valid()->orderBy("start_time", 'desc')->value("id");
$activity->activity_id = $activity_id;
// $activity->pic = RegularActivity::DEFAULT_PIC;
$activity->background = $activity->background ?: "https://images.health.ufutx.com/202403/29/0af4b5799b15e24d6442d4148f694f80.jpeg";
//分享二维码
$qrcode = $activity->activityQrcodes()->where('user_id', $user->id)->where('type', 'H5')->value('qrcode');
if (!$qrcode) {
$url = config("app.url") . "/h5/#/smallConferenceApply?id={$activity->id}&from_user_id={$user->id}&from_type=activity";
$qrcode = CommonService::makeQrcode($url);
$activity->activityQrcodes()->create(['user_id' => $user->id, 'type' => "H5", 'qrcode' => $qrcode]);
}
$activity->share_qrcode = $qrcode;
return $this->success('ok', $activity);
}
public function applyRegularActivity(Request $request, RegularActivity $activity)
{
//报名状态
$status = 1;
$user = auth()->user();
//是否批发商
if (!$user->agentUser || $user->agentUser->level == 0) {
$status = 0;
}
if ($status) {
//生成订单
RegularActivityOrder::firstOrCreate(["user_id" => $user->id, 'activity_id' => $activity->id, 'name' => $request->name, 'mobile' => $request->mobile, 'is_apply_food' => $request->is_apply_food]);
//todo 接龙通知
}
return $this->success('ok', compact('status'));
}
public function activity(Activity $activity)
{
$user = auth()->user();
//是否已下单
$activity->is_paid = ActivityOrder::owner($user->id)->activity($activity->id)->paid()->exists() ? 1 : 0;
//分享二维码
$qrcode = $user->activityQrcodes()->where('activity_id', $activity->id)->where('type', 'H5')->value('qrcode');
if (!$qrcode) {
$url = config("app.url") . "/h5/#/activityDetail?id={$activity->id}&from_user_id={$user->id}&from_type=activity";
$qrcode = CommonService::makeQrcode($url);
$user->activityQrcodes()->create(['activity_id' => $activity->id, 'type' => "H5", 'qrcode' => $qrcode]);
}
$activity->share_qrcode = $qrcode;
return $this->success('ok', $activity);
}
// 活动报名条件限制
public function checkPayActivityCondition($activity): bool
{
if ($activity->id == 30) {
$user = auth()->user();
//八月份活动报名人员 VIP、批发商、手环订单不包括租赁、有正在绑定手环
$agent_user = $user->agentUser;
// 批发商或VIP
$res = ($agent_user && ($agent_user->level == AgentUser::AgentLevelBeing || $agent_user->level == AgentUser::AgentVIP));
if ($res)
return true;
// 正在绑定的手环
$res = Band::owner($user->id)->status(Band::SHOW_STATUS)->exists();
if ($res)
return true;
// 含手环订单
$res = S2ShopOrder::whereIn("shop_type", [11, 12])->where("user_id", $user->id)->where("sku_id", 86)->where("status", "!=", 1)->whereHas("lottoCode")->exists();
if ($res)
return true;
// 不满足上面条件
return false;
}
return true;
}
public function payActivity(Request $request, Activity $activity)
{
$user = auth()->user();
//是否截止报名
if ($activity->apply_end_time && date("Y-m-d H:i:s") > $activity->apply_end_time)
return $this->failure("活动已停止报名");
// $is_paid = ActivityOrder::owner($user->id)->activity($activity->id)->paid()->exists();
// if ($is_paid) return $this->failure("活动已报名");
// 特定活动条件限制
$res = $this->checkPayActivityCondition($activity);
if (!$res)
return $this->failure("没有权限报名此次活动");
$data = $request->only(['name', 'mobile', 'sex', 'sku_id', 'from_user_id', 'area_code', 'is_apply_food']);
if ($activity->is_free) {
if (empty($data['sku_id']))
throw new \Exception("缺少活动规格id");
$sku = collect($activity->sku)->firstWhere('sku_id', $data['sku_id']);
if (empty($sku))
throw new \Exception("未查询到相应规格");
$sku_name = $sku['name'];
$price = $sku['price'];
} else {
$sku_name = '';
$price = 0;
}
$data['activity_id'] = $activity->id;
$data['user_id'] = $user->id;
$data['trade_no'] = "activity_" . CommonService::getTradeNO();
$data['is_pay'] = 0;
$data['sku'] = $sku_name;
$data['num'] = 1;
$data['amount'] = $data['residue_amount'] = $price;
$data['introduce_user_id'] = $data['from_user_id'] ?? null;
$sub_mchid = $activity->payment ? $activity->payment->sub_mch_id : '1626601973';
$data['sub_mch_id'] = $sub_mchid;
//下单
$order = ActivityOrder::create($data);
$config = [];
if ($data['amount']) {
//微信支付
$openid = $user->officialWechat->openid;
$desc = $activity->title . "-" . $sku_name;
$callback = config("app.url") . "/api/h5/activity/order/{$data['trade_no']}/callback";
$appId = config('wechat.official_account.default.app_id') ?: 'wx5174eb5ba45228a4';
$config = WechatService::mpPay($data['trade_no'], $openid, $data['amount'], $desc, $callback, $appId, $sub_mchid);
} else {
//回调
$this->markActivityOrder($order);
}
return $this->success('ok', compact('order', 'config'));
}
/**
* 订单回调
* @param $trade_no
*/
public function callbackOrder($trade_no)
{
$order = ActivityOrder::where('trade_no', $trade_no)->first();
if ($order->is_pay)
return true;
//是否支付成功
$sub_mch_id = $order->sub_mch_id;
$res = WechatService::mpPaid($trade_no, $sub_mch_id);
if ($res)
return false;
$this->markActivityOrder($order);
$this->sendSuccessMsg($order);
return true;
}
public function sendActivityMsg(Request $request)
{
$data = $request->all();
if (!empty($data['open_id'])) {
$params = [
'touser' => $data['open_id'],
'template_id' => config('wechat.tpls.buy_good_success'),
'data' => [
'thing1' => ['value' => $data['title'] ?? ''],
'character_string10' => ['value' => 1],
'amount14' => ['value' => $data['amount']],
'character_string5' => ['value' => $data['trade_no']],
'time4' => ['value' => $data['created_at']],
]
];
Log::info("sendSuccessMsg1 open_id:{$data['open_id']} params:" . json_encode($params));
SendTemplateNotice::dispatch($params)->onQueue('health');
}
if (!empty($data['introduce_open_id'])) {
$params = [
'touser' => $data['introduce_open_id'],
'template_id' => config('wechat.tpls.success_to_introduce'),
'data' => [
'thing27' => ['value' => $data['title']],
'thing7' => ['value' => $data['name']],
'phone_number8' => ['value' => $data['mobile']],
'amount24' => ['value' => $data['amount']]
]
];
SendTemplateNotice::dispatch($params)->onQueue('health');
$params = [
'touser' => $data['introduce_open_id'],
'template_id' => config('wechat.tpls.introduce_refund_msg'),
'data' => [
'thing2' => ['value' => $data['title']],
'thing7' => ['value' => $data['introduce_user_name']],
'const5' => ['value' => "推荐用户下单成功,已为您自动申请退款!"],
'amount1' => ['value' => $data['amount']],
'const12' => ['value' => "审核中"],
]
];
// SendTemplateNotice::dispatch($params)->onQueue('health');
if (!empty($data['introduce_user_mobile'])) {
$introduce_message = "您推荐的用户已报名成功,已为您自动申请回款,待管理员审核通过后将原路返回至您的支付账户。祝您身心健康,友福同享!【友福同享】";
//发送短信通知
$introduce_data = [
'message' => $introduce_message,
];
// SendEasySms::dispatch($data['introduce_user_mobile'], $introduce_data)->onQueue('health');
}
}
$message = "恭喜{$data['name']}获得[友福同享]公司全球准批发商资格!请关注友福同享公众号,即时接收分享订单信息!祝您身心健康,友福同享!【友福同享】";
//发送短信通知
$messageData = [
'message' => $message,
];
SendEasySms::dispatch($data['mobile'], $messageData)->onQueue('health');
//发送企业微信群通知
$orders = ActivityOrder::paid()->where('activity_id', $data['activity_id'])->orderByDesc('id')->limit(3)->get();
if (!$orders->isEmpty()) {
$count = ActivityOrder::paid()->where('activity_id', $data['activity_id'])->count();
//正式群
$url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=905fe4d1-a681-4133-b847-0be2d290477c";
//测试群
if (!(config('app.env') == 'production') || strpos($data['title'], "测试") !== false) {
$url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=fe963d6e-2a67-487a-b0ac-3dbdc62f6f8c";
}
$header = $data['title'] . "\r\n";
$line = "-----------------------\r\n";
$omit = "...\r\n";
$index = 0;
foreach ($orders as $item) {
$introduce_user_name = User::where('id', $item->introduce_user_id)->value('name');
if (empty($introduce_user_name)) {
$introduce_user_name = "";
}
$num = $count - $index;
$name_arr[] = "{$num}:{$item->name} {$item->sku} 介绍人 {$introduce_user_name}\r\n";
$index++;
}
$name_arr = array_reverse($name_arr);
$name_str = implode('', $name_arr);
$qr_code = CommonService::makeqrcode(config('app.url') . "/h5/#/activityDetail?id={$data['activity_id']}");
$img = "[扫码报名]({$qr_code})\r\n";
$page_url = "[查看订单列表](" . config('app.url') . "/work/#/h5/activityOrderV2?id={$data['activity_id']})\r\n";
$send_data = [
'msgtype' => 'markdown',
'markdown' => [
'content' => $header . $line . $omit . $omit . $omit . $name_str . $line . $img . $page_url,
]
];
Http::post($url, $send_data);
}
return $this->success('ok');
}
public function sendSuccessMsg($order)
{
//发送公众号消息通知
$activity = Activity::where('id', $order->activity_id)->first();
$open_id = Wechat::where('user_id', $order->user_id)->where('type', 'official')->value('openid');
Log::info("sendSuccessMsg open_id:{$open_id}");
if (!empty($open_id)) {
$params = [
'touser' => $open_id,
'template_id' => config('wechat.tpls.buy_good_success'),
'data' => [
'thing1' => ['value' => $activity->title],
'character_string10' => ['value' => $order->num],
'amount14' => ['value' => $order->amount],
'character_string5' => ['value' => $order->trade_no],
'time4' => ['value' => $order->created_at->toDatetimeString()],
]
];
Log::info("sendSuccessMsg1 open_id:{$open_id} params:" . json_encode($params));
SendTemplateNotice::dispatch($params)->onQueue('health');
}
//发送消息给推荐人
$introduce_open_id = Wechat::where('user_id', $order->introduce_user_id)->where('type', 'official')->value('openid');
if (!empty($introduce_open_id) && $order->introduce_user_id != $order->user_id) {
$introduce_user_info = User::where('id', $order->introduce_user_id)->first();
//查看是否购买订单
$introduce_order = ActivityOrder::where('user_id', $order->introduce_user_id)->sum("residue_amount");
if ($introduce_order > 0) {
$params = [
'touser' => $introduce_open_id,
'template_id' => config('wechat.tpls.success_to_introduce'),
'data' => [
'thing27' => ['value' => $activity->title],
'thing7' => ['value' => $order->name],
'phone_number8' => ['value' => $order->mobile],
'amount24' => ['value' => $order->amount]
]
];
SendTemplateNotice::dispatch($params)->onQueue('health');
// $params = [
// 'touser'=> $introduce_open_id,
// 'template_id'=>config('wechat.tpls.introduce_refund_msg'),
// 'data'=>[
// 'thing2' => ['value'=>$activity->title??''],
// 'thing7' => ['value'=>$introduce_user_info->name],
// 'const5' => ['value'=>"推荐用户下单成功,已为您自动申请退款!"],
// 'amount1' => ['value'=>$order->amount],
// 'const12' => ['value'=>"审核中"],
// ]
// ];
// SendTemplateNotice::dispatch($params)->onQueue('health');
$params = [
'touser' => $introduce_open_id,
'template_id' => config('wechat.tpls.introduce_refund_msg_v1'),
'data' => [
'character_string1' => ['value' => $order->trade_no],
'thing6' => ['value' => $activity->title],
'thing2' => ['value' => $order->name],
'amount8' => ['value' => $order->amount],
'thing5' => ['value' => "推荐用户下单成功,已为您自动申请退款!"],
]
];
// SendTemplateNotice::dispatch($params)->onQueue('health');
if (!empty($introduce_user_info->mobile)) {
$introduce_message = "您推荐的用户已报名成功,已为您自动申请退款,待管理员审核通过后将原路返回至您的支付账户。祝您身心健康,友福同享!【友福同享】";
//发送短信通知
$introduce_data = [
'message' => $introduce_message,
];
// SendEasySms::dispatch($introduce_user_info->mobile, $introduce_data)->onQueue('health');
}
}
}
//发送短信通知
$count = ActivityOrder::paid()->distinct('user_id')->count();
// pages/sub_page/officialAccounts
// $wechatLink = WechatService::getMpUrlLink("pages/tabBar/home",null);
// //获取短链接
// $shortUrl = CommonService::getShortUrl(env('APP_URL').'/h5/#/jumpUrl?url='.$wechatLink);
$message = "恭喜{$order->name}获得[友福同享]公司全球准批发商资格!请关注友福同享公众号,即时接收分享订单信息!祝您身心健康,友福同享!【友福同享】";
//发送短信通知
$data = [
'message' => $message,
];
SendEasySms::dispatch($order->mobile, $data)->onQueue('health');
//发送企业微信群通知
$orders = ActivityOrder::paid()->where('activity_id', $order->activity_id)->orderByDesc('id')->limit(3)->get();
if (!$orders->isEmpty()) {
$count = ActivityOrder::paid()->where('activity_id', $order->activity_id)->count();
//正式群
$url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=905fe4d1-a681-4133-b847-0be2d290477c";
//测试群
if (!(config('app.env') == 'production') || strpos($activity->title, "测试") !== false) {
$url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=fe963d6e-2a67-487a-b0ac-3dbdc62f6f8c";
}
$header = $activity->title . "\r\n";
$line = "-----------------------\r\n";
$omit = "...\r\n";
$index = 0;
foreach ($orders as $item) {
$introduce_user_name = User::where('id', $item->introduce_user_id)->value('name');
if (empty($introduce_user_name)) {
$introduce_user_name = "";
}
$num = $count - $index;
$name_arr[] = "{$num}:{$item->name} {$item->sku} 介绍人 {$introduce_user_name}\r\n";
$index++;
}
$name_arr = array_reverse($name_arr);
$name_str = implode('', $name_arr);
$qr_code = CommonService::makeqrcode(config('app.url') . "/h5/#/activityDetail?id={$order->activity_id}");
$img = "[扫码报名]({$qr_code})\r\n";
$page_url = "[查看订单列表](" . config('app.url') . "/work/#/h5/activityOrderV2?id={$order->activity_id})\r\n";
$send_data = [
'msgtype' => 'markdown',
'markdown' => [
'content' => $header . $line . $omit . $omit . $omit . $name_str . $line . $img . $page_url,
]
];
Http::post($url, $send_data);
}
}
public function markActivityOrder($order)
{
DB::beginTransaction();
//修改订单状态
$order->update(['is_pay' => 1]);
//增加介绍人
if ($order->introduce_user_id) {
$this->addRecommendUser($order);
}
//用户介绍人
$introduce_user_id = $order->user->recommendUser ? $order->user->recommendUser->id : null;
// //通过介绍人购买,减扣介绍人订单金额
// if ($order->introduce_user_id && $order->amount && $order->introduce_user_id == $introduce_user_id && $order->introduce_user_id != $order->user_id) {
// $this->decrementAmount($order->introduce_user_id , $order->amount, $type="INTRODUCE", $order);
// }
//通过其他人分享购买,其他人含有余额生成退款记录, 退款金额小于等于当前用户支付金额
// if ($order->introduce_user_id && $order->amount && $order->introduce_user_id != $order->user_id && $introduce_user_id == $order->introduce_user_id) {
// $this->refundAmount($order->introduce_user_id, $order->amount, $type="INTRODUCE", $order);
// }
//注册准批发商(批发商)
// $this->registerAgentUser($order);
AgentUser::changeLevel($order->user_id, AgentUser::AgentLevelBeing, "购买活动门票");
$activity = $order->activity;
//插入余额记录
ActivityOrderLog::addActivityOrderLog($order->user_id, $order->id, $order->amount, "购买活动【{$activity->title}】门票", null, null, ActivityOrderLog::ORDER_TYPE);
//记录问题介绍人分享 介绍人并且分享的订单并且没有退款绑定订单
$this->markOrderUnusual($order);
//加入当前小会抽奖
// $this->joinRegularActivityLottery($order);
//加入当前大会抽奖池
$this->joinActivityLottery($order);
//加入当前大会签到池
// $this->joinActivityMember($order);
DB::commit();
}
//加入当前大会签到池
public function joinActivityMember($order)
{
$activity = $order->activity;
//签到状态 购买时间在活动期间
$status = 0;
// $now = date("Y-m-d H:i:s");
// if ($activity->start_time <= $now && $activity->end_time >= $now) {
// $status = 1;
// //扣除参加费用 200
// if ($order->amount >= Activity::SIGN_FEE) {
// $this->decrementOrderAmount($order, Activity::SIGN_FEE, $activity);
// }
// }
$activity->members()->updateOrCreate(['user_id' => $order->user_id, 'activity_id' => $activity->id], ['status' => $status]);
}
/**
* 减扣指定订单的余额
* @param $order 当前扣费订单
* @param $amount 扣费金额
*/
public function decrementOrderAmount($order, float $amount, $activity)
{
//判断订单余额是否充足
if ($order->residue_amount < $amount)
return false;
$order->decrement('residue_amount', $amount);
//插入余额记录
ActivityOrderLog::addActivityOrderLog($order->user_id, $order->id, number_format($amount * -1, 2, '.', ''), "{$activity->title}】活动期间下单并签到", null, null, ActivityOrderLog::SIGNIN_TYPE);
return true;
}
//加入当前大会抽奖池
public function joinActivityLottery($order)
{
$activity = $order->activity;
if ($activity && $activity->lottery) {
$activity->lottery->members()->updateOrCreate(['user_id' => $order->user_id, 'lottery_id' => $activity->lottery->id], ['name' => $order->user->name, 'mobile' => $order->user->mobile]);
}
}
/**
* 用户签到了当前 active 或者 ongoing 小会,
* @param $order
*/
public function joinRegularActivityLottery($order)
{
Log::info("加入小会抽奖名单");
$activity = RegularActivity::whereIn("status", [RegularActivity::ACTIVE_STATUS, RegularActivity::ONGOING_STATUS])->orderBy("start_time", "ASC")->first();
if ($activity) {
Log::info("小会信息 id{$activity->id} title:{$activity->title}");
$member = $activity->members()->where("user_id", $order->user_id)->first();
if ($member && $activity->lottery) {
$activity->lottery->members()->updateOrCreate(['user_id' => $order->user_id, 'lottery_id' => $activity->lottery->id], ['name' => $order->user->name, 'mobile' => $order->user->mobile]);
}
}
}
/**
* 推荐的订单 没有作为退款目标订单记录
* @param $order
*/
public function markOrderUnusual($order)
{
Log::info("检查异常分享订单");
$target_order = ActivityOrder::whereDoesntHave("targetRefunds")->whereHas("recommendUser", function ($sql) use ($order) {
$sql->where('recommend_user_id', $order->user_id);
})->paid()->where('introduce_user_id', $order->user_id)->first();
if ($target_order) {
$order->update(['introduce_unusual' => 1, 'unusual_target_id' => $target_order->id]);
}
}
public function addRecommendUser($order)
{
$recommend_user_id = $order->introduce_user_id;
//第一次分享成为介绍人
$user = $order->user;
if (!$user->recommendUserLog && $order->user_id != $recommend_user_id) {
$user->recommendUserLog()->create(['recommend_user_id' => $recommend_user_id]);
}
}
public function registerAgentUser($order)
{
// $form_accid = null;
// if ($order->introduce_user_id && $order->introduce_user_id != $order->user_id) {
// $form_accid = User::SAAS_PREFIX.$order->introduce_user_id;
// }
// $user = $order->user;
// $url = config('app.shop_url').'agent/users';
// $param = ['accid'=>$user->accid(), 'nickname'=>$user->name, 'mobile'=>$user->mobile, 'pic'=>$user->avatar, 'from_accid'=>$form_accid, 'level'=>2];
// $res = HttpService::postData($url, $param);
$agent_user = AgentUser::where(['user_id' => $order->user_id])->first();
if (empty($agent_user) || $agent_user->level == 0) {
AgentUser::create(['user_id' => $order->user_id, 'level' => 2]);
}
}
public function refundAmount($user_id, $amount, $type, $order = null)
{
//介绍人订单
$introduce_orders = ActivityOrder::owner($user_id)->paid()->residue()->get();
if ($introduce_orders) {
$sum = $amount;
foreach ($introduce_orders as $introduce_order) {
if ($sum == 0)
break;
if ($introduce_order->residue_amount >= $sum) {
$value = $sum;
} else {
$value = $introduce_order->residue_amount;
}
$introduce_order->decrement('residue_amount', $value);
$target_order = $order ?: $introduce_order;
ActivityIntroduceLog::create(['order_id' => $target_order->id, 'amount' => $value, 'introduce_order_id' => $introduce_order->id, 'type' => $type]);
//todo 生成退款记录
if ($type == ActivityIntroduceLog::INTRODUCETYPE) {
ActivityShareRefund::create([
'user_id' => $introduce_order->user_id,
'order_id' => $introduce_order->id,
'target_order_id' => $order->id,
'trade_no' => $introduce_order->trade_no,
'refund_trade_no' => CommonService::getTradeNO(),
'total_amount' => $introduce_order->amount,
'amount' => $value,
'status' => 0,
'sub_mch_id' => $introduce_order->sub_mch_id,
'type' => ActivityShareRefund::SHARETYPE,
]);
}
$sum -= $value;
}
}
}
/**
* 扣除余额
* @param $user_id
* @param $activity_id
*/
public function decrementAmount($user_id, $amount, $type, $order = null)
{
//介绍人订单
$introduce_orders = ActivityOrder::owner($user_id)->paid()->residue()->get();
if ($introduce_orders) {
$sum = $amount;
foreach ($introduce_orders as $introduce_order) {
if ($sum == 0)
break;
if ($introduce_order->residue_amount >= $sum) {
$value = $sum;
} else {
$value = $introduce_order->residue_amount;
}
$introduce_order->decrement('residue_amount', $value);
$target_order = $order ?: $introduce_order;
ActivityIntroduceLog::create(['order_id' => $target_order->id, 'amount' => $value, 'introduce_order_id' => $introduce_order->id, 'type' => $type]);
//todo 增加收益
PartnerCommission::create([
'order_id' => $target_order->id,
'order_no' => $target_order->trade_no,
'order_commission_id' => $target_order->id . $target_order->trade_no,
'user_id' => $user_id,
'role' => 1,
'status' => 0,
'amount' => $value,
'type' => 1,
]);
$sum -= $value;
}
//插入余额记录
ActivityOrderLog::addActivityOrderLog($user_id, $target_order->id, -$amount, "活动签到", null, null, ActivityOrderLog::SIGNIN_TYPE);
}
}
/**
* 用户订单列表
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function orders()
{
$user_id = auth()->id();
$orders = ActivityOrder::with('activity:id,title,pic')->owner($user_id)->paid()->orderByDesc('id')->paginate();
return $this->success('ok', $orders);
}
public function order(ActivityOrder $order)
{
$order->activity;
//消耗记录
$logs = ActivityIntroduceLog::with('order:id,name,mobile')->where('introduce_order_id', $order->id)->get();
return $this->success('ok', compact('logs', 'order'));
}
public function getActivityOrder(ActivityOrder $order, $activity_id)
{
$exists = Activity::where('id', $activity_id)->exists();
if (!$exists) {
return $this->failure('活动不存在');
}
$orders = $order->with(['activity', 'introduceUser'])->Paid()->where('activity_id', $activity_id)->orderByDesc('id')->paginate();
return $this->success('ok', $orders);
}
/**
* 介绍人订单列表
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function introduceOrders()
{
$user_id = auth()->id();
$orders = ActivityOrder::with('activity:id,title,pic', 'introduceLog')->introduce($user_id)->paid()->orderByDesc('id')->paginate();
foreach ($orders as $order) {
$order->income = 0;
if ($order->introduceLog) {
$order->income = $order->introduceLog->amount;
}
unset($order->introduceLog);
}
return $this->success('ok', $orders);
}
public function introduceQrcode($activity_id)
{
$user = auth()->user();
$qrcode = $user->activityQrcodes()->where('activity_id', $activity_id)->where('type', 'H5')->value('qrcode');
if (!$qrcode) {
$url = config("app.url") . "/h5/#/activityDetail?id={$activity_id}&from_user_id={$user->id}&from_type=activity";
$qrcode = CommonService::makeQrcode($url);
$user->activityQrcodes()->create(['activity_id' => $activity_id, 'type' => "H5", 'qrcode' => $qrcode]);
}
return $this->success('ok', compact('qrcode'));
}
public function activityMenu(Request $request, $activity_id)
{
try {
$meeting = ActivityMeeting::where('activity_id', $activity_id)->first();
if (!empty($meeting)) {
$menus = json_decode($meeting->menu, true);
$index = -1;
foreach ($menus as $key => $subArray) {
if ($subArray['name'] === "座位查询") {
$index = $key;
break;
}
}
if ($index !== -1) {
// 移除特定元素并插入到数组第一位
$specificElement = $menus[$index];
unset($menus[$index]);
array_unshift($menus, $specificElement);
}
$meeting->menu = $menus;
}
return $this->success('ok', $meeting);
} catch (\Exception $e) {
AddErrorLog::dispatch('getActivityMenu file:' . $e->getFile() . ' line:' . $e->getLine() . ' message:' . $e->getMessage())->onQueue('health');
return $this->failure($e->getMessage());
}
}
public function activityMeetingApply(Request $request, $activity_id)
{
try {
$user_id = auth()->user()->id;
$name = $request->input('name');
$mobile = $request->input('mobile');
if (empty($mobile)) {
return $this->failure('姓名和电话不为空');
}
$is_sign = ActivityMeetingApply::where('activity_id', $activity_id)->where('mobile', $mobile)->first();
if ($is_sign) {
if ($is_sign->user_id == 0) {
$is_sign->user_id = $user_id;
$is_sign->save();
}
return $this->success('ok', $is_sign);
}
//暂时注释部分,下一个活动打开
$is_apply = ActivityOrder::paid()->where('activity_id', $activity_id)->where('mobile', $mobile)->first();
if (!$is_apply) {
$residue_amount = ActivityOrder::where('user_id', $user_id)->where('mobile', $mobile)->sum('residue_amount');
if ($residue_amount < ActivityOrder::PRICE) {
return $this->failure('余额不足');
}
}
//查看是否导入数据,下个活动去除
// $import_apply = ImportApplyUser::where('mobile',$mobile)->first();
// if(!$import_apply){
// return $this->failure('暂未报名');
// }
// $name = $import_apply->name;
$activity_meeting = ActivityMeeting::where('activity_id', $activity_id)->first();
if (empty($activity_meeting)) {
return $this->failure('活动会议不存在');
}
$number = $activity_meeting->start_desk;
//查看是否已经排桌
$apply_desk_user = ActivityMeetingApply::where('activity_id', $activity_id)->where('desk_number', $number)->count();
while ($apply_desk_user >= $activity_meeting->user_number) {
$number = $number + 1;
$apply_desk_user = ActivityMeetingApply::where('activity_id', $activity_id)->where('desk_number', $number)->count();
}
//如果桌子号大于了最大排桌,往没坐满桌子排
// if($number > $activity_meeting->total_desk){
// $number = ActivityMeetingApply::where('activity_id',$activity_id)
// ->select('desk_number', DB::raw('count(*) as count'))
// ->groupBy('desk_number')
// ->havingRaw('count(*) < ?', [$activity_meeting->user_number])
// ->orderBy('desk_number', 'asc')
// ->value('desk_number');
// }
// if($number > $activity_meeting->total_desk || $number < $activity_meeting->start_desk || empty($number)){
// return $this->failure('座位已满,请联系工作人员');
// }
$map = [];
$map['user_id'] = $user_id;
$map['activity_id'] = $activity_id;
$map['name'] = $name;
$map['mobile'] = $mobile;
$map['desk_number'] = $number;
ActivityMeetingApply::create($map);
//暂时注释部分,下一个活动打开
//没有分享下单,扣除签到金额
$res = ActivityOrder::notOwner($user_id)->activity($activity_id)->paid()->introduce($user_id)->exists();
if (empty($res)) {
$this->decrementAmount($user_id, ActivityOrder::PRICE, $type = "SIGNIN");
}
return $this->success('ok');
} catch (\Exception $e) {
AddErrorLog::dispatch('activityMeetingApply file:' . $e->getFile() . ' line:' . $e->getLine() . ' message:' . $e->getMessage())->onQueue('health');
return $this->failure($e->getMessage());
}
}
public function meetingMenuDetail(Request $request, $activity_id)
{
try {
$name = $request->get('name');
$meeting = ActivityMeeting::where('activity_id', $activity_id)->first();
if (empty($meeting)) {
return $this->success('ok', $meeting);
}
$menus = json_decode($meeting->menu, true);
$images = null;
foreach ($menus as $menu) {
if (!isset($menu['name']) || !isset($menu['images'])) {
continue;
}
if ($menu['name'] != $name) {
continue;
}
$images = $menu['images'];
break;
}
if ($name == "入场签到") {
$images = $meeting->sign_images;
}
return $this->success('ok', $images);
} catch (\Exception $e) {
return $this->failure($e->getMessage());
}
}
public function getMeetingDeskNumber(Request $request, $activity_id)
{
try {
$mobile = $request->get('mobile');
$desk_number = ActivityMeetingApply::where('activity_id', $activity_id)->where('mobile', $mobile)->first();
if (empty($desk_number)) {
return $this->failure('暂未查询到座位');
}
$desk_number->desk_images = ActivityMeeting::where('activity_id', $activity_id)->value('desk_images');
return $this->success('ok', $desk_number);
} catch (\Exception $e) {
return $this->failure($e->getMessage());
}
}
public function addActivityImportApply(Request $request)
{
try {
$name = $request->input('name');
$mobile = $request->input('mobile');
$activity_id = $request->input('activity_id');
if (empty($activity_id))
return $this->failure('活动id不为空');
if (empty($mobile) || empty($name)) {
return $this->failure('手机号不为空');
}
$exists = ImportApplyUser::where('activity_id', $activity_id)->where('mobile', $mobile)->exists();
if ($exists)
return $this->failure('手机号已存在');
ImportApplyUser::create(['activity_id' => $activity_id, 'name' => $name, 'mobile' => $mobile]);
return $this->success("ok");
} catch (\Exception $e) {
AddErrorLog::dispatch('addActivityApplyUser file:' . $e->getFile() . ' line:' . $e->getLine() . ' message:' . $e->getMessage())->onQueue('health');
return $this->failure($e->getMessage());
}
}
/**
* 查询录入的人员列表
*/
public function getActivityImportApply(Request $request)
{
try {
$keyword = $request->input('keyword');
$activity_id = $request->input('activity_id');
if (empty($activity_id))
return $this->failure('活动id不为空');
$list = ImportApplyUser::when($keyword, function ($query) use ($keyword) {
$query->where('name', 'like', '%' . $keyword . '%')->orWhere('mobile', 'like', "%" . $keyword . "%");
})->where('activity_id', $activity_id)->orderByDesc('id')->paginate();
foreach ($list as $item) {
$item->is_sign = false;
$exists = ActivityMeetingApply::where('activity_id', $activity_id)->where('mobile', $item->mobile)->exists();
if ($exists) {
$item->is_sign = true;
}
}
return $this->success("ok", $list);
} catch (\Exception $e) {
AddErrorLog::dispatch('addActivityApplyUser file:' . $e->getFile() . ' line:' . $e->getLine() . ' message:' . $e->getMessage())->onQueue('health');
return $this->failure($e->getMessage());
}
}
/**
* 获取活动
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function getActivity()
{
$date = date('Y-m-d H:i:s');
$activity = Activity::where('start_time', '<=', $date)->where('end_time', '>=', $date)->where('status', Activity::STATUS_OPEN)->orderByDesc('start_time')->first();
if (empty($activity)) {
$activity = Activity::where('start_time', '>=', $date)->where('status', Activity::STATUS_OPEN)->orderBy('start_time', 'asc')->first();
}
if (empty($activity)) {
$activity = Activity::where('end_time', '<=', $date)->where('status', Activity::STATUS_OPEN)->orderByDesc('end_time')->first();
}
return $this->success('ok', $activity);
}
}