ufutx.dma/app/Http/Controllers/H5/ActivityController.php
2026-03-04 14:42:40 +08:00

973 lines
43 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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);
}
}