love_php/app/Services/CronService.php
2026-04-02 09:20:51 +08:00

6149 lines
261 KiB
PHP
Raw 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\Services;
use App\Common\cache\redis\ApiRedisKey;
use App\Facades\QrcodeRectService;
use App\Jobs\CheckMEarningAccount;
use App\Jobs\CreateLiveMpqrcode;
use App\Jobs\GroupChatUnreadNotice;
use App\Jobs\MakeQrcode;
use App\Jobs\ReportExport;
use App\Jobs\SendEarningMessage;
use App\Jobs\SendEasySms;
use App\Jobs\SendMail;
use App\Model\Server\TencentFaceidLog;
use App\Models\AccessRecord;
use App\Models\AnchorVideo;
use App\Models\App\MsgHistory;
use App\Models\App\UserTeam;
use App\Models\BlackIp;
use App\Models\CheckMobile;
use App\Models\ClientComment;
use App\Models\ConsultAccount;
use App\Models\Consultation;
use App\Models\ConsultationRecords;
use App\Models\Course\Course;
use App\Models\Course\UserCourses;
use App\Models\CrmRole;
use App\Models\CrmUser;
use App\Models\CrmUserLog;
use App\Models\Earning;
use App\Models\EarningAccount;
use App\Models\ErrorPhoto;
use App\Models\LinkingBlacklist;
use App\Models\Live\ActivityUser;
use App\Models\Live\Anchor;
use App\Models\Live\Live;
use App\Models\Live\Viewer;
use App\Models\Live\ViewerShare;
use App\Models\MakerScoreLog;
use App\Models\Match\Request;
use App\Models\MEarningwithdraws;
use App\Models\MerchantInfo;
use App\Models\MerchantShop;
use App\Models\NoticeMessage;
use App\Models\QATest;
use App\Models\Questionnaire;
use App\Models\RecommendUser;
use App\Models\SaasUserAppointment;
use App\Models\Server\MarketService;
use App\Models\Server\MEarningGrade;
use App\Models\Server\MEarningGradeUser;
use App\Models\Server\MerchantEvaluate;
use App\Models\Server\MerchantMembers;
use App\Models\Server\MerchantReport;
use App\Models\Server\MerchantService;
use App\Models\Server\MerchantUser;
use App\Models\Server\ReportAnswer;
use App\Models\Server\ReportQuestion;
use App\Models\Server\SaasNotice;
use App\Models\Server\ServiceOrderOperation;
use App\Models\Server\ServiceRoleAdmin;
use App\Models\UserPreview;
use App\Models\UserSign;
use App\Server\ReportFile;
use App\Services\IMService;
use App\Utils\Messenger as Messengers;
use Carbon\Carbon;
use App\Models\UserReservation;
use App\Models\Participant;
use App\Utils\Messenger;
use App\Models\Message;
use App\Models\RankHistory;
use App\Models\Order;
use App\Models\PayOrder;
use App\Models\FormId;
use App\Models\User;
use App\Models\Linking;
use App\Models\Wechat;
use App\Models\MatchingRate;
use App\Models\ProfileCourtship;
use App\Models\ProfileMarriage;
use App\Models\ChatMessage;
use App\Http\Controllers\UploadController;
use Illuminate\Support\Facades\Log;
use Intervention\Image\ImageManagerStatic as Image;
use App\Utils\Http;
use App\Repositories\Eloquent\SmsRepository as Sms;
use App\Models\RefundOrder;
use App\Models\TempMember;
use App\Models\Notice;
use App\Models\RecommendSingleHistory;
use App\Models\InviteHistory;
use App\Models\Rank;
use App\Models\Activity;
use EasyWechat;
use App\Imports\UsersImport;
use App\Exports\ReferreExport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\DB;
use App\Models\ReferreAwardHistory;
use App\Models\FellowingCard as Card;
use App\Models\ActivityMember;
use App\Models\PaasWithdraw;
use App\Models\Referre;
use App\Models\AddedBonus;
use App\Models\Bonus;
use App\Models\RedPacketOrder;
use App\Models\TransferOrder;
use App\Models\Arena;
use App\Models\SingleProfile;
use App\Models\MatchingSingleHistory;
use App\Models\RecommendLinking;
use App\Models\RecommendLinkingNew;
use App\Models\SoulAnswer;
use App\Models\Dynamic;
use App\Models\FruitHistory;
use App\Models\Community;
use App\Models\CommunityMember;
use App\Models\ParticipantRedPacket;
use App\Models\InteractLive;
use App\Models\InteractLiveLog;
use App\Models\Coin;
use App\Models\CoinLog;
use App\Models\CheckMobile as CheckMobileModel;
use App\Models\SignLog;
use App\Models\UserPreviewHistory;
use App\Models\TeamLive;
use App\Models\App\Team;
use App\Models\Liveperson;
use App\Models\FaceMatch;
use App\Models\MEarning;
use App\Models\MEarningAccount;
use App\Models\AnchorArticle;
use App\Models\MerchantInformation;
use App\Models\MEarningRules;
use App\Http\Response\ResponseJson;
use Illuminate\Support\Facades\Cache;
use EasyWeChat\Kernel\Messages\Text;
use Illuminate\Support\Facades\Redis;
/**
* Jobs
*/
use App\Jobs\SendServiceNews;
use App\Jobs\CreateNewYearPacket;
use App\Jobs\SendAGRecommend;
use App\Jobs\CreateParticipantPacket;
use App\Jobs\SendTemplateMsg;
use App\Jobs\SendSubTemplateMsg;
use App\Jobs\SendSmsBatch;
use App\Jobs\SignActitityMember;
use App\Models\AreaUser;
use App\Models\ClassArea;
use App\Models\ClassAreaSetting;
use App\Models\CommunityActivity;
use App\Models\MerchantAccount;
use App\Models\Portrait;
use App\Models\PortraitRecord;
use App\Models\ProfilePhoto;
use App\Models\Server\CollageGroup;
use App\Models\Server\CollageGroupBatch;
use App\Models\Server\CollageGroupHistories;
use App\Models\Server\MRefundOrder;
use App\Models\Server\TouristOrder;
use App\Models\SystemBlacklist;
use App\Models\TemplateMsgLog;
/*
Service
*/
use App\Services\UserService;
use App\Services\ActivityService;
use App\Services\MomentService;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use App\Facades\CommonUtilsService;
use App\Models\StaffUser;
class CronService
{
use ResponseJson;
protected $sms;
protected $userService;
protected $activityService;
protected $momentCon;
/*
* 构造函数
*/
public function __construct(Sms $sms)
{
$this->sms = $sms;
$this->userService = new UserService();
$this->activityService = new ActivityService();
$this->momentCon = new MomentService($sms);
Carbon::setLocale('zh');
}
//通用发短信任务
public function sentMessage($mobile, $message)
{
$this->sms->sentMessage($mobile, $message);
}
//支付回调
public function checkMarkOrder()
{
// $trade_nos = PayOrder::where('is_hooked', 0)->pluck('trade_no');
$trade_nos = DB::table('pay_orders')->where('is_hooked')->pluck('trade_no');
foreach ($trade_nos as $trade_no) {
$url = config('app.url') . '/api/mark/order/pay/' . $trade_no;
Http::http($url, [], "GET");
}
return 'ok';
}
public function checkFailTransfer()
{
$histories = ReferreAwardHistory::where('is_hooked', -1)->get();
foreach ($histories as $history) {
$trade_no = $history->trade_no;
$openid = Wechat::where('user_id', $history->user_id)->value('openid');
if ($history->type === 'register') {//注册
$amount = 1 * 100;
$desc = '推荐注册用户奖励(福恋小程序)';
} elseif ($history->type === 'approve') {
$amount = 2 * 100;
$desc = '推荐认证用户奖励(福恋小程序)';
}
$result = \WechatService::userTransfer($trade_no, $openid, $amount, $desc);
if ($result) {
$history->is_hooked = 0;
$history->save();
} else {
}
}
return;
}
/**
* 发送用户报告统计数据给商家
*/
public function sendUserReportStatisticToMerchant()
{
$time = date('H') . ':00:00';
$merchant_configs = MerchantReport::where('notification_type', '!=', 0)->where('notification_time', $time)
->get();
foreach ($merchant_configs as $key => $val) {
$openid = MerchantAccount::where('id', $val->m_id)->value('openid');
if (!$openid) {
continue;
}
$order_count = TouristOrder::where('type', $val->type)->where('type_id', $val->type_id)->whereIn('pay_status', [1, 4])
->count();
$order_ids = TouristOrder::where('type', $val->type)->where('type_id', $val->type_id)->whereIn('pay_status', [1, 4])
->pluck('id')->toArray();
if ($val->notification_type == 1) {
$add_time = Carbon::today()->toDateString();
$report_count = ReportAnswer::whereIn('m_order_id', $order_ids)->where('created_at', '>=', $add_time . ' 00:00:00')
->where('created_at', '>=', $add_time . ' 23:59:59')->count();
} elseif ($val->notification_type == 2) {
$add_time = Carbon::today()->addDays(-1)->toDateString();
$report_count = ReportAnswer::whereIn('m_order_id', $order_ids)->where('created_at', '>=', $add_time . ' 00:00:00')
->where('created_at', '>=', $add_time . ' 23:59:59')->count();
}
$activity = CommunityActivity::where('id', $val->type_id)->first();
$a = round($report_count / $order_count * 100, 2) . '%';
$tesk_name = ReportQuestion::where('type_id', $val->type_id)->where('type', $val->type)->value('title');
if (!$tesk_name) {
continue;
}
$merchant = MerchantAccount::find($val->m_id);
$param['openid'] = $openid;
$param['first'] = $merchant->share_title . '您好';
$param['keyword1'] = $activity->title . ' ' . $add_time;
$param['keyword2'] = $tesk_name;
$param['keyword3'] = '共' . $a . ' (' . $report_count . '/' . $order_count . ') 人完成';
$param['remark'] = '请在后台查看详情';
\WechatService::reportStatisticNotice($param);
}
}
//转账回调
public function checkReferreTransfer()
{
$histories = ReferreAwardHistory::where('is_hooked', 0)->get();
foreach ($histories as $history) {
$result = \WechatService::transferred($history->trade_no);
if ($result) {
$history->is_hooked = 1;
$history->save();
} else {
$history->is_hooked = -1;
$history->save();
}
}
return;
}
//清除没有支付的订单
public function checkUnpaidOrder()
{
try {
$trade_nos = DB::table('pay_orders')->where('pay_status', 'UNPAID')->where('is_hooked', 0)->where('cash', '>', 0)->pluck('trade_no');
foreach ($trade_nos as $trade_no) {
$pay_order = PayOrder::where('trade_no', $trade_no)->first();
if (empty($pay_order)) {
continue;
}
$order = Order::where('trade_no', $trade_no)->first();
$now_time = date('Y-m-d H:i:s');
$order_time = $pay_order->created_at->toDateTimeString();
$compare_result = $this->compareTime($now_time, $order_time);
if ($compare_result) {
if ($order->pay_type == 'wechat') {
$url = config('app.url') . '/api/app/callback/orders/' . $trade_no;
$data = [];
} else {
continue;
}
$result = Http::post($url, $data);
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function checkIOSUnpaidOrder()
{
try {
$end_time = date('Y-m-d H:i:s');
$start_time = date('Y-m-d H:i:s', strtotime('-30 minute'));
$orders = Order::with('payorder')->whereBetween('created_at', [$start_time, $end_time])->where('pay_type', 'ios')->where('pay_status', "UNPAID")->orderBy('id', 'desc')->get();
foreach ($orders as $order) {
$url = config('app.url') . '/api/ios/orders/notify';
$data = [
'trade_no' => $order->trade_no,
'apple_receipt' => $order->payorder->receipt
];
$result = Http::http($url, $data, 'POST');
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function compareTime($time1, $time2)
{
$str_time1 = strtotime($time1);
$str_time2 = strtotime($time2) + 30 * 24 * 3600;
if ($str_time1 >= $str_time2) {//已過期
return false;
} else {
return true;
}
}
/**
* 检测退款订单
* @return [type] [description]
*/
public function chechRefundOrder()
{
try {
//活动退款
$refund_orders = RefundOrder::where('type', '<>', 'approve')->where('is_hook', 0)->get();
foreach ($refund_orders as $order) {
if ($order->refund_fee == 0) {
RefundOrder::where('id', $order->id)->update(['is_hook' => 1]);
} else {
$result = \WechatService::orderRefunded($order->refund_trade_no);
if ($result) {
RefundOrder::where('id', $order->id)->update(['is_hook' => 1]);
}
}
}
//认证退费转账
$refund_orders = RefundOrder::where('type', 'approve')->where('is_hook', 0)->get();
foreach ($refund_orders as $order) {
$result = \WechatService::transferred($order->refund_trade_no);
if ($result) {
$order->is_hook = 1;
$order->save();
}
}
return;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
//检测form_id是否失效
public function checkFormId()
{
try {
$end_time = date('Y-m-d H:i:s', strtotime('-7 day'));
$form_id_arr = DB::table('form_ids')->where('created_at', '<=', $end_time)->delete();
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 添加好友
*/
public function addFriend()
{
try {
$openids = DB::table('wechats')->whereNotNull('user_id')->whereNotNull('deleted_at')->pluck('openid');
$users = DB::table('users')->whereIn('from_openid', $openids)->whereNotNull('from_openid')->where('from_openid', '<>', '')->whereNull('deleted_at')
->get();
foreach ($users as $user) {
$user_id = $user->id;
$send_user_id = DB::table('wechats')->where('openid', $user->from_openid)->value('user_id');
if ($send_user_id) {
$link = Linking::where(function ($sql) use ($user_id, $send_user_id) {
$sql->where('user_id', $user_id)->where('user_linking_id', $send_user_id);
})->orWhere(function ($sql) use ($user_id, $send_user_id) {
$sql->where('user_id', $send_user_id)->where('user_linking_id', $user_id);
})->first();
if (empty($link)) {
DB::table('linkings')->insert([
'user_id' => $user_id,
'user_linking_id' => $send_user_id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
}
return true;
} catch (Exception $e) {
$this->getError($e);
return false;
}
}
public function userMatchingRate()
{
$now_time = time();
$start_time = date('Y-m-d', strtotime('-1 day'));
$user_ids = ProfileCourtship::where('updated_at', '>', $start_time)->whereNull('deleted_at')->pluck('user_id');
$other_users = User::with('profileCourtship')->whereHas('profileCourtship', function ($sql) {
$sql->where('user_id', '>', 1);
})->where('type', 'single')->where('sex', '>', 0)->orderBy('id', 'desc')->select('id', 'name', 'sex', 'type', 'created_at')->get()->toArray();
$single_men = [];
$single_women = [];
foreach ($other_users as $other_user) {
if ($other_user['sex'] == 1) {
$single_men[] = $other_user;
} elseif ($other_user['sex'] == 2) {
$single_women[] = $other_user;
}
}
// foreach ($users as $user) {
// if ($user->sex == 1) {
// foreach ($single_women as $single_woman) {
// $this->matchingRate($user, $single_woman);
// }
// }elseif ($user->sex == 2){
// foreach ($single_men as $single_man) {
// $this->matchingRate($user, $single_man);
// }
// }
// }
return;
}
public function recommendNoticeNum()
{
//不接收的用户
$not_recommend_user_ids = [62617];
try {
$user_list = [];
$user_subscribe_list = [];
User::fullinkUser()->where('type', 'single')->where('hidden_profile', 'NONE')->whereNotIn('id', $not_recommend_user_ids)->whereHas('recommendLinks')->chunk(100, function ($users) use (&$user_list, &$user_subscribe_list) {
//获取未推荐的用户
foreach ($users as $user) {
$link = RecommendLinkingNew::where('id_users_left', $user->id)->where('is_recommend', 1)->orderBy('score', 'desc')->orderBy('id', 'desc')->whereHas('otherUser', function ($sql) use ($user) {
$sql->where('hidden_profile', 'NONE')->where('type', 'single')->photo()
->whereDoesntHave('recommendOtherSingles', function ($query) use ($user) {
$query->where('user_id', $user->id);
});
})->first();
if (empty($link))
continue;
$user_list[] = $user->id;
if ($user->is_subscribe == 1) {
$user_subscribe_list[] = $user->id;
}
}
});
$total_count = count($user_list);
$subscribe_count = count($user_subscribe_list);
$res = json_encode(['total_count' => $total_count, 'subscribe_count' => $subscribe_count]);
Redis::set('recommend_num_' . date("Y-m-d"), $res);
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function recommendSingleNotice()
{
//不接收的用户
$not_recommend_user_ids = [62617, 102978, 113649, 125766];
try {
set_time_limit(0);
$recommend_data = [];
$user_list = [];
User::recommend()->chunk(100, function ($users) use (&$recommend_data, &$user_list, $not_recommend_user_ids) {
//获取未推荐的用户
foreach ($users as $user) {
if (in_array($user->id, $not_recommend_user_ids))
continue;
//已推荐用户
$other_user_ids = RecommendSingleHistory::where('user_id', $user->id)->pluck('other_user_id')->toArray();
//黑名单用户
$black_user_ids = LinkingBlacklist::where('user_id', $user->id)->pluck("other_user_id")->toArray();
$black_other_user_ids = LinkingBlacklist::where('other_user_id', $user->id)->pluck("user_id")->toArray();
$other_user_ids = array_merge($other_user_ids, User::FULLLINKIDS, $black_user_ids, $black_other_user_ids);
$link = RecommendLinkingNew::with('otherUser', 'recommendLogs')->where('id_users_left', $user->id)->whereNotIn('id_users_right', $other_user_ids)->where('is_recommend', 1)->orderBy('score', 'desc')->orderBy('id', 'desc')->whereHas('otherUser', function ($sql) {
$sql->where('hidden_profile', 'NONE')->where('type', 'single')->photo();
})->first();
if (empty($link)) {
continue;
}
$user_list[] = $user->id;
//发送推送模板消息
$result = $this->sendOfficialRecommend($user, $link->otherUser);
if (!$result) {
//发送小程序模板
$result = $this->sendMiniRecommend($user, $link->otherUser);
}
//推送通知
// $result = $this->momentCon->sendAttachMsg($link->otherUser->id, $type='recommend_user', $content='为你推荐匹配度高的用户['.$link->otherUser->nickname.']', $link->otherUser->id, $user->id, $user->app_avatar);
if ($result) {//发送成功记录
$data['user_id'] = $user->id;
$data['other_user_id'] = $link->otherUser->id;
$data['created_at'] = date('Y-m-d H:i:s');
$data['updated_at'] = date('Y-m-d H:i:s');
$recommend_data[] = $data;
}
}
return $recommend_data;
});
$redis = Redis::connection('big_data');
$cronRecommendUserList = $redis->keys('cronRecommendUserList:*');
if (!empty($cronRecommendUserList)) {
$redis->del($cronRecommendUserList);
}
$cronRecommendUserListKey = 'cronRecommendUserList:' . date('Y-m-d H:i:s');
$redis->set($cronRecommendUserListKey, json_encode(['data' => $user_list]));
if (count($recommend_data)) {
RecommendSingleHistory::insert($recommend_data);
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 同步更新关注公众号
* @return [type] [description]
*/
public function syncIsSubscribe()
{
try {
set_time_limit(0);
User::linkData()->chunk(1000, function ($users) {
foreach ($users as $user) {
$result = $user->hasSubscribeOfficial();
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function sendOfficialRecommend($user, $target_user)
{
if ($user->wechat) {
$official_openid = Viewer::where('user_id', $user->id)->value('openid');
if (empty($official_openid)) {
$official_openid = $user->wechat->official_openid;
}
if (empty($official_openid)) {
\Log::info('没有公众号openid');
return false;
}
//是否关注公众号
$result = $user->is_subscribe;
if ($result) {
$param['user_id'] = $target_user->id;
$param['user_name'] = $target_user->nickname;
$param['openid'] = $official_openid;
$param['channel'] = 'recommend';
$param['title'] = "今日推荐的嘉宾更新啦";
$param['host'] = '福恋';
$param['user_info'] = $this->checkUserInfo($user, $target_user);
if (empty($param['user_info']) || empty($param['host']) || empty($param['user_name'])) {
return false;
}
$param['remark'] = "快去和TA打个招呼吧";
$result = \WechatService::agRecommendNotcie($param);
} else {
return false;
}
return true;
}
return false;
}
public function checkUserInfo($user, $target_user)
{
$info = '发现了一位';
//身高
$target_profile = $target_user->profileCourtship;
if ($target_user->sex == 1) {
$info = $info . '小哥哥不错';
if ($target_profile->stature >= ' 175') {
$info = $info . ',身高' . $target_profile->stature;
}
} elseif ($target_user->sex == 2) {
$info = $info . "小姐姐不错";
if ($target_profile->stature >= ' 175') {
$info = $info . ',身高' . $target_profile->stature;
}
} else {
return false;
}
//学历
$degree_arr = ['大专', '本科', '硕士', '博士'];
if (in_array($target_profile->degree, $degree_arr)) {
$info = $info . '' . $target_profile->degree . '学历';
}
//同城
$user_profile = $user->profileCourtship;
if ($user_profile->city == $target_profile->city) {
$info = $info . ',和你同城';
} elseif ($user_profile->resident_city == $target_profile->resident_city) {//老乡
$info = $info . ',和你是老乡';
}
$info = $info . ',说不定是你喜欢的哦~';
return $info;
}
public function sendMiniRecommend($user, $target_user)
{
if (!empty($user->wechat) && !empty($user->wechat->openid)) {
$param['openid'] = $user->wechat->openid;
$param['time'] = date('Y-m-d H:i:s');
$param['message'] = "小恋为你推荐合适的Ta";
$param['user_id'] = $target_user->id;
$param['name'] = $target_user->nickname;
$param['channel'] = 'recommend';
$form_id = $this->formId($param['openid']);
if (!empty($form_id)) {
$form_id->status = 1;
$form_id->save();
$param['form_id'] = $form_id->form_id;
\WechatService::recommendSingleNotice($param);
return true;
}
}
return false;
}
public function newUserMatchingRate()
{
set_time_limit(0);
$user = User::with('profileCourtship')->whereHas('profileCourtship', function ($sql) {
$sql->where('user_id', '>', 1);
})->where('type', 'single')->where('sex', '>', 0)->where('hidden_profile', '<>', 'ALLSEX')->select('id', 'name', 'sex', 'type', 'hidden_profile', 'created_at')->orderBy('id', 'desc')->first();
if (empty($user)) {
return;
}
$single_men = [];
$single_women = [];
$other_users = User::with('profileCourtship')->whereHas('profileCourtship', function ($sql) {
$sql->where('user_id', '>', 1);
})->where('type', 'single')->where('sex', '>', 0)->where('sex', '<>', $user->sex)->select('id', 'name', 'sex', 'type', 'hidden_profile', 'created_at')->orderBy('id', 'desc')->get()->toArray();
//删除已有的
MatchingRate::where(['user_id' => $user->id])->delete();
$new_data = [];
foreach ($other_users as $other_user) {
$data = $this->matchingRate($user, $other_user, $type = 'new');
$new_data[] = $data;
}
$collect = collect($new_data);
$collects = $collect->chunk(10);
foreach ($collects as $collect) {
MatchingRate::insert($collect->toArray());
}
$user->save();
return;
}
/**
* 匹配度
*/
public function matchingRate($user, $other_user, $type = null)
{
$other_user = (object) $other_user;
$user_profile = $user->profileCourtship;
$other_user_profile = (object) $other_user->profile_courtship;
$weight = 0;
if (empty($user)) {
return;
}
if (empty($other_user)) {
return;
}
if (empty($user_profile)) {
return;
}
if (is_object($other_user_profile) && empty($other_user_profile)) {
return;
}
if (is_array($other_user_profile) && count($other_user_profile) == 0) {
return;
}
if ($user->type != 'single' || $other_user->type != 'single') {
return;
}
//如果单身匹配到介绍人删除
if ($user->type == 'single' && $other_user->type == 'marriage') {
DB::table('matching_rates')->where(['user_id' => $user->id, 'other_user_id' => $other_user->id])->delete();
return;
}
//同性排除
if ($user->sex == $other_user->sex) {
return;
}
//是否同信仰
if (!empty($user_profile->belief) && !empty($other_user_profile->belief) && $user_profile->belief == $other_user_profile->belief) {
$belief = 10;
$weight += 10;
} else {
$belief = -100;
$weight += -100;
}
//居住地是否同省
if (!empty($user_profile->province) && !empty($other_user_profile->province) && $user_profile->province == $other_user_profile->province) {
$residence_province = 1;
$weight += 1;
} else {
$residence_province = 0;
}
if ($user_profile->province == $other_user_profile->province && $user_profile->city == $other_user_profile->city) {
$residence_city = 2;
$weight += 2;
} else {
$residence_city = 0;
}
if (!empty($user_profile->resident_province) && !empty($other_user_profile->resident_province) && $user_profile->resident_province == $other_user_profile->resident_province) {
$grow_province = 1;
$weight += 1;
} else {
$grow_province = 0;
}
if ($user_profile->resident_province == $other_user_profile->resident_province && $user_profile->resident_city == $other_user_profile->resident_city) {
$grow_city = 1;
$weight += 1;
} else {
$grow_city = 0;
}
$now_time = date('Y-m-d H:i:s');
$end_time = $other_user->created_at;
$time = $this->getTime($now_time, $end_time);
if ($time['day'] < 3) {
$new_member = 3;
$weight += 3;
} else {
$new_member = 0;
}
$photo_count = DB::table('profile_photos')->where('user_id', $other_user->id)->count();
if ($photo_count) {
$photos = 1;
$weight += 1;
} else {
$photos = 0;
}
// if ($other_user->identification_photos && count(json_decode($other_user->identification_photos, true))) {
// $identification_photos = 2;
// $weight +=2;
// }else{
$identification_photos = 0;
// }
// if ($other_user->graduate_photos && count(json_decode($other_user->graduate_photos, true))) {
// $graduate_photos = 1;
// $weight +=1;
// }else{
$graduate_photos = 0;
// }
// if ($other_user->other_photos && count(json_decode($other_user->other_photos, true))) {
// $other_photos = 1;
// $weight +=1;
// }else{
$other_photos = 0;
// }
$user_birthday = $user_profile->birthday;
$other_user_birthday = $other_user_profile->birthday;
$age = -999.99;
$age_diff = 999;
if (!empty($user_birthday) && !empty($other_user_birthday)) {
$user_age = $this->getAge($user_birthday);
$other_user_age = $this->getAge($other_user_birthday);
$age_diff = $user_age - $other_user_age;
if ($user->sex == 1) {//你是男生
if ($user_age - $other_user_age >= 10 && $user_age - $other_user_age < 20) {//男生大女生十至二十岁之间
$age = -5;
}
if ($user_age - $other_user_age >= 20) {//男生大二十岁
$age = -20;
}
if ($user_age - $other_user_age >= 5 && $user_age - $other_user_age < 10) {//男生大女生五岁至十岁之间
$age = -3;
}
if ($user_age - $other_user_age < 5 && $user_age - $other_user_age >= -3) {//男生大女生0-5 或者 女生大男生 0-3
$age = 3;
}
if ($other_user_age - $user_age > 3 && $other_user_age - $user_age < 10) {//女生大男生 3-10
$age = -10;
}
if ($other_user_age - $user_age >= 10) {//女生大男生 10
$age = -20;
}
}
if ($user->sex == 2) {//你是女生
if ($user_age - $other_user_age >= 10) {//女生大男生 10
$age = -20;
}
if ($user_age - $other_user_age >= 5 && $user_age - $other_user_age < 10) {//女生大男生 5-10
$age = -10;
}
if ($user_age - $other_user_age < 5 && $user_age - $other_user_age > 3) { //女生大男生 3-5
$age = -5;
}
if ($user_age - $other_user_age <= 3 && $user_age - $other_user_age >= -5) { //女生大男生 -3-5
$age = 3;
}
if ($other_user_age - $user_age >= 5 && $other_user_age - $user_age < 10) {//男生大女生 5-10
$age = -3;
}
if ($other_user_age - $user_age >= 10 && $other_user_age - $user_age < 20) {//男生大女生 10-20
$age = -5;
}
if ($other_user_age - $user_age >= 20) {//男生大女生 20
$age = -20;
}
}
if (empty($age)) {
// if ($user_age > $other_user_age) {
// $age = 4 - ($user_age - $other_user_age)/5;
// }else{
// $age = 4 - ($other_user_age - $user_age)/5;
// }
// if ($age >= 1000 || $age <= -1000) {
// $age = -999.99;
// }
$age = -999.99;
}
$weight += $age;
}
if ($type == 'new') {
$data = [
'user_id' => $user->id,
'other_user_id' => $other_user->id,
'new_member' => $new_member,
'age' => $age,
'age_diff' => $age_diff,
'belief' => $belief,
'residence_province' => $residence_province,
'residence_city' => $residence_city,
'grow_province' => $grow_province,
'grow_city' => $grow_city,
'photos' => $photos,
'identification_photos' => $identification_photos,
'graduate_photos' => $graduate_photos,
'other_photos' => $other_photos,
'weight' => $weight,
];
return $data;
}
$rate = MatchingRate::where(['user_id' => $user->id, 'other_user_id' => $other_user->id])->first();
// $rate = DB::table('matching_rates')->where(['user_id'=> $user->id, 'other_user_id'=>$other_user->id])->first();
if (empty($rate)) {
try {
$array = [
'user_id' => $user->id,
'other_user_id' => $other_user->id,
'new_member' => $new_member,
'age' => $age,
'age_diff' => $age_diff,
'belief' => $belief,
'residence_province' => $residence_province,
'residence_city' => $residence_city,
'grow_province' => $grow_province,
'grow_city' => $grow_city,
'photos' => $photos,
'identification_photos' => $identification_photos,
'graduate_photos' => $graduate_photos,
'other_photos' => $other_photos,
'weight' => $weight,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
DB::transaction(function () use ($array) {
$rate = DB::table('matching_rates')->insert($array);
});
} catch (Exception $e) {
$this->sentMessage('15872844805', $e->getMessage());
return;
}
} else {
$rate->new_member = $new_member;
$rate->age = $age;
$rate->age_diff = $age_diff;
$rate->belief = $belief;
$rate->residence_province = $residence_province;
$rate->residence_city = $residence_city;
$rate->grow_province = $grow_province;
$rate->grow_city = $grow_city;
$rate->photos = $photos;
$rate->identification_photos = $identification_photos;
$rate->graduate_photos = $graduate_photos;
$rate->other_photos = $other_photos;
$rate->weight = $weight;
$rate->save();
}
return $age;
}
/**
* 檢查三天新用戶
* @return [type] [description]
*/
public function newDayUser()
{
try {
$users = User::where('type', 'single')->where('is_new', 1)->get();
foreach ($users as $user) {
$now_time = date('Y-m-d H:i:s', time());
$end_time = $user->created_at;
$time = $this->getTime($now_time, $end_time);
if ($time['day'] > 3) {
$user->is_new = 0;
$user->save();
ProfileCourtship::where('user_id', $user->id)->update(['updated_at' => $now_time]);
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 获取年龄
* @param string $birthday 生日
* @return integer 年龄
*/
public function getAge($birthday)
{
$age = strtotime($birthday);
if ($age === false) {
return null;
}
list($y1, $m1, $d1) = explode("-", date("Y-m-d", $age));
$now = strtotime("now");
list($y2, $m2, $d2) = explode("-", date("Y-m-d", $now));
$age = $y2 - $y1;
if ((int) ($m2 . $d2) < (int) ($m1 . $d1))
$age -= 1;
return $age;
}
/**
* 时间差
*/
public function getTime($begin_time, $end_time)
{
$begin_time = strtotime($begin_time);
$end_time = strtotime($end_time);
if ($begin_time < $end_time) {
$starttime = $begin_time;
$endtime = $end_time;
} else {
$starttime = $end_time;
$endtime = $begin_time;
}
$timediff = $endtime - $starttime;
$days = intval($timediff / 86400);
$remain = $timediff % 86400;
$hours = intval($remain / 3600);
$remain = $remain % 3600;
$mins = intval($remain / 60);
$secs = $remain % 60;
$res = array("day" => $days, "hour" => $hours, "min" => $mins, "sec" => $secs);
return $res;
}
/**
* 留言通知
*/
public function chatMessageNotice()
{
//未读信息接收人
$other_user_ids = ChatMessage::where('status', 0)->distinct('other_user_id')->pluck('other_user_id');
foreach ($other_user_ids as $other_user_id) {
//未读信息发送人
$user_ids = ChatMessage::where('status', 0)->where('other_user_id', $other_user_id)->distinct('user_id')->pluck("user_id");
//未读接收人openid
$param['openid'] = Wechat::where('user_id', $other_user_id)->value('openid');
if (!count($user_ids)) {
continue;
}
if (count($user_ids) == 1) {
$messages = ChatMessage::where('status', 0)->where('other_user_id', $other_user_id)->where('user_id', $user_ids[0])->get()->toArray();
if (!count($messages)) {
continue;
}
if (count($messages) == 1) {
$message = $messages[0]['content'];
} else {
$message = '1位好友的' . count($messages) . '条新留言,待您点击详情回复!';
}
$name = User::where('id', $user_ids[0])->value('name');
$param['name'] = $name;
$param['created_at'] = $messages[0]['created_at'];
$param['message'] = $message;
} else {
$message_count = ChatMessage::where('status', 0)->where('other_user_id', $other_user_id)->whereIn('user_id', $user_ids)->count();
$param['message'] = count($user_ids) . '位好友的' . $message_count . '条新留言,待您进入小程序回复!';
$name = User::where('id', $user_ids[0])->value('name');
$param['name'] = $name . '等' . count($user_ids) . '位好友';
$param['created_at'] = ChatMessage::whereIn('user_id', $user_ids)->where('other_user_id', $other_user_id)->where('status', 0)->value('created_at')->toDateTimeString();
}
$form_id = $this->formId($param['openid']);
if (!empty($form_id)) {
$form_id->status = 1;
$form_id->save();
$param['form_id'] = $form_id->form_id;
\WechatService::chatMessageNotice($param);
}
continue;
}
return;
}
/**
* 获取对应的formid
*/
public function formId($openid)
{
$now_time = time();
$end_time = $now_time - 7 * 24 * 60 * 60;
$time = date('Y-m-d H:i:s', $end_time);
$form_id = FormId::where('openid', $openid)->where('status', 0)->where('form_id', '<>', 'the formId is a mock one')->where('created_at', '>', $time)->orderBy('id', 'asc')->first();
return $form_id;
}
/**
* 添加圆图
*/
public function addUserCircleAvatar()
{
try {
$users = User::whereNull('circle_avatar')->where(function ($sql) {
$sql->whereNotNull('app_avatar')->orWhereNotNull('photo')->orWhereHas('wechat', function ($query) {
$query->where(function ($sql1) {
$sql1->whereNotNull('avatar')->where('avatar', '<>', '');
})->orWhere(function ($sql2) {
$sql2->whereNotNull('avatar2')->where('avatar2', '<>', '');
});
});
})->orderBy('id', 'desc')->limit(50)->get();
foreach ($users as $user) {
$pic = '';
if ($user->photo) {
$pic = $this->circleImage($user->photo, $user->id, 'ufutx');
} elseif ($user->app_avatar) {
$pic = $this->circleImage($user->app_avatar, $user->id, 'ufutx');
} elseif ($user->wechat && $user->wechat->avatar2) {
$pic = $this->circleImage($user->wechat->avatar2, $user->id, 'ufutx');
// $audit_wechat_avatar = true;
} elseif ($user->wechat && $user->wechat->avatar) {
$pic = $this->circleImage($user->wechat->avatar, $user->id, 'wechat');
// $audit_wechat_avatar = true;
}
if (!empty($pic)) {
// User::where('id', $user->id)->update(['circle_avatar'=>$pic]);
$data = ['circle_avatar' => $pic];
//微信登录获取的头像做个审核
// if (isset($audit_wechat_avatar)) {
// $data['photo'] = $pic;
// $data['is_photo_audited'] = 0;
// }
User::where('id', $user->id)->update($data);
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 圆图
* @param string $imgpath 图片路径
* @param int $user_id 用户id
* @return string 生成图片路径
*/
public function circleImage($imgpath = null, $user_id = null, $type = 'wechat')
{
$filesize = @getimagesize($imgpath);
if ($type == 'wechat' && !strstr($imgpath, 'images.ufutx.com')) {
$new_imgpath = $this->changeWechatAvatar($imgpath, 132);
} else {
$new_imgpath = $imgpath;
}
$new_filesize = @getimagesize($new_imgpath);
switch ($new_filesize['mime']) {
case 'image/jpg':
$src_img = imagecreatefromjpeg($new_imgpath);
break;
case 'image/jpeg':
$src_img = imagecreatefromjpeg($new_imgpath);
break;
case 'image/png':
$src_img = imagecreatefrompng($new_imgpath);
break;
case 'image/gif':
$src_img = imagecreatefromgif($new_imgpath);
break;
}
if (empty($src_img)) {
return;
}
$wh = @getimagesize($new_imgpath);
$w = $wh[0];
$h = $wh[1];
$w = min($w, $h);
$h = $w;
$img = imagecreatetruecolor($w, $h);
//这一句一定要有
imagesavealpha($img, true);
//拾取一个完全透明的颜色,最后一个参数127为全透明
$bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagefill($img, 0, 0, $bg);
$r = $w / 2; //圆半径
$y_x = $r; //圆心X坐标
$y_y = $r; //圆心Y坐标
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {
$rgbColor = imagecolorat($src_img, $x, $y);
if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
}
}
$filename = date('Y-m-d-H-i-s') . '-' . uniqid() . '.png';
$file_path = storage_path('circleImg/' . $filename);
imagepng($img, $file_path);
$pic = '';
if (file_exists($file_path)) {
$pic = $this->uploadFile($file_path);
try {
unlink($file_path);
} catch (Exception $e) {
$this->getError($e);
}
}
return $pic;
}
public function changeWechatAvatar($imgpath = null, $size = 0)
{
$imageArr = explode('/', $imgpath);
$imageArr[count($imageArr) - 1] = $size;
$imgpath = implode('/', $imageArr);
return $imgpath;
}
//文件地址上传
public function uploadFile($file)
{
$ossClient = UploadController::getOssClient();
//生成file
$object = date('Y') . date('m') . "/" . date('d') . "/" . basename($file);
$url = 'https://' . config('alioss.picture_domain') . '/' . $object;
try {
// $result = $ossClient->putObject(config('alioss.buckets.picture'), $object, $file);
$result = $ossClient->uploadFile(config('alioss.buckets.picture'), $object, $file);
} catch (\OSS\Core\OssException $e) {
// return $this->failure('oss_put_failure', $e->getMessage());
}
return $url;
}
/**
* 检测临时会员24小时
* @return [type] [description]
*/
public function checkTempMember()
{
try {
$temp_members = TempMember::where('status', 0)->get();
foreach ($temp_members as $temp_member) {
$time = time();
$temp_time = $temp_member->created_at->toDateTimeString();
$temp_time = strtotime($temp_time);
//相差五分钟
$diff_time = $time - $temp_time;
$param['openid'] = Wechat::where('user_id', $temp_member->user_id)->value('openid');
$user = User::where('id', $temp_member->user_id)->first();
if (empty($user)) {
TempMember::where('id', $temp_member->id)->update(['status' => 1]);
continue;
}
// dd($diff_time);
if ($time - 24 * 3600 >= $temp_time) {//一天后
TempMember::where('id', $temp_member->id)->update(['status' => 1]);
User::where('id', $temp_member->user_id)->update(['temp_member' => 0, 'hidden' => 0]);
//到期提醒
$param['rank_name'] = '临时会员';
$param['time'] = date('Y-m-d H:i:s', $time);
$param['message'] = '您的24小时临时会员体验已经到期如果需要继续享用会员服务请您进入小程序购买会员感谢您的体验!';
$form_id = $this->formId($param['openid']);
if (!empty($form_id)) {
$form_id->status = 1;
$form_id->save();
$param['form_id'] = $form_id->form_id;
\WechatService::VIPEndNotice($param);
}
} elseif ($diff_time >= 5 * 60 && $diff_time < 6 * 60) {//注册后五分钟
if ($user->is_approved) {
continue;
}
$param['rank_name'] = '尊享VIP';
$param['name'] = $user->name;
$param['end_time'] = date("Y-m-d H:i:s", $temp_time + 24 * 3600);
$form_id = $this->formId($param['openid']);
if (!empty($form_id)) {
$form_id->status = 1;
$form_id->save();
$param['form_id'] = $form_id->form_id;
\WechatService::VIPStartNotice($param);
} else {
//短信通知
$message = '祝贺您成功注册了福恋小程序已赠送一天尊享VIP体验';
$this->sms->sentMessage($user->mobile, $message);
}
} elseif ($diff_time >= 23 * 3600 && $diff_time < 23 * 3600 + 60) {//注册小時
if ($user->is_approved) {
continue;
}
$param['rank_name'] = '尊享VIP';
$param['message'] = '您的尊享VIP体验即将到期请尽快体验';
$param['time'] = date("Y-m-d H:i:s", $temp_time + 24 * 3600);
$form_id = $this->formId($param['openid']);
if (!empty($form_id)) {
$form_id->status = 1;
$form_id->save();
$param['form_id'] = $form_id->form_id;
\WechatService::VIPEndNotice($param);
} else {
//短信通知
$message = '您的尊享VIP体验将于' . date("Y-m-d H:i:s", $temp_time + 24 * 3600) . '到期,请尽快体验!';
$this->sms->sentMessage($user->mobile, $message);
}
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 老用户发消息
* @return [type] [description]
*/
public function tempMemberNotice()
{
$content = "您有一个礼包待领取";
$user_ids = User::where('rank_id', 0)->where('temp_member', 0)->where('type', 'single')->pluck('id');
foreach ($user_ids as $user_id) {
$count = TempMember::where('user_id', $user_id)->count();
if ($count) {
continue;
}
$notice_count = Notice::where('user_id', $user_id)->where('content', $content)->count();
if ($notice_count) {
continue;
}
Notice::create([
'user_id' => $user_id,
'send_user_id' => 1,
'type' => 'temp',
'content' => $content,
]);
$mobile = User::where('id', $user_id)->value('mobile');
$message = '福恋为您提供了24小时免费会员体验进入小程序查看详情';
$this->sentMessage($mobile, $message);
}
return;
}
public function myQrcode()
{
try {
User::whereNull("my_qrcode")->whereHas('wechat', function ($sql) {
$sql->whereNotNull('openid');
})->chunk(100, function ($users) {
$app = EasyWechat::miniProgram();
$optional = [
'page' => 'pages/tabBar/welcome',
'width' => 260,
'is_hyaline' => true,
'auto_color' => true,
];
foreach ($users as $user) {
$response = $app->app_code->getUnlimit('from_user_id=' . $user->id, $optional);
$qrcode_path = storage_path('qrcode');
$file_name = time() . 'home_qrcode.png';
// 保存小程序码到文件
if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
$filename = $response->saveAs($qrcode_path, $file_name);
}
$qrcode_path = storage_path() . "/qrcode/" . $file_name;
if (file_exists($qrcode_path)) {
$qrcode = $this->uploadFile($qrcode_path);
unlink($qrcode_path);
User::where('id', $user->id)->update(['my_qrcode' => $qrcode]);
}
break;
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function userShareQrcode()
{
$single_path = "pages/home/information";
$marriage_path = "pages/home/informationV2";
User::whereDoesntHave("userDetailQrcode")->chunk(100, function ($users) use ($single_path, $marriage_path) {
foreach ($users as $user) {
$path = $user->type == "single" ? $single_path : $marriage_path;
$scene = "id={$user->id}&from_user_id={$user->id}";
$qrcode = QrcodeRectService::getUnlimitQrcode($path, $scene);
$param = ['path' => $path, 'scene' => $scene];
$user->userDetailQrcode()->create(['qrcode_path' => $qrcode, 'type' => 4, 'param' => json_encode($param)]);
}
});
}
public function myShare()
{
$time = time();
$users = User::whereNull('my_share')->whereHas('wechat', function ($sql) {
$sql->whereNotNull('avatar2');
})->with('wechat')->get();
foreach ($users as $user) {
// $wechat = Wechat::where('user_id', $user->id)->first();
// if (empty($user->wechat)) {
// continue;
// }
$avatar = $user->circle_avatar ?: $user->wechat->avatar2;
$name = $user->name;
$openid = $user->wechat->openid;
if (empty($user->my_qrcode)) {
$app = EasyWechat::miniProgram();
$data = [];
$data['is_hyaline'] = true;
$response = $app->app_code->get('/pages/tabBar/welcome?from_openid=' . $openid, $data);
$path = $time . 'home_qrcode.png';
// $filename = $response->saveAs(storage_path('qrcode'), $path);
if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
try {
$filename = $response->saveAs(storage_path('qrcode'), $path);
} catch (Exception $e) {
continue;
}
}
$qrcode_path = storage_path() . "/qrcode/" . $time . "home_qrcode.png";
if (file_exists($qrcode_path)) {
$qrcode = $this->uploadFile($qrcode_path);
try {
unlink($qrcode_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
exit();
}
$user->my_qrcode = $qrcode;
}
$image2 = $user->my_qrcode;
} else {
$image2 = $user->my_qrcode;
}
//http://images.ufutx.com/201808/17/dd7540992e1e124a0947aa2422bf711c.jpeg
// $image1 = "http://images.ufutx.com/201808/17/dd7540992e1e124a0947aa2422bf711c.jpeg";
$image1 = "https://images.ufutx.com/201909/02/56f3f8255dc326ebd4b4a7f39b0ae76f.jpeg";
$new_image = $this->imageAddImage($image1, $image2, 297, 297, 218, 156, 'bottom-left');
if ($avatar) {
$new_image = $this->imageAddImage($new_image, $avatar, 163, 163, 300, 60, 'top-left');
}
$new_image = $this->textAddImage($new_image, 'Hi,我是' . $name, 30, 375, 243, '#001100', 'center');
if ($user->type == 'single') {
$slogan = '我在福恋,找对象!';
} else {
$slogan = '我在福恋为你找对象!';
}
$new_image = $this->textAddImage($new_image, $slogan, 42, 375, 309, '#d92553', 'center');
$file_path = storage_path("/qrcode/" . $time . "invite_qrcode.png");
$new_image->save($file_path);
$qrcode = '';
if (file_exists($file_path)) {
$pic = $this->uploadFile($file_path);
try {
unlink($file_path);
} catch (Exception $e) {
// return $this->failure($e->getMessage());
// exit();
}
}
$user->my_share = $pic;
$user->save();
}
return;
}
public function myShareQrcodeRect()
{
\DB::beginTransaction();
try {
$users = User::whereNotNull('circle_avatar')->where('circle_avatar', '<>', '')->where(function ($sql) {
$sql->where('my_share_rect', '')->orWhereNull('my_share_rect');
})->limit(100)->get();
foreach ($users as $user) {
//二维码
$my_qrcode_rect = \App\Facades\QrcodeRectService::getQrCodeRect($user);
//画图
$my_share_rect = \App\Facades\QrcodeRectService::makeMyShareRect($user, $my_qrcode_rect);
//更新
User::where('id', $user->id)->update(['my_qrcode_rect' => $my_qrcode_rect, 'my_share_rect' => $my_share_rect]);
}
\DB::commit();
} catch (\Exception $e) {
\DB::rollBack();
$this->getError($e);
// $this->sms->sentMessage('15872844805', 'cron生成分享图片报错');
}
}
/**
* 图片添加图片
* @param string $image1 第一张图片
* @param string $image2 第二张图片
* @param int $image2_w 图片宽度
* @param int $image2_h 图片高度
* @param integer $offset_x 文字X轴偏移
* @param integer $offset_y 文字Y轴偏移
* @param string $offset
* @return image 新图片
*/
public function imageAddImage($image1, $image2, $image2_w, $image2_h, $offset_x = 0, $offset_y = 0, $offset = 'top-left')
{
Image::configure(['driver' => 'gd']);
$image = Image::make($image1);
$image_v2 = Image::make($image2)->resize($image2_w, $image2_h);
$image_width = $image->width();
$image_height = $image->height();
$image_copy = $image->insert($image_v2, $offset, $offset_x, $offset_y);
return $image_copy;
}
/**
* 图片添加文字
* @param string $image 图片
* @param string $text 文字
* @param int $text_size 文字尺寸
* @param int $offset_x 文字X轴偏移
* @param int $offset_y 文字Y轴偏移
* @param string $color 文字颜色
* @param string $align 文字位置
* @param string $valign
* @return image 新图片
*/
public function textAddImage($image, $text, $text_size, $offset_x, $offset_y, $color = '#000000', $align = 'center', $valign = 'top')
{
Image::configure(['driver' => 'gd']);
$image = Image::make($image);
$image->text($text, $offset_x, $offset_y, function ($font) use ($text_size, $color, $align, $valign) {
$font->file(storage_path() . '/font/a.ttc');
$font->size($text_size);
$font->color($color);
$font->align($align);
$font->valign($valign);
});
return $image;
}
/**
* 微信头像上传到服务器
* @return [type] [description]
*/
public function wechatAvatarUpdate()
{
try {
$wechats = Wechat::whereNotNull('avatar')->where(function ($sql) {
$sql->whereNull('avatar2')->orWhere('avatar2', '');
})->where('avatar', '<>', 'null')->where('avatar', '<>', '')->limit(10)->orderBy('id', 'desc')->get();
foreach ($wechats as $wechat) {
//上传头像
if (!empty($wechat->avatar)) {
if (!strstr($wechat->avatar, 'images.ufutx.com') && !strstr($wechat->avatar, 'local-pictures.oss-cn-shenzhen.aliyuncs.com')) {
$avatar = $this->changeWechatAvatar($wechat->avatar, 0);
} else {
$avatar = $wechat->avatar;
}
if (empty($avatar)) {
continue;
}
//尺寸是否不符;
$size_fail = false;
$img = Image::make($avatar);
$width = $img->width();
$height = $img->height();
if ($width < 250 || $height < 250) {
$img = $img->resize(250, 250);
} else {
$size_fail = true;
}
$file_path = storage_path("qrcode/" . time() . "wechat_avatar.png");
$result = $img->save($file_path);
$pic = $this->uploadFile($file_path);
try {
if (file_exists($file_path)) {
unlink($file_path);
} else {
\Log::info($file_path . '文件不存在');
}
} catch (Exception $e) {
$this->getError($e);
return false;
}
Wechat::where('id', $wechat->id)->where('avatar', $wechat->avatar)->update(['avatar2' => $pic]);
//检查头像是否合格
// if($wechat->user_id > 0){
// $result = $this->userService->faceDelectBaiDu($pic);
// if (!empty($result->result) && empty($result->error_code) && empty($size_fail)) {
// User::where('id', $wechat->user_id)->update(['photo'=>$pic, 'is_photo_audited'=>1]);
// }
// }
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 檢查會員期限
* @return [type] [description]
*/
public function checkRankDeadline()
{
try {
//过期的&没有到期时间
User::where("rank_id", ">", 0)->chunk(100, function ($users) {
foreach ($users as $user) {
$h = RankHistory::where('user_id', $user->id)->whereNotNull('deadline')->where('deadline', '>', date('Y-m-d H:i:s'))->orderBy('deadline', 'asc')->first();
if ($h) {
User::where('id', $user->id)->update(['rank_id' => $h->rank_id]);
} else {
User::where('id', $user->id)->update(['rank_id' => 0]);
}
RankHistory::where('deadline', '<=', date('Y-m-d H:i:s'))->delete();
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 检查邀请人是否注册
* @return [type] [description]
*/
public function checkInviteHistory()
{
$invite_openids = InviteHistory::/*where('is_approved', 1)->*/ where('status', 0)->distinct('invite_openid')->pluck('invite_openid');
foreach ($invite_openids as $invite_openid) {
//邀请认证人数
$count = InviteHistory::where('invite_openid', $invite_openid)/*->where('is_approved', 1)*/ ->where('status', 0)->count();
if ($count >= 2) {
//邀请人的user_id
$wechat = Wechat::where('openid', $invite_openid)->first();
if (empty($wechat) || empty($wechat->user_id)) {//数据错误
// InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->update(['status'=>1]);
continue;
}
$user_id = $wechat->user_id;
$user = User::find($user_id);
if (empty($user)) {
continue;
}
if ($user->type == 'marriage') {//介绍人
continue;
}
if ($user->mobile == "13710178377" || $user->mobile == '18898888797' || $user->mobile == "13178822477") {
continue;
}
//最近一次的会员记录
$rank_history = RankHistory::withTrashed()->where('user_id', $user_id)->where('rank_id', $user->rank_id)->whereNotNull('deadline')->first();
if (empty($rank_history)) {//普通市级会员
RankHistory::create([
'user_id' => $user_id,
'rank_id' => 1,
'deadline' => date('Y-m-d H:i:s', strtotime('+1 month')),
]);
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(2)->orderBy('id', 'asc')->update(['status' => 1]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 1]);
//TODO 通知
$message = "由于您成功邀请两位注册会员,您的市级会员权限已成功开通一个月";
$this->sentMessage($user->mobile, $message);
continue;
} else {
if ($rank_history->rank_id == 1) {//市级会员
if (empty($rank_history->deleted_at)) {//未过期
//更新期限
$rank_history->deadline = date('Y-m-d H:i:s', strtotime('+1 month', strtotime($rank_history->deadline)));
$rank_history->save();
//TODO 通知
$message = "由于您成功邀请两位注册成员,您的市级会员权限已成功续航一个月";
$this->sentMessage($user->mobile, $message);
} else {//已过期
//创建新的会员期限
RankHistory::create([
'user_id' => $user_id,
'rank_id' => 1,
'deadline' => date('Y-m-d H:i:s', strtotime('+1 month')),
]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 1]);
//TODO 通知
$message = "由于您成功邀请两位注册成员,您的市级会员权限已成功开通一个月";
$this->sentMessage($user->mobile, $message);
}
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(2)->orderBy('id', 'asc')->update(['status' => 1]);
continue;
} elseif ($rank_history->rank_id == 2) {
if (empty($rank_history->deleted_at)) {//未过期
if ($count >= 3) {
$rank_history->deadline = date('Y-m-d H:i:s', strtotime('+1 month', strtotime($rank_history->deadline)));
$rank_history->save();
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(3)->orderBy('id', 'asc')->update(['status' => 1]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 2]);
//TODO 通知
$message = "由于您成功邀请三位注册成员,您的黄金会员成功续航一个月";
$this->sentMessage($user->mobile, $message);
continue;
}
} else {//已过期
$time = time();
$end_time = strtotime($rank_history->deadline) + (7 * 24 * 3600);
if ($time >= $end_time) {//七天以後
if ($count >= 2) {
RankHistory::create([
'user_id' => $user_id,
'rank_id' => 1,
'deadline' => date('Y-m-d H:i:s', strtotime('+1 month')),
]);
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(2)->orderBy('id', 'asc')->update(['status' => 1]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 1]);
//TODO 通知
$message = "由于您成功邀请两位注册成员,您的市级会员权限已成功开通一个月";
$this->sentMessage($user->mobile, $message);
continue;
}
} else {//七天以内
if ($count >= 3) {
$rank_history->deadline = date('Y-m-d H:i:s', strtotime('+1 month', strtotime($rank_history->deadline)));
$rank_history->deleted_at = null;
$rank_history->save();
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(3)->orderBy('id', 'asc')->update(['status' => 1]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 2]);
//TODO 通知
$message = "由于您在会员到期后七天内成功邀请三位注册会员,您的黄金会员成功续航一个月";
$this->sentMessage($user->mobile, $message);
continue;
}
}
}
} elseif ($rank_history->rank_id == 3) {
if (empty($rank_history->deleted_at)) {//未过期
if ($count >= 5) {
$rank_history->deadline = date('Y-m-d H:i:s', strtotime('+1 month', strtotime($rank_history->deadline)));
$rank_history->save();
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(5)->orderBy('id', 'asc')->update(['status' => 1]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 3]);
//TODO 通知
$message = "由于您成功邀请五位注册会员,您的钻石会员成功续航一个月";
$this->sentMessage($user->mobile, $message);
continue;
}
} else {//已过期
$time = time();
$end_time = strtotime($rank_history->deadline) + (7 * 24 * 3600);
if ($time >= $end_time) {//七天以後
if ($count >= 2) {
RankHistory::create([
'user_id' => $user_id,
'rank_id' => 1,
'deadline' => date('Y-m-d H:i:s', strtotime('+1 month')),
]);
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(2)->orderBy('id', 'asc')->update(['status' => 1]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 1]);
//TODO 通知
$message = "由于您成功邀请两位注册会员,您的市级会员权限已成功开通一个月";
$this->sentMessage($user->mobile, $message);
continue;
}
} else {//七天以内
if ($count >= 5) {
$rank_history->deadline = date('Y-m-d H:i:s', strtotime('+1 month', strtotime($rank_history->deadline)));
$rank_history->deleted_at = null;
$rank_history->save();
//标记邀请用户
InviteHistory::where('invite_openid', $invite_openid)->where('status', 0)->limit(5)->orderBy('id', 'asc')->update(['status' => 1]);
//更新等級
User::where('id', $user_id)->update(['rank_id' => 3]);
//TODO 通知
$message = "由于您在会员到期后七天内成功邀请五位注册会员,您的钻石会员成功续航一个月";
$this->sentMessage($user->mobile, $message);
continue;
}
}
}
}
}
}
}
return;
}
/**
* 检查活动二维码
* @return [type] [description]
*/
public function checkActivityQrcode()
{
try {
$activities = Activity::whereNull('qrcode')->get();
foreach ($activities as $activity) {
$app = EasyWechat::miniProgram();
$data = [];
$data['is_hyaline'] = true;
$response = $app->app_code->get('/pages/party/detail?party_id=' . $activity->id, $data);
$time = time();
$path = $time . 'activity_qrocde.png';
$filename = $response->saveAs(storage_path('qrcode'), $path);
$qrcode_path = storage_path("/qrcode/" . $time . "activity_qrocde.png");
if (file_exists($qrcode_path)) {
$qrcode = $this->uploadFile($qrcode_path);
$activity->qrcode = $qrcode;
$activity->save();
try {
unlink($qrcode_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 签到二维码
*/
public function checkActivitySignInQrcode()
{
try {
$activities = Activity::whereNull('sign_in_qrcode')->where('can_repeat_sign', 0)->get();//只能单次报名且二维码为null 自动生成码
foreach ($activities as $activity) { //可多次报名 后台手动生成码
$app = \WechatService::app();
$data = [];
$data['is_hyaline'] = true;
$response = $app->app_code->get('pages/party/signSuccess?party_id=' . $activity->id, $data);
$time = time() . 'rand' . mt_rand(1000, 9999);
$path = $time . 'sign_in_qrcode.png';
$filename = $response->saveAs(storage_path('qrcode'), $path);
$qrcode_path = storage_path("qrcode/" . $time . "sign_in_qrcode.png");
if (file_exists($qrcode_path)) {
$qrcode = $this->uploadFile($qrcode_path);
$activity->sign_in_qrcode = $qrcode;
$activity->save();
try {
unlink($qrcode_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 投票二维码
*/
public function checkActivityVoteQrcode()
{
try {
$activities = Activity::whereNull('vote_qrcode')->get();
foreach ($activities as $activity) {
$app = \WechatService::app();
$data = [];
$data['is_hyaline'] = true;
$response = $app->app_code->get('pages/party/luckMember?party_id=' . $activity->id, $data);
$time = time() . 'rand' . mt_rand(1000, 9999);
$path = $time . 'vote_qrcode.png';
$filename = $response->saveAs(storage_path('qrcode'), $path);
$qrcode_path = storage_path("qrcode/" . $time . "vote_qrcode.png");
if (file_exists($qrcode_path)) {
$qrcode = $this->uploadFile($qrcode_path);
$activity->vote_qrcode = $qrcode;
$activity->save();
try {
unlink($qrcode_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 心仪投票二维码
*/
public function checkActivitySexVoteQrcode()
{
try {
$activities = Activity::whereNull('vote_set_qrcode')->get();
foreach ($activities as $activity) {
$app = \WechatService::app();
$data = [];
$data['is_hyaline'] = true;
$response = $app->app_code->get('pages/party/votePage?party_id=' . $activity->id, $data);
$time = time() . 'rand' . mt_rand(1000, 9999);
$path = $time . 'sex_vote_qrcode.png';
$filename = $response->saveAs(storage_path('qrcode'), $path);
$qrcode_path = storage_path("qrcode/" . $time . "sex_vote_qrcode.png");
if (file_exists($qrcode_path)) {
$qrcode = $this->uploadFile($qrcode_path);
$activity->vote_set_qrcode = $qrcode;
$activity->save();
try {
unlink($qrcode_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 检车活动过期
* @return [type] [description]
*/
public function checkActivityDeadline()
{
try {
$time = date('Y-m-d H:i:s');
$activities = Activity::where('is_deadline', 0)->where('end_time', '<=', $time)->get();
foreach ($activities as $activity) {
Activity::where('id', $activity->id)->update(['is_deadline' => 1, 'is_hidden' => 2]);//截止报名并归为已下架
//取消置顶
$this->activityService->cancelActivityTop($activity->id);
}
$activities = Activity::where('is_deadline', 1)->where('end_time', '>', $time)->get();
foreach ($activities as $activity) {
Activity::where('id', $activity->id)->update(['is_deadline' => 0, 'is_cancel' => 0, 'is_hidden' => 0]);
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 给用户黄金会员
* @return [type] [description]
*/
public function giveUserRank()
{
// $temp_user_ids = DB::table('temp_rank_histories')->where('rank_id', 2)->where('type', 'new_year')->pluck('user_id');
// $users = User::where('rank_id', '<=', 2)->where('is_approved', 1)->where('type', 'single')->whereNotIn('id', $temp_user_ids)->where('created_at', '<', '2019-1-1')->get();
// foreach ($users as $user) {
// if ($user->rank_id > 2) {
// continue;
// }
// $wechat = Wechat::where('user_id', $user->id)->first();
// if (empty($wechat)) {
// continue;
// }
// $user->rank_id = 2;
// $user->save();
// $h = RankHistory::where('user_id', $user->id)->where('rank_id', 2)->whereNotNull('deadline')->first();
// $temp_rank_history = DB::table('temp_rank_histories')->where('user_id', $user->id)->where('rank_id', 2)->where('type', 'new_year')->first();
// if (!empty($temp_rank_history)) {
// continue;
// }else{
// DB::table('temp_rank_histories')->insert([
// 'user_id'=>$user->id,
// 'rank_id'=>2,
// 'type'=>'new_year',
// ]);
// if (empty($h)) {
// $h = RankHistory::create([
// 'user_id'=>$user->id,
// 'rank_id'=>2,
// 'deadline'=>date('y-m-d H:i:s', strtotime('+1 month')),
// ]);
// }else{
// $h->deadline = date('Y-m-d H:i:s', strtotime('+1 month', strtotime($h->deadline)));
// $h->save();
// }
// $message = $user->name.'用户你好, 福恋免费赠送30天黄金VIP使用权限有效期至'.$h->deadline.', 感谢你对福恋平台实名认证的支持!';
// $this->sms->sentMessage($user->mobile, $message);
// }
// }
return;
}
public function fellowingCardShare()
{
try {
$cards = Card::whereNull('qrcode')->get();
foreach ($cards as $card) {
$user = User::findOrFail($card->user_id);
$app = EasyWechat::miniProgram();
$optional = [
'page' => 'pages/users/groupMember',
'width' => 260,
'is_hyaline' => true,
'auto_color' => true,
];
$response = $app->app_code->getUnlimit('id=' . $card->id . '&from_user_id=' . $user->id, $optional);
$qrcode_path = storage_path('qrcode');
$file_name = time() . $card->id . 'fellow_card_qrcode.png';
// 保存小程序码到文件
if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
$response->saveAs($qrcode_path, $file_name);
}
$qrcode_path = storage_path() . "/qrcode/" . $file_name;
if (file_exists($qrcode_path)) {
$qrcode = $this->uploadFile($qrcode_path);
$card->qrcode = $qrcode;
$card->save();
unlink($qrcode_path);
} else {
Log::info($qrcode_path . '文件不存在');
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 审核成员
* 头像和信息
* @return [type] [description]
*/
public function audit()
{
$users = User::where('is_audited', 0)->where(function ($sql) {
$sql->whereNull('photo')->orWhere('photo', '');
})->whereBetween('id', [5262, 6262])->orderBy('id', 'desc')->get();
foreach ($users as $user) {
//是否完成资料
$avatar = Wechat::where('user_id', $user->id)->value('avatar2');
if (empty($avatar)) {
continue;
}
// $result = $this->userService->faceDelectBaiDu($avatar);
// if (empty($result->result)) {
// continue;
// }
$user->photo = $avatar;
$user->save();
}
return;
}
//预约通知
public function reservations()
{
//获取预约的用户
$result = UserReservation::select('id', 'user_id', 'type_id')->where('status', 0)->where('type', 'reservations')->get();
foreach ($result as $key => $value) {
$live = live::where('id', $value->type_id)->first();
if (!$live)
break;
//活动前三十分钟
$time = Date('Y-m-d H:i:s', time() + 1800);
if ($live->start_time < $time && $live->end_time > now()) {
//获取用户手机号
$mobile = user::where('id', $value->user_id)->value('mobile');
$message = '您预约的《' . $live->title . '》即将开播~赶紧过来围观吧~';
Messenger::sendSMS($mobile, $message);
UserReservation::where('id', $value->id)->update(['status' => 1]);
}
}
}
public function noticeActivityUsers()
{
try {
$weeks = ['星期天', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
$activities = Activity::with('activityMember')->where('is_deadline', 0)->where('is_cancel', 0)->orderBy('start_time', 'asc')->get();
foreach ($activities as $activity) {
$now_time = date('Y-m-d');
$start_time = date('Y-m-d', strtotime($activity->start_time));
if ($now_time == $start_time) {
foreach ($activity->activityMember as $member) {
$m = Message::create([
'phone' => $member->mobile,
'message' => '',
'confirmed' => 1,
'code' => '活动',
'ip' => request() ? request()->ip() : '127.0.0.1',
]);
$message_url = \CommonUtilsService::clickUrl(env('APP_URL') . '/mobile/#/activityDetail/' . $activity->id, $m->id);
$url = \CommonUtilsService::shortUrl($message_url);
$message = '您报名的“' . $activity->theme . '”活动已获主办方确认,请于' . $activity->start_time . ' (' . $weeks[date('w', strtotime($activity->start_time))] . ')准时签到入场,详情请访问:' . $url['url'] . '。【福恋】';
$m->message = $message;
$m->save();
Messenger::sendSMS($member->mobile, $message);
// $url = env('APP_URL').'/mobile/#/activityDetail/'.$activity->id;
// $url = \CommonUtilsService::shortUrl($url);
// $message = '您报名的“'.$activity->theme.'”活动已获主办方确认,请于'.$activity->start_time.' ('.$weeks[date('w',strtotime($activity->start_time))].')准时签到入场,详情请访问:'.$url['url'].'。【福恋】';
// $this->sentMessage($member->mobile, $message);
}
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 平台提现回调
* @return [type] [description]
*/
public function checkPaasWithdraw()
{
try {
//三十天内的
$start_time = date('Y-m-d H:i:s', strtotime('-30 day'));
$withdraws = PaasWithdraw::where('is_hooked', 0)->where('created_at', '>', $start_time)->get();
foreach ($withdraws as $withdraw) {
$result = \WechatService::officialTransferred($withdraw->trade_no);
if ($result) {
$withdraw->is_hooked = 1;
$withdraw->save();
}
}
return false;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 修改介绍人地址
* @return [type] [description]
*/
public function updateMarrageAddress()
{
$marriages = User::where('type', 'marriage')->with('profileMarriage')
->whereHas('profileMarriage', function ($sql) {
$sql->whereNull('province');
})->chunk(10, function ($users) {
foreach ($users as $user) {
$user->getAddress();
}
});
return 'ok';
}
public function addedBonuses()
{
try {
$this_monday = strtotime('-1 monday', time());
//上周一
$last_monday = $this_monday - 7 * 24 * 3600;
$start_time = date('Y-m-d', $last_monday);
$end_time = date('Y-m-d', $this_monday);
$user_ids = AddedBonus::where('created_at', '>', $start_time)->where('created_at', '<', $end_time)->distinct('user_id')->pluck('user_id');
$data = [];
foreach ($user_ids as $user_id) {
$bonus_obj = Bonus::where('user_id', $user_id)->where('start_time', $start_time)->where('end_time', $end_time)->first();
if (empty($bonus_obj)) {
//上周邀请
$bonuses = AddedBonus::where('user_id', $user_id)->where('created_at', '>', $start_time)->where('created_at', '<', $end_time)->get();
$first_week_count = $bonuses->where('amount', 7)->count();
$other_week_count = $bonuses->where('amount', 0)->count();
//人数
$bonus_count = $bonuses->count();
$award = 0;
if ($bonus_count >= 30 && $bonus_count < 100) {
//多少个是第一周的
$award = $first_week_count * 7 + $other_week_count * 5;
} elseif ($bonus_count >= 100 && $bonus_count < 200) {
$award = $bonus_count * 7;
} elseif ($bonus_count >= 200) {
$award = $bonus_count * 10;
} elseif ($first_week_count) {
$award = $first_week_count * 7;
}
$new_data = [];
$new_data['user_id'] = $user_id;
$new_data['first_week_count'] = $first_week_count;
$new_data['other_week_count'] = $other_week_count;
$new_data['bonus_count'] = $bonus_count;
$new_data['award'] = $award;
$new_data['start_time'] = $start_time;
$new_data['end_time'] = $end_time;
$new_data['created_at'] = date('Y-m-d H:i:s');
$new_data['updated_at'] = date('Y-m-d H:i:s');
$data[] = $new_data;
}
continue;
}
if (count($data)) {
Bonus::insert($data);
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 检查转账订单
* @return [type] [description]
*/
public function checkTransferOrder()
{
try {
$orders = TransferOrder::where('is_hooked', 0)->chunk(100, function ($orders) {
foreach ($orders as $order) {
$result = \WechatService::transferred($order->trade_no);
if ($result) {
$order->is_hooked = 1;
$order->save();
}
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 定时更新红包状态
* @return [type] [description]
*/
public function reportRedPacket()
{
//10分钟有多于10个红包报告
$not_enough_alarm = Redis::get('NotenoughAlarm');
$start = date('Y-m-d H:i:s', strtotime('-10 minutes'));
$orders = RedPacketOrder::where('created_at', '>', $start)->groupBy('err_code')->select('err_code', DB::raw('count(*) as count'), DB::raw('sum(amount) as amount'))->get();
$message = '预警助脱单红包报告:' . ($not_enough_alarm ? '配额关' : '配额开') . '
';
$alarm_count = 0;
foreach ($orders as $order) {
$message .= $order->err_code . ':' . $order->count . '个,¥' . $order->amount . '
';
$alarm_count += $order->count;
}
if ($alarm_count > 10) {
$this->adminNotice($message);
}
//30分钟报告一次
$redpacket_report_count = Redis::get('redpacket_report_count');
if ($redpacket_report_count % 3 == 0) {
$start = date('Y-m-d H:i:s', strtotime('-30 minutes'));
$orders = RedPacketOrder::where('created_at', '>', $start)->groupBy('err_code')->select('err_code', DB::raw('count(*) as count'), DB::raw('sum(amount) as amount'))->get();
$message = '定时助脱单红包报告:' . ($not_enough_alarm ? '配额关' : '配额开') . '
';
foreach ($orders as $order) {
$message .= $order->err_code . ':' . $order->count . '个,¥' . $order->amount . '
';
}
$sources = RedPacketOrder::where('created_at', '>', $start)->groupBy('source')->select('source', DB::raw('count(*) as count'), DB::raw('sum(amount) as amount'))->get();
$message .= '渠道统计:
';
foreach ($sources as $order) {
$message .= $order->source . ':' . $order->count . '个,¥' . $order->amount . '
';
}
$this->adminNotice($message);
}
$redpacket_report_count++;
Redis::set('redpacket_report_count', $redpacket_report_count);
}
/**
* 检查红包是否超过限额并自动关闭与开启
*/
public function checkRedPacketQuota()
{
try {
$start = date('Y-m-d');
$red_quota = Redis::get('red_quota');
$red_quota = $red_quota ? $red_quota : 2000;
$amount = RedPacketOrder::where('created_at', '>', $start)->where(function ($query) {
$query->whereNull('err_code')
->orWhere('err_code', '=', 'SUCCESS');
})->sum('amount');
$not_enough_alarm = Redis::get('NotenoughAlarm');
var_dump([$amount, $not_enough_alarm]);
if ($amount > $red_quota && !$not_enough_alarm) {
Redis::set('NotenoughAlarm', count(RedPacketOrder::groupBy(DB::raw('left(created_at,10)'))->pluck('id')));
$this->adminNotice('无渠道红包日发放量已经超过' . $red_quota . ' 系统关闭红包');
}
$amount_unpaid = RedPacketOrder::where('created_at', '>', $start)->where('err_code', 'NOTENOUGH')->sum('amount');
if ($not_enough_alarm && ($amount < $red_quota) && $amount_unpaid == 0) {
Redis::set('NotenoughAlarm', 0);
$this->adminNotice('当日红包流量已经重置,重新开启无渠道发红包功能');
}
return false;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* '无渠道红包日发放量已经超过2000 系统关闭红包'
*/
public function adminNotice($message)
{
$app = app('wechat.official_account');
$text = new Text($message);
$openId = 'okaDW0y9vmK5P1URU40PrYWjL2SA';
$result = $app->customer_service->message($text)->to($openId)->send();
}
/**
* 检查红包重复红包
* @return [type] [description]
*/
public function checkRedRepeat()
{
$orders = RedPacketOrder::whereIn('type', ['MP', 'SHAREMP'])->where('is_hooked', 0)->skip(0)->take(500)->get();
$i = 0;
$data = [];
foreach ($orders as $order) {
$data[$i++] = $this->trimRedOrder($order);
}
return $data;
}
/**
* 内部函数:去除重复领取的红包
*/
public function trimRedOrder($order)
{
if ($order->type == 'SHAREMP') {
$reds_paid = RedPacketOrder::where('official_openid', $order->official_openid)->where('from_official_openid', $order->from_official_openid);
$reds_init = RedPacketOrder::where('official_openid', $order->official_openid)->where('from_official_openid', $order->from_official_openid);
$reds_updated = RedPacketOrder::where('official_openid', $order->official_openid)->where('from_official_openid', $order->from_official_openid);
} else if ($order->type == 'MP') {
$reds_paid = RedPacketOrder::where('official_openid', $order->official_openid)->where('type', 'MP');
$reds_init = RedPacketOrder::where('official_openid', $order->official_openid)->where('type', 'MP');
$reds_updated = RedPacketOrder::where('official_openid', $order->official_openid)->where('type', 'MP');
} else if ($order->type == 'FRUIT') {
$reds_paid = RedPacketOrder::where('official_openid', $order->official_openid)->where('type', 'FRUIT');
$reds_init = RedPacketOrder::where('official_openid', $order->official_openid)->where('type', 'FRUIT');
$reds_updated = RedPacketOrder::where('official_openid', $order->official_openid)->where('type', 'FRUIT');
} else {
return 'unexpectType:' . $order->type;
}
$paid_count = $reds_paid->where('is_hooked', 1)->count();
$count = $reds_init->where('is_hooked', 0)->count();
//already fetch redpacket
if ($paid_count > 0) {
$reds_updated->where('is_hooked', 0)->update(['is_hooked' => 2, 'err_code' => 'REPEATED', 'return_msg' => '重复红包' . $order->type]);
} else if ($count > 0) {
if ($count > 1) {
$ids = $reds_updated->where('is_hooked', 0)
->where('id', '<>', $order->id)->pluck('id');
RedPacketOrder::whereIn('id', $ids)->update(['is_hooked' => 2, 'err_code' => 'REPEATED', 'return_msg' => '重复未处理红包' . $order->type]);
}
/**todo: transfer to user redpacket and set is_hooked */
}
//是重复红包
if ($paid_count > 0) {
return false;
} else {
//检查IP黑名单
if ($order->ip) {
$is_black = BlackIp::where('ip', $order->ip)->count();
if ($is_black) {
RedPacketOrder::where('id', $order->id)->update(['is_hooked' => 2, 'err_code' => 'BLACKIP', 'return_msg' => '抢红包黑名单']);
return false;
}
}
return $order->type . ':' . 'Paid:' . $paid_count . ',initRed:' . $count;
}
}
/**
* 检查红包订单是否成功
* @return [type] [description]
*/
public function checkRedPacketOrder()
{
/* type:
*
* MP: 关注公众号红包
* SHAREMP: 分享关注公众号红包
*
*/
$ids = [];
RedPacketOrder::whereIn('type', ['FRUIT', 'MP', 'SHAREMP'])->where('trigged', 0)->where('is_hooked', 0)
->take(1800)->chunk(100, $ids = function ($orders) {
foreach ($orders as $order) {
$result = \WechatService::checkNormalRedPack($order->trade_no);
if ($result->status) {
$order->is_hooked = 1;
$order->err_code = $result->result['result_code'];
$order->return_msg = $result->result['desc'];
} else {
//订单处理上锁
$order_lock = Redis::get('rp_order_lock_' . $order->id);
if ($order_lock) {
//已锁订单
continue;
} else {
//锁定去处理
Redis::setex('rp_order_lock_' . $order->id, 10, 1);
}
try {
$res = $this->trimRedOrder($order);
if (empty($res)) {
//存在重复红包,不处理!
continue;
}
if (!\WechatService::officialIsSubscribed($order->official_openid)) {
$order->return_msg = '无效红包:未关注公众号';
$order->err_code = 'NOSUB';
$order->is_hooked = 2;
$order->save();
continue;
}
$order->err_code = $result->result['err_code'];
$order->return_msg = $result->result['return_msg'];
if (in_array($order->err_code, ['NOT_FOUND', 'NOTENOUGH'])) {
$send_name = $order->send_name ? $order->send_name : '福恋助脱单红包';
$res = \WechatService::officialUserTransfer(
$order->trade_no,
$order->official_openid,
$order->amount * 100,
$send_name
);
if ($res['return_code'] == 'SUCCESS') {
if ($res['result_code'] == 'SUCCESS') {
$order->is_hooked = 1;
$order->err_code = $res['result_code'];
$order->return_msg = $order->send_name;
} else {
$order->err_code = $res['err_code'];
$order->return_msg = $res['err_code_des'];
if ($order->err_code == 'SYSTEMERROR') {
$order->is_hooked = 0;
sleep(5);
} else if ($order->err_code == 'NOTENOUGH') {
Redis::set('NotenoughAlarm', count(RedPacketOrder::groupBy(DB::raw('left(created_at,10)'))->pluck('id')));
$app = app('wechat.official_account');
$text = new Text('微信支付余额不足!请及时充值');
$openId = 'okaDW0y9vmK5P1URU40PrYWjL2SA';
$result = $app->customer_service->message($text)->to($openId)->send();
} else {
$order->is_hooked = 2;
}
}
}
}
//订单处理解锁
Redis::setex('rp_order_lock_' . $order->id, 6, 0);
} catch (Exception $e) {
//订单处理解锁
Redis::setex('rp_order_lock_' . $order->id, 6, 0);
}
}
$order->save();
}
});
return $ids;
}
/**
* 图片信息
*/
public function photoInfo()
{
try {
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function checkArena()
{
//当前时间
$time = date('Y-m-d H:i:s');
$arenas = Arena::whereIn('status', [0, 1, 2])->get();
foreach ($arenas as $arena) {
//当前时间在开始时间与结束时间之间状态变成1
if ($arena->start_time <= $time && $arena->end_time > $time) {
$arena->status = 1;
} elseif ($arena->end_time <= $time) {//当前时间大于结束时间状态变成2
$arena->status = 2;
} else {
$arena->status = 0;
}
$arena->save();
}
}
public function updateGoldData()
{
try {
$profiles = SingleProfile::whereNull('user_id')->limit(100)->get();
foreach ($profiles as $profile) {
//判断是否注册过
$user = User::withTrashed()->where('mobile', $profile->mobile)->first();
if (empty($user)) {
$user = new User();
$user->name = $profile->name;
$user->mobile = $profile->mobile;
$user->belief = $profile->belief;
$user->sex = $profile->sex == '男' ? 1 : 2;
$user->email = $profile->mobile . '@ufutx.com';
$from_user_id = is_numeric($profile->from_user_id) ? $profile->from_user_id : 0;
$user->from_user_id = $from_user_id;
$user->password = bcrypt($profile->mobile);
$user->type = 'single';
$user->from_platform = "community_ag";
$user->save();
$profile_courtship = new ProfileCourtship();
$profile_courtship->user_id = $user->id;
$profile_courtship->province = $profile->province;
$profile_courtship->city = $profile->city;
$profile_courtship->dist = $profile->dist;
$profile_courtship->resident_province = $profile->resident_province;
$profile_courtship->resident_city = $profile->resident_city;
$profile_courtship->resident_dist = $profile->resident_dist;
$profile_courtship->age = $profile->age;
$profile_courtship->birthday = $profile->birthday;
$profile_courtship->stature = $profile->stature;
$profile_courtship->sex = $user->sex;
$profile_courtship->state = $profile->state;
$profile_courtship->degree = $profile->degree == "大学本科" ? '本科' : $profile->degree;
$profile_courtship->belief = $profile->belief;
$profile_courtship->post = $profile->post;
$profile_courtship->save();
$profile->user_id = $user->id;
$profile->save();
$wechat = new Wechat();
$wechat->user_id = $user->id;
$wechat->type = 'single';
$wechat->official_openid = $profile->openid;
$wechat->nickname = $profile->wechat_nickname;
$wechat->gender = $profile->wechat_sex == '男' ? 1 : 2;
$wechat->country = $profile->wechat_country;
$address_arr = explode(' ', $profile->wechat_address);
$wechat->province = count($address_arr) == 2 ? $address_arr[0] : null;
$wechat->city = count($address_arr) == 2 ? $address_arr[1] : null;
$wechat->avatar = $profile->avatar;
$wechat->save();
//添加登录记录
// Dynamic::create(['user_id'=>$user->id, 'content'=>'金数据注册']);
} else {
$profile->user_id = $user->id;
$profile->save();
//修改单身资料
$data['belief'] = $profile->belief;
$data['sex'] = $profile->sex == '男' ? 1 : 2;
$data['province'] = $profile->province;
$data['city'] = $profile->city;
$data['dist'] = $profile->dist;
$data['resident_province'] = $profile->resident_province;
$data['resident_city'] = $profile->resident_city;
$data['resident_dist'] = $profile->resident_dist;
$data['birthday'] = $profile->birthday;
$data['stature'] = $profile->stature;
$data['state'] = $profile->state;
$data['degree'] = $profile->degree == "大学本科" ? '本科' : $profile->degree;
$data['post'] = $profile->post;
$profile_courtship = ProfileCourtship::where('user_id', $user->id)->first();
if (empty($profile_courtship)) {
$data['user_id'] = $user->id;
ProfileCourtship::where('user_id', $user->id)->insert($data);
} else {
$profile_courtship->update($data);
}
$user->belief = $data['belief'];
$user->sex = $data['sex'];
$user->save();
$wechat = Wechat::where('user_id', $user->id)->first();
\Log::info('updateGoldData');
if ($wechat && empty($wechat->official_openid)) {
$wechat->official_openid = $profile->openid;
$wechat->save();
}
}
#TODO发送推荐模板消息
//获取需要推荐的用户
$sex = $user->sex == 1 ? 2 : 1;
$min_birthday = $profile->lover_min_birthday;
$max_birthday = $profile->lover_max_birthday;
$state = $profile->lover_state;
$belief = $profile->belief;
$target_user = $this->getGoldRecommendProfile($user, $sex, $min_birthday, $max_birthday, $state, $belief);
if ($target_user && $profile->openid) {
//发送推荐模板消息
$param['user_id'] = $target_user->id;
$param['user_name'] = $target_user->name;
$param['openid'] = $profile->openid;
$param['recive_user_id'] = $profile->user_id;
// \WechatService::agRecommendNotcie($param);
//检测是否关注公众号
SendAGRecommend::dispatch($param)->delay(now()->addMinutes(5))->onQueue('love');
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 获取为Ta推荐的用户
*/
public function getGoldRecommendProfile($user, $sex, $min_birthday, $max_birthday, $state, $belief)
{
//已推荐过的用户
$other_user_ids = $user->hasRecommended();
$user = User::whereHas('profileCourtship', function ($sql) use ($min_birthday, $max_birthday, $state) {
$sql = $sql->where('birthday', '>=', $max_birthday)->where('birthday', '<=', $min_birthday)->where('hidden_profile', '<>', 'ALLSEX');
if ($state == '从未结婚') {
$sql = $sql->where('state', $state);
}
})->whereNotIn('id', $other_user_ids)->where('is_approved', 1)->where('sex', $sex)->where('type', 'single')->where('belief', $belief)->first();
return $user;
}
/**
* 更新年龄
*/
public function updateProfileAge()
{
$profiles = ProfileCourtship::whereNotNull('birthday')->whereNull('age')->limit(100)->get();
foreach ($profiles as $profile) {
$age = $this->getAge($profile->birthday);
$profile->age = $age;
$profile->save();
}
}
/**
* 获取心灵密友问题答案
*/
public function getSoulAnswers()
{
if (config('app.env') == 'local') {
$url = "https://testsearch.soulbuddy.cn/fl/get_question_list";
} else {
$url = 'https://api.soulbuddy.cn/fl/get_question_list';
}
//最后一次获取到的答案时间
$last_answer = SoulAnswer::whereNull('user_id')->orderBy('id', 'desc')->first();
if (empty($last_answer)) {
$start_time = "";
} else {
$start_time = strtotime($last_answer->updated_at->toDateTimeString());
}
$clientID = 36;
$secret = '35da4e6e7664e010';
$end_time = time();
$sign = "clientID=" . $clientID . "&end_time=" . $end_time . "&start_time=" . $start_time . $secret;
$sign = strtoupper(md5($sign));
$data = [
'clientID' => $clientID,
'start_time' => $start_time,
'end_time' => $end_time,
'sign' => $sign
];
//请求数据
$result = Http::http($url, $data, 'POST');
return json_decode($result, true);
}
/**
* 保存心灵密友答案
*/
public function saveSoulAnswers()
{
//获取答案
$result = $this->getSoulAnswers();
if ($result['code'] && $result['data']) {//请求成功
$answers = $result['data'];
$answers_data = [];
foreach ($answers as $answer) {
$data = [];
$talent_info = $answer['talent_info'];
$data['question_id'] = $answer['question_id'];
$data['created_at'] = date('Y-m-d H:i:s', $answer['create_time']);
$data['answer'] = $answer['answer_text'];
$data['answer_url'] = $answer['answer_url'];
$data['is_text'] = $answer['is_text'];
$data['talent_name'] = $talent_info['true_name'];
$data['talent_id'] = $talent_info['u_id'];
$data['talent_link'] = $answer['talent_link'];
$data['talent_title'] = $talent_info['user_title'];
$data['talent_logo'] = $talent_info['logo'];
$data['type'] = 'TALENT';
$data['updated_at'] = date('Y-m-d H:i:s');
$answers_data[] = $data;
}
SoulAnswer::insert($answers_data);
}
}
/**
* 更新个人信息完成分数
*/
public function updateUserInfoScore()
{
try {
User::where('is_update_score', 0)->limit(1000)->orderBy('id', 'desc')->chunk(100, function ($users) {
foreach ($users as $user) {
$userService = new UserService;
$profile = $user->profileCourtship;
$result = $userService->profileIntegrity($profile, $user);
$score = $result['count'];
User::where('id', $user->id)->update(['info_complete_score' => $score, 'is_update_score' => 1]);
}
return;
});
} catch (\Exception $e) {
$this->getError($e);
return;
}
}
/**
* 每日更新用户资料
* @return [type] [description]
*/
public function dailyUpdateUserInfoScore()
{
set_time_limit(0);
try {
$start_time = date('Y-m-d', strtotime("-1 day"));
$end_time = date('Y-m-d');
User::whereBetween('updated_at', [$start_time, $end_time])->chunk(1000, function ($users) {
foreach ($users as $user) {
$userService = new UserService;
$profile = $user->profileCourtship;
$result = $userService->profileIntegrity($profile, $user);
$score = $result['count'];
User::where('id', $user->id)->update(['info_complete_score' => $score, 'is_update_score' => 1]);
}
});
return;
} catch (\Exception $e) {
$this->getError($e);
return;
}
return;
}
public function calculateInfoCompleteScore($user)
{
$sum = 0;
if ($user->profileCourtship) {
//个人信息
$profile = $user->profileCourtship;
//年龄1分
if ($profile->birthday) {
$sum += 1;
}
//身高1分
if ($profile->stature) {
$sum += 1;
}
//体重1分
if ($profile->weight) {
$sum += 1;
}
//婚姻1分
if ($profile->state) {
$sum += 1;
}
//出生地1分
if ($profile->province && $profile->city) {
$sum += 1;
}
//户口1分
if ($profile->resident_type) {
$sum += 1;
}
//成长环境1分
if ($profile->habitat) {
$sum += 1;
}
//公司1分
if ($profile->conpany) {
$sum += 1;
}
//公司性质1分
if ($profile->work_sort) {
$sum += 1;
}
//公司职位1分
if ($profile->post) {
$sum += 1;
}
//信仰1分
if ($profile->belief) {
$sum += 1;
}
//居住地1分
if ($profile->province && $profile->city) {
$sum += 1;
}
}
//行业1分
if ($user->industry && $user->industry_sub) {
$sum += 1;
}
//实名认证10分
if ($user->is_approved) {
$sum += 10;
}
//实人认证10分
if ($user->is_real_approved) {
$sum += 5;
}
return $sum;
}
public function isSubscribe()
{
try {
User::chunk(100, function ($users) {
foreach ($users as $user) {
$user->is_subscribe = $user->hasSubscribeOfficial();
$user->save();
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function addRedBlackIp()
{
try {
DB::table('black_ips')->distinct()->get(['ip']);
$blackIps = BlackIp::whereNull('count')->pluck('ip')->toarray();
$redBlackIps = RedPacketOrder::select(DB::raw('count(id) as count'), 'ip')->whereIn('ip', $blackIps)->groupBy('ip')->havingRaw('count > ?', [5])->get();
foreach ($redBlackIps as $item) {
BlackIp::where('ip', $item->ip)->update(['count' => $item->count]);
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 最终的红包分配
*/
public function testcreateParticipantPacket()
{
if (date('Y-m-d') != '2020-01-14') {
return;
}
// 完成九个果子的用户数
$count = Participant::where('fruit_num', '>=', 9)->count();
// $count = 84795;
//单次最多红包数
$single_count = 10000;
//分次数插入数据库
$num = (int) ceil($count / $single_count);
$total_red_packet = number_format($count * 0.3, 2, '.', '');
//单次获取的金额
$array = [
'count' => $count,
'total_packet' => $total_red_packet,
];
CreateNewYearPacket::dispatch($array)->onQueue('love');
}
public function participantPacket($min_fruit_num, $max_fruit_num, $money, $min_money, $max_money)
{
$count = Participant::where('fruit_num', '>=', $min_fruit_num);
if ($max_fruit_num) {
$count = $count->where('fruit_num', '<', $max_fruit_num);
}
$count = $count->count();
$total_money = 1700;//$count * $money;
if (empty($total_money)) {
return;
}
$packet_data = [
'min' => $min_money,
'max' => $max_money,
'num' => $count,
'total' => $total_money,
];
//生成红包
CreateParticipantPacket::dispatch($packet_data)->onQueue('love');
return compact('count', 'total_money');
}
public function participantPacketV2($min_fruit_num, $max_fruit_num, $money, $min_money, $max_money, $fruit_histoies)
{
$fruit_histoies = $fruit_histoies->where('num', '>=', $min_fruit_num);
if ($max_fruit_num) {
$fruit_histoies = $fruit_histoies->where('num', '<', $max_fruit_num);
}
$count = $fruit_histoies->count();
if ($min_fruit_num == 12) {
$total_money = 1110;
} elseif ($min_fruit_num == 20) {
$total_money = 900;
} elseif ($min_fruit_num == 50) {
$total_money = 1500;
}
// $total_money = 1700;//$count * $money;
if (empty($total_money)) {
return;
}
$packet_data = [
'min' => $min_money,
'max' => $max_money,
'num' => $count,
'total' => $total_money,
];
//生成红包
CreateParticipantPacket::dispatch($packet_data)->onQueue('love');
return compact('count', 'total_money');
}
/**
* 2月份的红包
* 二月份领取9个及以上的(删除)
* 上一次没有领取红包的
*/
public function createParticipantPacketV2()
{
//没领过红包的
// $packet_participant_ids = ParticipantRedPacket::distinct('participant_id')->pluck('participant_id')->toArray();
// $zero_count = 0;
// $success_packet_participant_ids = Participant::where('fruit_num', '>=',9)->pluck('id');
// foreach ($success_packet_participant_ids as $participant_id) {
// if(!in_array('participant_id', $packet_participant_ids)){
// $zero_count++;
// }
// }
//二月份领取9个及以上的
$participant_ids = FruitHistory::where('created_at', '>', '2020-02-01')->distinct('participant_id')->pluck('participant_id');
$fruit_histoies = \DB::table('fruit_histories')->select(\DB::raw('count(*) as num, participant_id, created_at'))
->where('created_at', '>', '2020-02-01')
->groupBy('participant_id')
->orderBy('num', 'desc')
->get();
$fourth_stage = $this->participantPacketV2(50, 0, 26, Participant::FOURTH_MIN_MONEY, Participant::FOURTH_MAX_MONEY, $fruit_histoies);
$third_stage = $this->participantPacketV2(20, 50, 20, Participant::THIRD_MIN_MONEY, Participant::THIRD_MAX_MONEY, $fruit_histoies);
$second_stage = $this->participantPacketV2(12, 20, 10, Participant::SECOND_MIN_MONEY, Participant::SECOND_MAX_MONEY, $fruit_histoies);
$first_count = $fruit_histoies->where('num', '>=', 9)->where('num', '<', 12)->count();
$total_count = $fourth_stage['count'] + $second_stage['count'] + $third_stage['count'] + $first_count;
$total_money = $this->totalRedPacket($total_count);
$first_money = 1500;
$first_packet_data = [
'min' => Participant::FIRST_MIN_MONEY,
'max' => Participant::FIRST_MAX_MONEY,
'num' => $first_count,
'total' => $first_money,
];
//生成红包
CreateParticipantPacket::dispatch($first_packet_data)->onQueue('love');
}
public function createParticipantPacket()
{
if (date('Y-m-d') != '2020-01-25') {
return;
}
$total_count = Participant::where('fruit_num', '>=', 9)->count();
$fourth_stage = $this->participantPacket(50, 0, 8, Participant::FOURTH_MIN_MONEY, Participant::FOURTH_MAX_MONEY);
$third_stage = $this->participantPacket(20, 50, 5, Participant::THIRD_MIN_MONEY, Participant::THIRD_MAX_MONEY);
$second_stage = $this->participantPacket(12, 20, 2, Participant::SECOND_MIN_MONEY, Participant::SECOND_MAX_MONEY);
$first_count = Participant::where('fruit_num', '>=', 9)->where('fruit_num', '<', 12)->count();
// //红包总金额
$total_count = $fourth_stage['count'] + $second_stage['count'] + $third_stage['count'] + $first_count;
$total_money = $this->totalRedPacket($total_count);
$first_money = 1500;//$total_money - $fourth_stage['total_money'] - $second_stage['total_money'] - $third_stage['total_money'];
// echo "total_money". $total_money;
// echo "total_count". $total_count;
// echo 'first_money:'.$first_money;
// echo 'first_count:'.$first_count;
// echo 'second_money:'.$second_stage['total_money'];
// echo 'second_count:'.$second_stage['count'];
// echo 'third_money:'.$third_stage['total_money'];
// echo 'third_count:'.$third_stage['count'];
// echo 'fourth_money:'.$fourth_stage['total_money'];
// echo 'fourth_count:'.$fourth_stage['count'];
$first_packet_data = [
'min' => Participant::FIRST_MIN_MONEY,
'max' => Participant::FIRST_MAX_MONEY,
'num' => $first_count,
'total' => $first_money,
];
//生成红包
CreateParticipantPacket::dispatch($first_packet_data)->onQueue('love');
}
/**
* 总红包金额
*/
public function totalRedPacket($count)
{
$total_red_packet = 0;
if ($count < 1000) {
$total_red_packet = $count * 3.5;
} elseif ($count >= 1000 && $count < 5000) {
$total_red_packet = $count * 3;
} elseif ($count >= 5000 && $count < 10000) {
$total_red_packet = $count * 2;
} elseif ($count >= 10000 && $count < 1000000) {
$total_red_packet = $count;
} else {
$total_red_packet = 1000000;
}
return $total_red_packet;
}
/**
* 2020年1月15 08:00:00通知用户
*/
public function participantPacketStartNotice()
{
if (date('Y-m-d') != '2020-01-15') {
return;
}
$wechat_users = Wechat::whereNotNull('official_openid')->select('official_openid', 'nickname')->get('official_openid');
foreach ($wechat_users as $wechat_user) {
$text = $this->getServiceNewsText($wechat_user['nickname']);
$array = [
'official_openid' => $wechat_user['official_openid'],
'text' => $text,
];
SendServiceNews::dispatch($array)->onQueue('love');
}
}
public function getServiceNewsText($nickname)
{
$nickname = $nickname ? $nickname : '你好';
$url = env('APP_URL') . '/red/packet/activity/wechat/auth';
$text = $nickname . ',恭喜您被抽中体验新年抢百万红包活动!,<a href="' . $url . '">立即体验GO!</a>';
return $text;
}
public function updatePhotoSize(Request $request)
{
$users = User::whereNotNull('photo')->chunk(100, function ($users) {
foreach ($users as $user) {
$img = Image::make($user->photo)->resize(250, 250);
$file_path = storage_path("qrcode/" . time() . "wechat_avatar.png");
$img->save($file_path);
$pic = $this->uploadFile($file_path);
try {
if (is_file($file_path)) {
unlink($file_path);
}
} catch (Exception $e) {
// return $this->failure($e->getMessage());
}
$user->photo_backup = $pic;
$user->save();
}
});
}
public function syncFaceScore()
{
$users = \DB::table('users')->whereNotNull('photo')->where('face_score', 0)
->rightJoin('image_infos', 'users.photo', '=', 'image_infos.url')
->limit(100)
->get();
foreach ($users as $user) {
Log::info('syncFaceScore user_id: ' . $user->user_id);
$user->face_score = $user->beauty;
User::where('photo', $user->photo)->update(['face_score' => $user->beauty]);
}
}
// public function faceScore()
// {
// User::where("face_score", 0)->whereNotNUll('photo')->where('is_photo_audited ', 1)->where('type', 'single')->where('hidden_profile', 'NONE')
// ->where('negative_score', '<>', 200)
// ->chunk(100, function ($users) {
// foreach ($users as $user)
// {
// //人脸识别
// $user_service = new UserService();
// $result = $user_service->faceDelectBaiDu($user->photo);
// if (empty($result->result)) {
// Log::info("【faceScore】用户id ".$user->id.'图片人脸识别失败');
// continue;
// }
// $face_list = $result->result->face_list;
// $face_socre = $face_list[0]->beauty;
// User::where('id', $user->id)->update(['face_score'=>$face_socre]);
// //创建百度图片信息
// $user_service->addImageInfo($user, $user->photo, $face_list[0]);
// $res = $user_service->checkPhotoResult($result, $user->id);
// if (empty($res)) throw new \Exception("图片分析失败", 1);
// if (is_array($res) && $res['code']) {
// //增加错误头像记录
// ErrorPhoto::firstOrCreate(['user_id'=>$user->id, 'photo'=>$user->photo, 'error_msg'=>$res['msg']]);
// if ($res['msg'] == "pic not has face") return $this->failure('图片上传失败,可能未获取到人脸,请换一张照片');
// if ($res['msg'] == "image download fail") return $this->failure('图片解析失败,请重新上传');
// continue;
// }
// }
// });
// }
public function syncLiveViews()
{
$lives = Live::where('start_time', '<', date('Y-m-d H:i:s'))->where('url', '!=', '')->get();
foreach ($lives as $live) {
try {
if (empty($live->url) || strstr($live->url, 'ls'))
continue;
$contents = file_get_contents($live->url);
$views = mb_substr($contents, mb_strpos($contents, '<i class="iconguankanrenshu iconfont"></i>') + 70, '10');
$views = mb_substr($views, 0, mb_strpos($views, '人'));
Live::where('id', $live->id)->update(['times' => $views]);
} catch (\Exception $e) {
$this->getError($e);
}
}
}
// public function delRepeat(){
//// $arr = ViewerShare::select('viewer_id', 'sharer_id')->groupBy('viewer_id', 'sharer_id')->get();
//// foreach ($arr as $item){
//// $is_set = ViewerShare::where('viewer_id', $item->viewer_id)->where('sharer_id', $item->sharer_id)->where('type', 1)->count();
//// if($is_set == 0){
//// $count = ViewerShare::where('viewer_id', $item->viewer_id)->where('sharer_id', $item->sharer_id)->where('type', 2)->count();
//// ViewerShare::where('viewer_id', $item->viewer_id)->where('sharer_id', $item->sharer_id)->where('type', 2)->where('is_show', 1)->orderBy('created_at', 'desc')->limit(1)->update(['is_show'=>0]);
//// }
////
//// }
//// }
///
/**
* 同步IM用户
* @return [type] [description]
*/
public function synIMUser()
{
try {
// $count = User::whereDoesntHave('IMUser')->count();
// if (empty($count)) {
// return true;
// }
$users = User::whereDoesntHave('IMUser')->orderBy('id', 'desc')->limit(10)->get();
foreach ($users as $user) {
$user->createIMUser();
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 同步社群到IM
* @return [type] [description]
*/
public function syncIMGroup()
{
try {
$communities = Community::where('tid', '')->orWhereNull('tid')->orWhere('tid', 0)->limit(100)->get();
foreach ($communities as $community) {
$tid = $community->createIMGroup();
if ($tid) {
Community::where('id', $community->id)->update(['tid' => $tid]);
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 同步社群成员到网易群
* @return [type] [description]
*/
public function syncIMCommunityMember()
{
try {
// throw new \Exception("Error Processing Request", 1);
$members = CommunityMember::with('community', 'user')->whereHas('community', function ($sql) {
$sql->where('is_hided', 0)->whereNotNull('tid')->where('tid', '<>', 0);
})->where('is_sync_im', 0)->limit(100)->get();
foreach ($members as $member) {
$community = $member->community;
$user = $member->user;
if (empty($community) || empty($user)) {
$member->delete();
continue;
}
//同步
$result = $community->addIntoIMGroup([$member->user_id]);
}
return true;
} catch (\Exception $e) {
$this->getError($e, false);
return false;
}
}
public function syncIMCommunityChat()
{
}
/**
* 检查主播是否在直播间
* @return [type] [description]
*/
public function checkInteractLiveMaker()
{
try {
$lives = InteractLive::where('in_live', 1)->paginate();
foreach ($lives as $live) {
//检查主播是否在房间
$result = $live->chatroomLineMembers([$live->user_id]);
if (empty($result[0]['onlineStat'])) {//主播不在直播间
$live_service = new LiveService();
$live_service->closeLive($live);
//发送关闭直播间自定义消息
$attach = json_encode([InteractLive::CHATMSGTYPE['main_leave'], 'data' => '主播离开']);
$result = $live->chatroomSendMsg($live->user_id, $msgType = 10, $attach);
if (empty($result))
throw new \Exception("直播间id:" . $live->id . "发送自定义消息失败", 1);
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 检测直播间成员在线
* @return [type] [description]
*/
public function checkInteractLiveMembers()
{
try {
InteractLive::where('in_live', 1)->chunk(10, function ($lives) {
foreach ($lives as $live) {
$user_ids = $live->memberLogs()->where('in_live', 1)->limit(200)->pluck('user_id')->toArray();
if (!count($user_ids))
continue;
$members = $live->chatroomLineMembers($user_ids);
if (!count($members)) {
$live->memberLogs()->whereIn('user_id', $user_ids)->update(['in_live' => 0]);
} else {
$data = [];
foreach ($members as $member) {
if ($member['onlineStat']) {
$data[] = $member['accid'];
}
}
$live->memberLogs()->whereNotIn('user_id', $data)->update(['in_live' => 0]);
}
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function checkActivitie()
{
try {
\Log::info('checkActivitie begin');
$user_ids = User::where('is_approved', 1)->where('is_real_approved', 0)->where('type', 'single')->where('belief', '基督教')->orderBy('liveness', 'desc')->pluck('id')->toArray();
$activity_user_ids = ActivityUser::pluck('user_id');
$insert_arr = [];
$new_arr = [];
foreach ($user_ids as $user_id) {
// if(!in_array($user_id, $activity_user_ids)) {
$new_arr['user_id'] = $user_id;
$new_arr['type'] = 6;
$new_arr['created_at'] = date('Y-m-d H:i:s');
$new_arr['updated_at'] = date('Y-m-d H:i:s');
$insert_arr[] = $new_arr;
// }
}
ActivityUser::insert($insert_arr);
return true;
} catch (\Exception $e) {
$this->getError($e, false);
return false;
}
}
public function updateLiveClickNum()
{
InteractLive::where('in_live', 1)->chunk(100, function ($lives) {
foreach ($lives as $live) {
$click_num_key = $live->clickNumKey();
$click_num = Cache::get($click_num_key, 0);
InteractLive::where('id', $live->id)->update(['click_num' => $click_num]);
}
});
return true;
}
public function checkMobile()
{
try {
\Log::info('checkMobile begin');
$mobile_arr = User::pluck('mobile')->toArray();
$insert_arr = [];
$new_arr = [];
foreach ($mobile_arr as $mobile) {
if (strlen($mobile) == 11) {
$result = $this->getResult($mobile);
if (!empty($result)) {
$new_result = json_decode($result);
if ($new_result->code == 200000) {
$new_arr['mobile'] = $mobile;
$new_arr['status'] = $new_result->data[0]->status;
$new_arr['result'] = $result;
$new_arr['created_at'] = date("Y-m-d H:i:s");
$new_arr['updated_at'] = date("Y-m-d H:i:s");
$insert_arr[] = $new_arr;
}
}
}
}
CheckMobileModel::insert($insert_arr);
\Log::info('checkMobile end');
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function getResult($mobile)
{
$host = "http://ali.market.alicloudapi.com";
$path = "/open/unn/batch-ucheck";
$method = "POST";
$appcode = config("aliyun.appcode");
$headers = array();
array_push($headers, "Authorization:APPCODE " . $appcode);
$querys = "mobiles=" . $mobile;
$bodys = "";
$url = $host . $path . "?" . $querys;
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
if (1 == strpos("$" . $host, "https://")) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
}
$result = curl_exec($curl);
return $result;
}
public function createdMakerOnlineLog()
{
$yestoday_start_time = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')));
$yestoday_end_time = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1);
$logs = InteractLiveLog::whereNotNull('end_time')->whereBetween('created_at', [$yestoday_start_time, $yestoday_end_time])->groupBy('mk_user_id')->get();
$insert_arr = [];
foreach ($logs as $log) {
$new_arr = [];
$new_arr['user_id'] = $log->mk_user_id;
$all_hours = InteractLiveLog::selectRaw('sum(round((UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(created_at))/3600, 2)) AS hours')->where('mk_user_id', $log->mk_user_id)->whereNotNull('end_time')->whereBetween('created_at', [$yestoday_start_time, $yestoday_end_time])->value('hours');
$single_hours = InteractLiveLog::selectRaw('sum(round((UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(first_start_time))/3600, 2)) AS hours')->where('mk_user_id', $log->mk_user_id)->whereNotNull('first_start_time')->whereNotNull('end_time')
->where(function ($query) {
$query->where(function ($query) {
$query->whereNotNull('male_user_id')->WhereNull('female_user_id');
})
->orWhere(function ($query) {
$query->whereNull('male_user_id')->WhereNotNull('female_user_id');
});
})->whereBetween('created_at', [$yestoday_start_time, $yestoday_end_time])->value('hours');
// $double_single_hours = InteractLiveLog::selectRaw('sum(round((UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time))/3600, 2)) AS hours')->where('mk_user_id', $log->mk_user_id)->whereNotNull('first_start_time')->whereNotNull('start_time')->whereNotNull('end_time')->whereNoTNull('male_user_id')->WhereNotNull('female_user_id')->whereBetween('created_at', [$yestoday_start_time, $yestoday_end_time])->value('hours');
// $single_hours = bcadd($single_hours, $double_single_hours, 2);
$double_hours = InteractLiveLog::selectRaw('sum(round((UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time))/3600, 2)) AS hours')->where('mk_user_id', $log->mk_user_id)->whereNotNull('start_time')->whereNotNull('end_time')->whereNoTNull('male_user_id')->WhereNotNull('female_user_id')->whereBetween('created_at', [$yestoday_start_time, $yestoday_end_time])->value('hours');
$nobody_hours = bcsub(bcsub($all_hours, $single_hours, 2), $double_hours, 2);
$new_arr['all_hours'] = $all_hours;
$new_arr['single_hours'] = $single_hours;
$new_arr['double_hours'] = $double_hours;
$new_arr['nobody_hours'] = $nobody_hours;
$new_arr['start_time'] = $yestoday_start_time;
$new_arr['end_time'] = $yestoday_end_time;
$new_arr['created_at'] = date('Y-m-d H:i:s');
$new_arr['updated_at'] = date('Y-m-d H:i:s');
if ($all_hours > 0) {
$insert_arr[] = $new_arr;
}
}
MakerScoreLog::insert($insert_arr);
return true;
}
public function changeCoin()
{
try {
\DB::beginTransaction();
$logs = CoinLog::where('type', 'RECSYSTEM')->whereBetween('created_at', ['2020-11-11 10:42:35', '2020-11-11 10:42:37'])->where('is_hooked', 1)->whereNotIn('user_id', [4869, 4585, 2356]);
$logs = $logs->get();
foreach ($logs as $log) {
$coin = Coin::where('user_id', $log->user_id)->first();
$coin->decrement('remain_amount', $log->coin);
$coin->increment('amount_from_other', $log->coin);
}
$history = CoinLog::where('type', 'RECSYSTEM')->whereBetween('created_at', ['2020-11-11 10:42:35', '2020-11-11 10:42:37'])->where('is_hooked', 1)->whereNotIn('user_id', [4869, 4585, 2356])->update(['is_hooked' => 0]);
\DB::commit();
return true;
} catch (\Exception $e) {
\DB::rollBack();
$this->getError($e);
return false;
}
}
/**
* 同步直播数
* @return [type] [description]
*/
public function syncLiveNum()
{
try {
\App\Jobs\SendIMBroadcastMsg::dispatch()->onQueue('love');
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 未完善资料的每天模板提醒
* @return [type] [description]
*/
public function noProfileNotice()
{
try {
//获取已关注公众号用户
User::with('profileCourtship', 'wechat', 'viewer')->where('is_subscribe', 1)->where('type', 'single')->where('hidden_profile', 'NONE')->noFiveProfile()->chunk(100, function ($users) {
//是否完善五项资料
foreach ($users as $user) {
$openid = $user->wechat ? $user->wechat->official_openid : null;
if (empty($openid)) {
$openid = $user->viewer ? $user->viewer->openid : null;
}
if ($openid) {
$param["touser"] = $openid;
$param['template_id'] = config('wechat.tpls.no_profile_notice');
$param['url'] = env('APP_URL') . '/h5';
$param['miniprogram'] = [
'appid' => config('wechat.mini_program.app_id'),
'pagepath' => 'pages/tabBar/welcome?from_platform=RDINFO_1229',
];
$param['data'] = [
"first" => '你脱单了吗?今日已为您生成推荐,快去看看吧',
'keyword1' => $user->nickname ?: ($user->name ?: $user->mobile),
'keyword2' => $user->created_at->toDateTimeString(),
'remark' => '点击进入还可以参与签到分享。赢福币领VIP!'
];
SendTemplateMsg::dispatch($param)->onQueue('template_message');
}
}
});
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 关注公众号未注册模板消息提醒
* @return [type] [description]
*/
public function noRegisterNotice()
{
try {
//获取最后一次的openid
$key = 'last_no_register_openid';
$no_register_openid = null;
//获取所有的openid
$app = \WechatService::officialApp();
$result = $app->user->list(Cache::get($key, null));
if (empty($result['count']))
return true;
$openid_arr = $result['data']['openid'];
//获取前三千个用户openid
$sub_openid_arr = array_slice($openid_arr, 0, 3500);
//获取最后一位
$last_openid = $sub_openid_arr[count($sub_openid_arr) - 1];
//记录最后一个openid
$result = Cache::put($key, $last_openid, 2 * 24 * 60);
foreach ($sub_openid_arr as $sub_openid) {
//是否注册小程序
$wechat = Wechat::where('official_openid', $sub_openid)->first();
if ($wechat && $wechat->user_id)
continue;
$viewer = Viewer::where('openid', $sub_openid)->first();
if ($viewer && $viewer->user_id)
continue;
$user = $app->user->get($sub_openid);
//发送模板消息
$param["touser"] = $sub_openid;
$param['template_id'] = config('wechat.tpls.no_profile_notice');
$param['url'] = env('APP_URL') . '/h5';
$param['miniprogram'] = [
'appid' => config('wechat.mini_program.app_id'),
'pagepath' => 'pages/tabBar/welcome?from_platform=RDINFO_1229',
];
$param['data'] = [
"first" => '你脱单了吗?今日已为您生成推荐,快去看看吧',
'keyword1' => $user['nickname'],
'keyword2' => date('Y-m-d H:i:s', $user['subscribe_time']),
'remark' => '点击进入还可以参与签到分享。赢福币领VIP!'
];
SendTemplateMsg::dispatch($param)->onQueue('template_message');
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 签到订阅通知提醒
* @return [type] [description]
*/
public function signInNotice()
{
try {
//以前有签到今日没签到用户ID
$user_ids = $this->unsignUserIds();
if (empty(count($user_ids)))
return true;
User::whereIn('id', $user_ids)->whereHas('wechat')->where('hidden_profile', 'NONE')->chunk(100, function ($users) {
foreach ($users as $user) {
// SendSubTemplateMsg::dispatch('sign_in', $user)->onQueue('love');
SendSubTemplateMsg::dispatch('sign_in_v2', $user)->onQueue('template_message');
}
});
return true;
} catch (\user_ids $e) {
$this->getError($e);
return false;
}
}
public function unsignUserIds()
{
//以前签到的用户id
$sign_user_ids = SignLog::where('type', 'NEWYEAR')->where('sign_date', '<', date('Y-m-d'))->distinct('user_id')->pluck('user_id')->toArray();
//今天签到的用户id
$day_sign_user_ids = SignLog::where('type', 'NEWYEAR')->where('sign_date', '>=', date('Y-m-d'))->distinct('user_id')->pluck('user_id')->toArray();
$arr = [];
foreach ($sign_user_ids as $user_id) {
foreach ($day_sign_user_ids as $day_user_id) {
if ($user_id == $day_user_id) {
$arr[] = $user_id;
}
}
}
$user_ids = array_diff($sign_user_ids, $arr);
//已经签到七天用户id
$complete_user_ids = SignLog::where('type', 'NEWYEAR')->groupBy('user_id')->select(\DB::raw('count(*) as num'), 'user_id')->get()->where('num', 7)->pluck('user_id')->toArray();
$user_ids = array_diff($user_ids, $complete_user_ids);
return $user_ids;
}
/**
* 每日匹配通知
* @return [type] [description]
*/
public function matchNotice()
{
try {
$not_recommend_ids = [113649];
User::where('type', 'single')->whereNotIn('id', $not_recommend_ids)->where('hidden_profile', 'NONE')->fullinkUser()->chunk(100, function ($users) {
foreach ($users as $user) {
$target_user_ids = RecommendUser::where('user_id', $user->id)->where('start_time', '>=', date('Y-m-d') . ' 12:00:00')
/*->inRandomOrder()*/ ->orderBy('other_user_id', 'asc')->limit(2)
->get();
if (sizeof($target_user_ids) < 2) {
continue;
}
$target_user_id = [];
foreach ($target_user_ids as $key => $val) {
$target_user_id[] = $val->other_user_id;
}
$user_nick_mames = User::whereIn('id', $target_user_id)->pluck('nickname');
$nick_mame = '';
foreach ($user_nick_mames as $key => $val) {
if (mb_strlen($val) > 5) {
$val = mb_substr($val, 0, 4) . '...';
}
if (empty($nick_mame)) {
$nick_mame = $val . '、';
} else {
$nick_mame = $nick_mame . $val;
}
}
$targe_user = $nick_mame . '等';
SendSubTemplateMsg::dispatch('match', $user, $targe_user)->onQueue('template_message');
$target_user_id = [];
$targe_user = '';
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 每日访问记录
* @return [type] [description]
*/
public function visitNotice()
{
try {
$start_time = date('Y-m-d', strtotime('-1 day'));
$end_time = date('Y-m-d 23:59::59', strtotime('-1 day'));
//昨天被查看的用户
UserPreviewHistory::with('user')->whereBetween('created_at', [$start_time, $end_time])->distinct('user_id')->chunk(100, function ($logs) {
foreach ($logs as $log) {
if (empty($log->user) || $log->user->hidden_profile != "NONE" || $log->user->type != 'single') {
continue;
}
SendSubTemplateMsg::dispatch('visit_log', $log->user)->onQueue('template_message');
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function changeSignDays()
{
$beginYesterday = date("Y-m-d 00:00:00", strtotime("-1 day"));
$endYesterday = date("Y-m-d 00:00:00");
$endToday = date("Y-m-d 23:59:59");
//昨日签到用户
$yesterday_signuser = SignLog::whereBetween('sign_date', [$beginYesterday, $endYesterday])->pluck('user_id')->toArray();
//签到三十天用户
$month_sign = UserSign::where('sign_days', 30)->pluck('user_id')->toArray();
//今日签到用户
$today_signuser = SignLog::whereBetween('sign_date', [$endYesterday, $endToday])->pluck('user_id')->toArray();
//连续签到用户
$sign_user = UserSign::where('sign_days', '>', 0)->pluck('user_id')->toArray();
foreach ($sign_user as $val) {
//昨日是否签到
if (!in_array($val, $yesterday_signuser)) {
//今日也没签到
if (!in_array($val, $today_signuser)) {
UserSign::where('user_id', $val)->update(['sign_days' => 0]);
}
}
}
//签到三十天用户归零
foreach ($month_sign as $value) {
//今日没签到
if (!in_array($value, $today_signuser)) {
UserSign::where('user_id', $val)->update(['sign_days' => 0]);
}
}
}
/**
* 检测在线直播
*/
public function checkTeamLives()
{
try {
TeamLive::where('in_live', 1)->chunk(100, function ($lives) {
foreach ($lives as $live) {
//判断主播是否在直播间内
$im = new IMService();
$result = $im->chatroomLineMembers($live->chat_room_id, [$live->user_id]);
if (empty($result) || $result['code'] != 200) {
throw new \Exception("批量获取在线用户失败", 1);
}
$user_info = $result['desc']['data'][0];
// \Log::info($user_info);
if (empty($user_info['onlineStat'])) {
//修改直播状态
$live->in_live = 0;
$live->save();
//修改直播记录
$log = $live->liveLogs()->whereNull('end_time')->orderBy('id', 'desc')->first();
if ($log) {
$log->end_time = date('Y-m-d H:i:s');
$click_num_key = $live->clickNumKey();
$log->click_num = Cache::get($click_num_key, 0);
$log->save();
}
//修改群扩展状态
$team = Team::find($live->team_id);
if (empty($team))
throw new \Exception("群聊直播错误", 1);
//修改群扩展信息
if ($team->custom) {
$old_custom = $team->custom;
$old_custom->in_live = 0;
$old_custom->anchor_id = $live->user_id;
} else {
$old_custom['in_live'] = 0;
$old_custom['anchor_id'] = $live->user_id;
}
$data['custom'] = json_encode($old_custom);
$data['tid'] = $live->team_id;
$data['owner'] = $team->owner;
$im_service = new IMService(env('IM_APP_KEY'), env("IM_APP_SECRET"));
$url = "https://api.netease.im/nimserver/team/update.action";
$result = $im_service->postDataCurl($url, $data);
$team->custom = $data['custom'];
$team->save();
}
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function updateUserActiveProperties($param = null)
{
try {
$redis = Cache::getRedis();
switch ($param) {
case 'liveness':
//获取所有keys
$key_name = '_cache:' . User::RDLIVENESSKEY;
$keys = $redis->keys($key_name . "*");
$user_ids = [];
$values = [];
foreach ($keys as $key) {
$user_id = explode('_', $key)[4];
$user_ids[] = $user_id;
$value = $redis->get($key);
$values['r_' . $user_id] = $value;
//删除缓存
$redis->del($key);
}
$users = User::whereIn("id", $user_ids)->get();
foreach ($users as $user) {
$value = $values['r_' . $user->id];
if ($user->liveness < $value) {
User::where('id', $user->id)->update(['liveness' => $value]);
}
}
break;
case 'visit':
$key_name = '_cache:' . User::RDLASTTIMEKEY;
$keys = $redis->keys($key_name . "*");
$user_ids = [];
$values = [];
foreach ($keys as $key) {
$user_id = explode('_', $key)[5];
$user_ids[] = $user_id;
$value = $redis->get($key);
$value = explode('"', $value)[1];
$values['r_' . $user_id] = $value;
//删除缓存
$redis->del($key);
}
$users = User::whereIn("id", $user_ids)->get();
foreach ($users as $user) {
$value = $values['r_' . $user->id];
User::where('id', $user->id)->update(['last_visit' => $value]);
}
break;
default:
break;
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function recommendActivity()
{
try {
$activity_id = 435;
$users = User::with('wechat')->where([/*'type'=>'single',*/ 'hidden_profile' => 'NONE', 'is_subscribe' => 1])->whereHas('profileCourtship', function ($sql) {
$sql->where("city", '深圳市');
})->get();
foreach ($users as $user) {
if (empty($user->wechat) || empty($user->wechat->official_openid))
continue;
$param['touser'] = $user->wechat->official_openid;
// dd($param['touser']);
$param['activity_id'] = $activity_id;
$url = '';
$path = 'pages/party/detail?party_id=' . $param['activity_id'];
$param['template_id'] = config('wechat.tpls.activity_rec');
$param['url'] = $url;
$param['miniprogram'] = [
'appid' => config('wechat.mini_program.app_id'),
'pagepath' => $path,
];
$param['data'] = [
'first' => '为你准备了一个精彩的【线下活动】。',
'keyword1' => $user->nickname,
'keyword2' => date('Y-m-d H:i:s'),
'remark' => '请点击进入查看详情,期待您的参与!',
];
// dd($param);
\App\Jobs\SendTemplateMsg::dispatch($param)->onQueue('template_message');
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
//检查同步群聊成员
public function syncTeamMembers()
{
$teams = Team::get();
foreach ($teams as $team) {
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$result = $im_service->queryDetailGroup($team->id);
if ($result['code'] == 200) {
$wangyi_members = array_column($result['tinfo']['members'], 'accid');
$wangyi_owner = array_column($result['tinfo']['owner'], 'accid');
$wangyi_admins = array_column($result['tinfo']['admins'], 'accid');
$wangyi_members = array_merge($wangyi_members, $wangyi_admins, $wangyi_owner);
$wangyi_members[] = $team->owner;
$local_members = UserTeam::where('team_id', $team->id)->pluck('user_id')->toArray();
$delete_members = array_diff($local_members, $wangyi_members);
$insert_members = array_diff($wangyi_members, $local_members);
$insert = [];
foreach ($insert_members as $user_id) {
$new_arr = [
'user_id' => $user_id,
'team_id' => $team->id,
'created_at' => date("Y-m-d H:i:s"),
'updated_at' => date("Y-m-d H:i:s"),
];
$insert[] = $new_arr;
}
if (!empty($delete_members)) {
foreach ($delete_members as $delete_member) {
UserTeam::where('user_id', $delete_member)->where('team_id', $team->id)->delete();
}
}
if (!empty($insert)) {
UserTeam::insert($insert);
}
}
}
return false;
}
/**
* 同步真人认证正面照到服务器
* @return [type] [description]
*/
public function syncLivePerson()
{
try {
Liveperson::whereNull('love_avatar')->whereNoTNull('avatar')->chunk(100, function ($logs) {
foreach ($logs as $log) {
Image::configure(['driver' => 'gd']);
$time = uniqid();
$image = Image::make($log->avatar);
$file_path = storage_path("/qrcode/" . $time . "person.png");
$image->save($file_path);
$pic = null;
if (file_exists($file_path)) {
$pic = $this->uploadFile($file_path);
try {
unlink($file_path);
} catch (\Exception $e) {
$this->getError($e);
}
}
Liveperson::where("id", $log->id)->update(['love_avatar' => $pic]);
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function faceMatch()
{
try {
$user_service = new UserService();
$data = [];
Liveperson::with('user:id,photo')->where('status', 1)->whereHas('user', function ($sql) {
$sql->whereNoTNull("photo")->where('is_photo_audited', 1);
})->whereDoesntHave('faceMatch')->chunk(100, function ($logs) use ($user_service, &$data) {
foreach ($logs as $log) {
$image1 = $log->avatar;
$image2 = $log->user->photo;
$result = $user_service->faceMatch($image1, $image2);
if (empty($result))
continue;
if (empty($result) || !empty($result->error_msg)) {
if ($log->user->id == 97761 || $log->user->id == 100729)
continue;
// User::where('id', $log->user->id)->update(['is_photo_audited'=>0]);
continue;
}
$arr['user_id'] = $log->user->id;
$arr['first_image'] = $image1;
$arr['last_image'] = $image2;
$arr['first_token'] = ($result->face_list)[0]->face_token;
$arr['last_token'] = ($result->face_list)[1]->face_token;
$arr['score'] = $result->score;
$arr['created_at'] = $arr['updated_at'] = date('Y-m-d H:i:s');
$data[] = $arr;
}
});
if (count($data)) {
FaceMatch::insert($data);
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
//好友消息未读短信通知
public function chatRemind()
{
if (config('app.env') == 'production') {
$short_url = \CommonUtilsService::shortUrl(env('APP_URL') . '/h5/#/jump?type=message');
//已发送过短信的用户id
$chat_messages = ChatMessage::whereHas('otherUser', function ($sql) {
$sql->where('id', '>', 0)->where('hidden_profile', '<>', 'ALLSEX');
})
->where('other_user_id', '<>', 1)->where('status', 0)->where('has_remain', 0)->where('type', 'chat')->get();
$update_messages = [];
$remind_users = [];
foreach ($chat_messages as $chat_message) {
$key = 'remind_user_id_' . $chat_message->other_user_id;
$has_send = Redis::get($key);
if (!$has_send) {
$remind_users[] = $chat_message->other_user_id;
Redis::setex($key, 7 * 24 * 3600, $chat_message->other_user_id);
}
$update_messages[] = $chat_message->id;
}
if (!empty($update_messages)) {
ChatMessage::whereIn('id', $update_messages)->update(['has_remain' => 1, 'status' => 1]);
}
//获取手机号
if ($remind_users) {
$mobiles = User::whereIn('id', $remind_users)->pluck('mobile')->toArray();
$array = [
'mobile' => $mobiles,
'message' => "【福恋】你有一条用户私聊消息未读,可点击 " . $short_url['url'] . " 查看消息内容并回复ta",
];
SendSmsBatch::dispatch($array)->onQueue('love');
}
return true;
}
}
public function syncSex()
{
try {
$users = \DB::table('users as u')
->join('profile_courtships as c', function ($join) {
$join->on('u.id', '=', 'c.user_id')
->on('c.sex', '!=', 'u.sex');
})
->select('c.user_id', 'u.id', 'u.sex as u_sex', 'c.sex as c_sex')
->get();
foreach ($users as $user) {
if ($user->u_sex) {
\DB::table('profile_courtships')->where("user_id", $user->user_id)->update(['sex' => $user->u_sex]);
} else {
\DB::table('users')->where("id", $user->user_id)->update(['sex' => $user->c_sex]);
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function syncBelief()
{
try {
$users = \DB::table('users as u')
->join('profile_courtships as c', function ($join) {
$join->on('u.id', '=', 'c.user_id')
->on('c.belief', '!=', 'u.belief');
})
->select('c.user_id', 'u.id', 'u.belief as u_belief', 'c.belief as c_belief')
->get();
foreach ($users as $user) {
if ($user->c_belief) {
\DB::table('users')->where("id", $user->user_id)->update(['belief' => $user->c_belief]);
} else {
\DB::table('profile_courtships')->where("user_id", $user->user_id)->update(['belief' => $user->u_belief]);
}
}
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function syncCardIdSex()
{
try {
User::whereNotNull("card_num")->where('is_approved', 1)->chunk(100, function ($users) {
foreach ($users as $user) {
if (strlen($user->card_num) != 18)
continue;
$sex = \CommonUtilsService::getSexByCard($user->card_num);
User::where('id', $user->id)->update(['sex' => $sex]);
if ($user->type == 'single') {
ProfileCourtship::where('user_id', $user->id)->update(['sex' => $sex]);
} else {
ProfileCourtship::where('user_id', $user->id)->update(['sex' => $sex]);
ProfileMarriage::where('user_id', $user->id)->update(['sex' => $sex]);
}
if ($user->sex != $sex)
SignActitityMember::dispatch($user->id)->onQueue('love');
}
});
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function dailySyncCardIdSexBirthday()
{
try {
User::whereNotNull("card_num")->where('is_approved', 1)->chunk(100, function ($users) {
foreach ($users as $user) {
$sex = \CommonUtilsService::getSexByCard($user->card_num);
if (empty($sex))
continue;
$result = \CommonUtilsService::checkCardBirhday($user->card_num);
if ($result['error'] == 2) {
$arr['birthday'] = $result['tdate'];
}
$arr['sex'] = $sex;
if ($user->sex != $sex)
User::where('id', $user->id)->update(['sex' => $sex]);
if ($user->type == 'single') {
ProfileCourtship::where('user_id', $user->id)->update($arr);
} else {
ProfileCourtship::where('user_id', $user->id)->update($arr);
ProfileMarriage::where('user_id', $user->id)->update($arr);
}
}
});
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 检查收益冻结(包括服务商和用户)
*/
public function checkEarningFrozen()
{
try {
MEarning::where('status', 'freezing')->orderBy('id', 'desc')->chunk(100, function ($earnings) {
try {
\DB::beginTransaction();
foreach ($earnings as $earning) {
//当前时间
$now_time = time();
//冻结时间
$earning_time = strtotime($earning->earning_time);
if ($now_time > $earning_time) {//解冻
//修改收益状态和冻结时间
$earning->status = "finished";
$earning->earning_time = date('Y-m-d H:i:s', $now_time);
$earning->save();
//修改收益账号
if ($earning->m_user_id) {
//用户账号
$account = MEarningAccount::firstOrCreate(['m_user_id' => $earning->m_user_id, 'm_id' => $earning->m_id]);
$account->decrement('frozen_earning', $earning->value);
$account->increment('balance', $earning->value);
} else {
//服务商账号
$account = MEarningAccount::firstOrCreate(['m_user_id' => 0, 'm_id' => $earning->m_id]);
$account->decrement('frozen_earning', $earning->value);
$account->increment('balance', $earning->value);
}
}
}
\DB::commit();
} catch (\Excepation $e) {
\DB::rollback();
$this->getError($e);
}
});
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 检查福恋收益冻结
*/
public function checkLoveEarningFrozen()
{
try {
Earning::where('status', 'freezing')->orderBy('id', 'desc')->chunk(100, function ($earnings) {
try {
\DB::beginTransaction();
foreach ($earnings as $earning) {
//当前时间
$now_time = time();
//冻结时间
$earning_time = strtotime($earning->earning_time);
if ($now_time > $earning_time) {//解冻
//修改收益状态和冻结时间
$earning->status = "finished";
$earning->earning_time = date('Y-m-d H:i:s', $now_time);
$earning->save();
//修改收益账号
if ($earning->m_user_id) {
//用户账号
$account = EarningAccount::firstOrCreate(['user_id' => $earning->user_id]);
$account->decrement('frozen_earning', $earning->value);
$account->increment('balance', $earning->value);
} else {
//服务商账号
$account = EarningAccount::firstOrCreate(['user_id' => $earning->user_id]);
$account->decrement('frozen_earning', $earning->value);
$account->increment('balance', $earning->value);
}
}
}
\DB::commit();
} catch (\Excepation $e) {
\DB::rollback();
$this->getError($e);
}
});
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 同步服务商咨询
*/
public function syncMerchatInformations()
{
AnchorArticle::whereDoesntHave('information')->whereNotNull('m_id')->chunk(100, function ($articles) {
foreach ($articles as $article) {
$info = new MerchantInformation();
$info->merchant_id = $article->m_id;
$info->title = $article->title;
$info->content = $article->content;
$info->pic = $article->cover;
$info->created_at = $article->publish_at;
$info->updated_at = $article->publish_at;
$info->save();
$article->information_id = $info->id;
$article->save();
}
});
}
/**
* 最近七天已支付订单 没有生成收益
* */
public function checkEarningOrder()
{
try {
$start_time = date('Y-m-d H:i:s', strtotime('-10 day'));
TouristOrder::whereDoesntHave('mEarning')->where('pay_type', 'wechat')
->where('type', 'not like', '%reward%')->where('type', '<>', 'transfer')
->where('price', '>', 0)->where('pay_type', '<>', 'free')
->where('channel', '<>', 6)->where('pay_status', 4)->whereNotNull('merchant_id')
->where('created_at', '>=', $start_time)->chunk(100, function ($orders) {
foreach ($orders as $order) {
Log::info('checkEarningOrder earning:order:ids ' . $order->id);
$redis = Redis::connection('big_data');
$redis->lpush('earning:order:ids', $order->id);
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function checkLoveEarningOrder()
{
try {
$start_time = date('Y-m-d H:i:s', strtotime('-7 day'));
Order::whereDoesntHave('earning')->where('type', 'rank')->where('price', '>', 0)->where('pay_type', '<>', 'free')->where('pay_status', 'PAID')->where('created_at', '>=', $start_time)->chunk(100, function ($orders) {
foreach ($orders as $order) {
$redis = Redis::connection('big_data');
$redis->lpush('love:earning:order:ids', $order->id);
SendEarningMessage::dispatch($order->id)->onQueue('love')->delay(now()->addMinutes(1));
}
});
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 同步用户活跃度
*/
public function syncDynamic()
{
try {
$start_time = date('Y-m-d H:i:s', strtotime('-1 month'));
$users = Dynamic::where('created_at', '>', $start_time)->groupby('user_id')->select('user_id', DB::raw('count(*) as month_dynamic'))->chunk(100, function ($users) {
foreach ($users as $user) {
ProfileCourtship::where('id', $user->user_id)->update(['month_dynamic' => $user->month_dynamic]);
}
});
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
// 商家生成月报告通知
public function generateMonthAnalyse()
{
try {
$standardTime = date('Y-m-1');
$monthStart = date("Y-m-1 00:00:00");
$lastMonthStart = date('Y-m-1 00:00:00', strtotime("-1 month", strtotime($standardTime)));
$lastMonthEnd = date('Y-m-d H:i:s', strtotime("-1 sec", strtotime($monthStart)));
$mch_ids = MerchantAccount::pluck('id');
$title = date('Y年m月', strtotime($lastMonthStart)) . '数据报告';
$arr = [];
foreach ($mch_ids as $value) {
$visit_count = AccessRecord::where('account_id', $value)->where('updated_at', '>=', $lastMonthStart)->where('updated_at', '<=', $lastMonthEnd)->count();
$add_count = AccessRecord::where('account_id', $value)->where('created_at', '>=', $lastMonthStart)->where('created_at', '<=', $lastMonthEnd)->count();
$order_count = TouristOrder::where('merchant_id', $value)->whereIn('pay_status', [1, 4])->where('created_at', '>=', $lastMonthStart)->where('created_at', '<=', $lastMonthEnd)->count();
$profit = MEarning::where('m_id', $value)->where('m_user_id', 0)->where('status', 'finished')->where('created_at', '>=', $lastMonthStart)->where('created_at', '<=', $lastMonthEnd)->sum('value');
$content = "上月累计访问用户数" . $visit_count . ",其中新用户数" . $add_count . ",总订单数为" . $order_count . ",共产生" . $profit . "元收益";
$insert = [
'm_id' => $value,
'm_user_id' => 0,
'type' => 'analyse',
'type_id' => 0,
'content' => json_encode(['title' => $title, 'content' => $content], true),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$arr[] = $insert;
}
SaasNotice::insert($arr);
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 每天访客(异性单身)通知
*/
public function visitorNotice()
{
try {
//每天有新访客的用户
DB::table('user_previews')->where('created_at', '>=', date('Y-m-d'))->where('status', 0)->groupby('user_id')->select('user_id')->orderBy('user_id', 'asc')->chunk(100, function ($pre_arr) {
foreach ($pre_arr as $pre) {
$user = User::where('id', $pre->user_id)->where('hidden_profile', 'NONE')->select('id', 'mobile', 'type', 'sex')->first();
if ($user && $user->type == 'single') {
//异性单身
$count = UserPreview::with('previewUser')->whereHas('previewUser', function ($sql) use ($user) {
$sql->where('type', 'single')->where('sex', '>', 0)->where('sex', '<>', $user->sex);
})->where('user_id', $user->id)->where('created_at', '>=', date('Y-m-d'))->where('status', 0)->count();
if ($count) {
$message = '有' . $count . '个人偷偷看了你哦,魅力在线的你,快来看看有没同频的人,点击 ufutx.cn/s/Ap5';
SendEasySms::dispatch(['mobile' => $user->mobile, 'message' => $message])->onQueue('love');
}
}
}
});
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 订单状态修改(结算)
*/
public function setOrderSettlement()
{
try {
TouristOrder::where('pay_status', 1)->chunk(100, function ($orders) {
foreach ($orders as $order) {
if ($order->type == 'transfer' || $order->type == 'reward_info' || $order->pay_type == "partner" || $order->price == 0 || $order->channel == 6) {
$order->update(['pay_status' => 4]);
continue;
}
$order->origin_type = $order->type;
//收益规则
if ($order->type == 'community') {
$order->type = ($order->activity) ? 'activity' : 'service';
}
//订单是否是服务市场订单
$is_market_service = MerchantService::where('merchant_id', $order->merchant_id)->where('type', $order->origin_type)->where('type_id', $order->type_id)->where('service_type', 1)->first() ? 1 : 0;
if ($is_market_service) {
$merchant_id = MarketService::where('type', $order->origin_type)->where('type_id', $order->type_id)->value('merchant_id');
} else {
$merchant_id = $order->merchant_id;
}
$earning_rule = MerchantInfo::where('m_id', $order->merchant_id)->value('earning_rule') ?: 'system';
if ($earning_rule == 'system') {
$rule = MEarningRules::where('m_id', $merchant_id)->where('name', $order->type)->where('type_id', $order->type_id)->first();
if (empty($rule)) {
$rule = MEarningRules::where('m_id', $merchant_id)->where('name', $order->type)->where('type_id', 0)->first();
}
} elseif ($earning_rule == 'grade') {
$rule = $this->earningAgentRule($order);
}
$rule_date = $rule && $rule->ratio ? $rule->forzen_time : 0;
$rule_time = $rule_date * 24 * 3600;
Log::info("setOrderSettlement 订单id$order->id");
if ($order->type == "activity") {
//是否到了活动结束时间
$end_time = $order->activity->end_time;
Log::info("setOrderSettlement 订单id$order->id end_time: " . (date("Y-m-d H:i:s", strtotime($end_time) + $rule_time)));
if (time() < strtotime($end_time) + $rule_time)
continue;
} else {
Log::info("setOrderSettlement 订单id$order->id end_time: " . (date("Y-m-d H:i:s", strtotime($order->created_at) + $rule_time)));
if (time() < strtotime($order->created_at) + $rule_time)
continue;
}
//修改订单状态
TouristOrder::where('id', $order->id)->update(['pay_status' => 4]);
//加入队列计算收益
Log::info("setOrderSettlement earning:order:ids " . $order->id);
$redis = Redis::connection('big_data');
$redis->lpush('earning:order:ids', $order->id);
}
});
} catch (\Exception $e) {
$this->getError($e);
}
}
public function earningAgentRule($order)
{
$last_user = MerchantUser::where('openid', $order->from_openid)->whereNotNull('openid')->first();
if (empty($last_user))
return null;
//用户等级比例
$grade_user = MEarningGradeUser::with('grade')->where('m_id', $order->merchant_id)->where('user_id', $last_user->id)->first();
if ($grade_user && $grade_user->grade) {
$grade = $grade_user->grade;
} else {
$price = TouristOrder::where('merchant_id', $order->merchant_id)->where("from_openid", $last_user->openid)->whereIn('pay_status', [1, 4])->where('id', '<', $order->id)->sum('price');
$grade = MEarningGrade::where('m_id', $order->merchant_id)->where('amount', '<=', $price)->orderBy('amount', 'desc')->first();
}
//更新等级
// $this->updateEarningAgent($order, $last_user);
return $grade;
}
/**
* 检查收益通知
*/
public function checkEarningNotice()
{
try {
while (true) {
$redis = Redis::connection('big_data');
$order_id = $redis->rpop('earning:notice:order:ids');
if (empty($order_id))
break;
$order = TouristOrder::find($order_id);
if (empty($order))
continue;
$m_user_ids = MEarning::where('m_order_id', $order->id)->where('m_user_id', '!=', 0)->where('value', '>', 0)->distinct('m_user_id')->pluck('m_user_id');
foreach ($m_user_ids as $m_user_id) {
$user = MerchantUser::where('id', $m_user_id)->first();
if (empty($user) || empty($user->mpUser))
continue;
$user_service = new UserService();
$mp_user = $user->mpUser;
\Log::info("收益通知用户id: " . $mp_user->id);
//系统通知
$path_url = 'https://love.ufutx.com/h5/#/guidePage';
$count = Notice::where('user_id', $mp_user->id)->where('type_id', $order->id)->where('path_url', $path_url)->count();
if ($count)
continue;
$user_service->sendNotice($mp_user->id, 1, 'system', '您有一笔分享收益', null, $order->id, $path_url, 2);
//公众号通知
if ($mp_user->wechat && $mp_user->wechat->official_openid) {
$name = $order->name;
if (empty($name)) {
$name = MerchantUser::where('id', $order->account_id)->value('nickname');
}
$mobile = $order->mobile;
if (empty($mobile) || $mobile == '未获取') {
$mobile = MerchantUser::where('id', $order->account_id)->value('mobile');
}
$first = '您推荐的用户【' . $name;
if ($mobile) {
$first = $first . ',' . substr_replace($mobile, '****', 3, 4);
}
$first = $first . '】而产生的订单收益已到账';
//收益金额
$amount = MEarning::where('m_user_id', $m_user_id)->where('m_order_id', $order->id)->sum('value');
$data['touser'] = $mp_user->wechat->official_openid;
$data['template_id'] = config('wechat.tpls.earning_notice');
$data['url'] = env('APP_URL') . '/auth/saas/earning/account';
$data['data'] = [
'first' => $first,
'keyword1' => '¥' . $amount,
'keyword2' => date('Y-m-d H:i:s'),
'remark' => '点击查看详情,现在去提现',
];
SendTemplateMsg::dispatch($data)->onQueue('template_message');
}
}
}
} catch (\Exception $e) {
$this->getError($e);
}
}
/**
* 检查推荐是否购买
*/
public function checkRecommendIsBuy()
{
try {
PortraitRecord::where('recommend_type', 'user')->where('pay_status', 0)->where('channel', '<>', 3)->chunk(100, function ($records) {
foreach ($records as $record) {
$type = $record->match_type;
if ($type == 'service' || $type == 'activity')
$type = 'community';
if ($record->channel == 0 || $record->channel == 1) {
$official_openid = Wechat::where('user_id', $record->user_id)->value('official_openid');
if (!$official_openid) {
$official_openid = Viewer::where('user_id', $record->user_id)->value('openid');
}
$from_official_openid = Wechat::where('user_id', $record->recommend_user_id)->value('official_openid');
if (!$from_official_openid) {
$from_official_openid = Viewer::where('user_id', $record->recommend_user_id)->value('openid');
}
$orders = TouristOrder::where('open_id', $official_openid)->where('from_openid', $from_official_openid)->where('type', $type)->where('type_id', $record->match_type_id)->get();
} else {//小程序
$mp_openid = Wechat::where('user_id', $record->user_id)->value('openid');
$from_mp_openid = Wechat::where('user_id', $record->recommend_user_id)->value('openid');
$orders = TouristOrder::where('open_id', $mp_openid)->where('from_openid', $from_mp_openid)->where('type', $type)->where('type_id', $record->match_type_id)->get();
}
foreach ($orders as $order) {
if ($order->pay_status == 0 || $order->pay_status == 3)
continue;
if ($order->pay_status == 1 || $order->pay_status == 4)
$record->update(['pay_status' => 1]);
}
}
});
} catch (\Exception $e) {
$this->getError($e);
}
}
//根据福恋用户id 匹配saas用户id
public function matchMerchantUser($user_id)
{
$m_user = MerchantUser::where('user_id', $user_id)->first();
if ($m_user) {
return $m_user->id;
}
$openid = Wechat::where('user_id', $user_id)->value('official_openid');
if ($openid) {
$m_user = MerchantUser::where('openid', $openid)->first();
if ($m_user) {
return $m_user->id;
}
}
$openid = Viewer::where('user_id', $user_id)->value('openid');
if ($openid) {
$m_user = MerchantUser::where('openid', $openid)->first();
if ($m_user) {
return $m_user->id;
}
}
$user = User::find($user_id);
$m_user = MerchantUser::where('uuid', $user->uuid)->first();
if ($m_user) {
return $m_user->id;
}
$unionid = Wechat::where('user_id', $user_id)->value('unionid');
if ($unionid) {
$m_user = MerchantUser::where('unionid', $unionid)->first();
if ($m_user) {
return $m_user->id;
}
}
return 0;
}
//根据saas用户id 匹配福恋用户id
public function matchFulinkUser($m_user_id)
{
$m_user = MerchantUser::where('id', $m_user_id)->first();
if ($m_user && $m_user->user_id) {
return $m_user->user_id;
}
$wechat_user_id = Wechat::where('official_openid', $m_user->openid)->value('user_id');
if ($wechat_user_id) {
return $wechat_user_id;
}
$wechat_user_id = Wechat::where('unionid', $m_user->unionid)->value('user_id');
if ($wechat_user_id) {
return $wechat_user_id;
}
$viewer_user_id = Viewer::where('openid', $m_user_id)->value('user_id');
if ($viewer_user_id) {
return $viewer_user_id;
}
$wechat_user_id = Wechat::where('unionid', $m_user->unionid)->value('user_id');
if ($wechat_user_id) {
return $wechat_user_id;
}
$user_id = User::where('mobile', $m_user->mobile)->value('id');
if ($user_id) {
return $user_id;
}
return 0;
}
/**
* 同步saas用户和福恋用户的用户画像
*/
public function synUserPortrait()
{
try {
\Log::info('同步saas用户和福恋用户的用户画像');
$logs = Portrait::where('user_id', '<>', 0)->where('m_user_id', 0)->select('id', 'user_id', 'm_user_id', 'created_at', 'updated_at')->get();
foreach ($logs as $key => $log) {
$m_user_id = $this->matchMerchantUser($log->user_id);
if ($m_user_id == 0)
continue;
$log->update(['m_user_id' => $m_user_id]);
}
$histories = Portrait::where('user_id', 0)->where('m_user_id', '<>', 0)->select('id', 'user_id', 'm_user_id', 'created_at', 'updated_at')->get();
foreach ($histories as $key => $history) {
$user_id = $this->matchFulinkUser($history->m_user_id);
if ($user_id == 0)
continue;
$history->update(['user_id' => $user_id]);
}
} catch (\Exception $e) {
$this->getError($e);
}
}
public function syncServicesPv()
{
try {
//测评
MerchantEvaluate::chunk(100, function ($items) {
foreach ($items as $value) {
$pv = Redis::zscore('evaluate', $value->test_item_id);
if ($pv) {
MerchantEvaluate::where('id', $value->id)->update(['pv' => $pv]);
}
}
});
//咨询
Consultation::chunk(100, function ($items) {
foreach ($items as $value) {
$pv = Redis::zscore('consulation', $value->id);
if ($pv) {
Consultation::where('id', $value->id)->update(['pv' => $pv]);
}
}
});
//课程
Course::chunk(100, function ($items) {
foreach ($items as $value) {
$pv = Redis::zscore('coursepv', $value->id);
if ($pv) {
Course::where('id', $value->id)->update(['pv' => $pv]);
}
}
});
//店铺
MerchantShop::chunk(100, function ($items) {
foreach ($items as $value) {
$pv = Redis::zscore('shop', $value->id);
if ($pv) {
MerchantShop::where('id', $value->id)->update(['pv' => $pv]);
}
}
});
//资讯
MerchantInformation::chunk(100, function ($items) {
foreach ($items as $value) {
$pv = Redis::zscore('information', $value->id);
if ($pv) {
MerchantInformation::where('id', $value->id)->update(['pv' => $pv]);
}
}
});
//视频
AnchorVideo::chunk(100, function ($items) {
foreach ($items as $value) {
$pv = Redis::zscore('short_videopv', $value->id);
if ($pv) {
AnchorVideo::where('id', $value->id)->update(['pv' => $pv]);
}
}
});
//测试
QATest::chunk(100, function ($items) {
foreach ($items as $value) {
$pv = Redis::zscore('testpv', $value->id);
if ($pv) {
QATest::where('id', $value->id)->update(['pv' => $pv]);
}
}
});
} catch (\Exception $e) {
$this->getError($e);
}
}
public function getRefundTradeNo()
{
$dateline = time();
$mix_1 = rand(100, 999);
$mix_2 = rand(10, 99);
return 'r' . $dateline . $mix_1 . $mix_2;
}
//检测拼团失败 退款并通知
public function checkGroupRefund()
{
try {
$time = date('Y-m-d H:i:s');
//已支付 但是没有拼团成功的拼单 记录
$histories = CollageGroupHistories::with('tOrder')->whereHas('tOrder', function ($sql) {
$sql->whereIn('pay_status', [1, 4]);
})->where('status', 0)->where('deadline', '<', $time)->get();
foreach ($histories as $key => $history) {
$group = CollageGroup::find($history->group_id)->first();
if ($group->type == 'community') {
$activity = CommunityActivity::find($group->type_id);
if ($activity->class == 'one' && $activity->start_time > $time)
// 活动已开始 不退款
continue;
}
DB::beginTransaction();
if ($history->tOrder->pay_status == 4) {
//检测该笔订单是否生成收益记录
$log = MEarning::where('m_order_id', $history->tOrder->id)->first();
if ($log) {
$earning = MEarningAccount::where('m_id', $history->tOrder->merchant_id)->where('m_user_id', 0)->first();
//已产生收益 余额充足(扣除余额)
if ($earning && $earning->balance >= $history->tOrder->price && $earning->total_value >= $history->tOrder->price) {
$earning->decrement('balance', $history->tOrder->price);
$earning->decrement('total_value', $history->tOrder->price);
} else {
$merchant_name = Anchor::where('m_id', $history->tOrder->merchant_id)->value('name');
$message = '用户拼团失败,商家:' . $merchant_name . '余额不足以发起退款';
$this->sentMessage(18171893605, $message);
break;
}
}
}
$refund_trade_no = $this->getRefundTradeNo();
$array = ['refund_desc' => '拼团订单失败,原路退款'];
$result = \WechatService::orderRefund($history->tOrder->trade_no, $refund_trade_no, $history->tOrder->price, $history->tOrder->price, $array);
$refund = MRefundOrder::create([
'm_id' => $history->tOrder->merchant_id,
'm_user_id' => $history->tOrder->account_id,
'type' => $history->tOrder->type,
'trade_no' => $history->tOrder->trade_no,
'refund_trade_no' => $refund_trade_no,
'total_fee' => $history->tOrder->price,
'refund_fee' => $history->tOrder->price,
'is_hook' => 0,
'remark' => '拼团订单失败,原路退款',
]);
if (is_array($result) && $result['status'] === true) {//退款成功
$history->tOrder->update(['pay_status' => 3]);
$history->update(['status' => 2]);
$refund->update(['is_hook' => 1]);
$type = $this->getOrderType($history->tOrder);
\CommonUtilsService::groupRefundNotice($history->tOrder, $history->tOrder->price, $type);
}
DB::commit();
}
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
}
}
public function getOrderType($order)
{
switch ($order->type) {
case 'consult':
$result = '咨询';
break;
case 'shop':
$result = '商品';
break;
case 'community':
$class = CommunityActivity::where('id', $order->type_id)->value('class');
$result = $class == 'many' ? '服务' : '活动';
break;
case 'course':
$result = '课程';
break;
case 'evaluate':
$result = '测评';
break;
default:
$result = '系统';
break;
}
return $result;
}
public function sendOrderSurvey()
{
try {
while (true) {
$order_id = Redis::rpop('survey:order:ids');
if (empty($order_id))
break;
$order = TouristOrder::find($order_id);
if (empty($order))
continue;
$activity = CommunityActivity::where('id', $order->type_id)->first();
$class = $activity->class;
$type = ($class == 'one') ? 'activity' : 'service';
$log = Questionnaire::where('type', $type)->where('type_id', $order->type_id)->first();
if (empty($log))
continue;
$jump_url = urlencode(env('APP_URL') . '/pu/#/questionnaireV2/' . $log->id);
$share_url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $order->account_id . '&url=' . $jump_url;
//模板通知
if ($order->channel == 0 || $order->channel == 1) {
$openid = $order->open_id;
} else {
$openid = Wechat::where('openid', $order->openid)->value('official_openid');
}
if ($openid) {
$data['touser'] = $openid;
$data['template_id'] = config('wechat.tpls.survey_notice');
$data['url'] = $share_url;
$data['data'] = [
'first' => '您好,问卷调查已经接收成功',
'keyword1' => '关于' . $activity->title . '问卷调查',
'keyword2' => date('Y-m-d H:i:s'),
'keyword3' => date('Y-m-d H:i:s', strtotime('+ 7 days')),
'remark' => '点击查看问卷调查内容',
];
SendTemplateMsg::dispatch($data)->onQueue('love');
}
}
} catch (\Exception $e) {
$this->getError($e);
}
}
public function operateNotice()
{
try {
//今天需要跟进的角色
$today_role_ids = ServiceOrderOperation::whereHas('reminds', function ($sql) {
$sql->where('remind_date', date('Y-m-d'));
})->whereDoesntHave('remarks', function ($sql) {
$sql->where('remind_date', date('Y-m-d'));
})->where('status', 0)->pluck('order_role_id')->toArray();
//今天需要跟进的管理员
$admin_ids1 = ServiceRoleAdmin::whereIn('order_role_id', $today_role_ids)->distinct('admin_id')->pluck('admin_id')->toArray();
//明天需要跟进的角色
$tomorrow_role_ids = ServiceOrderOperation::whereHas('reminds', function ($sql) {
$sql->where('remind_date', date('Y-m-d', strtotime('+1 day')));
})->whereDoesntHave('remarks', function ($sql) {
$sql->where('remind_date', date('Y-m-d', strtotime('+1 day')));
})->where('status', 0)->pluck('order_role_id')->toArray();
$admin_ids2 = ServiceRoleAdmin::whereIn('order_role_id', $tomorrow_role_ids)->distinct('admin_id')->pluck('admin_id')->toArray();
$admin_ids = array_unique(array_merge($admin_ids1, $admin_ids2));
foreach ($admin_ids as $admin_id) {
$today_operate_count = ServiceOrderOperation::whereHas('reminds', function ($sql) {
$sql->where('remind_date', date('Y-m-d'));
})->whereDoesntHave('remarks', function ($sql) {
$sql->where('remind_date', date('Y-m-d'));
})->whereHas('role.admins', function ($sql) use ($admin_id) {
$sql->where('admin_id', $admin_id);
})->where('status', 0)->count();
$tomorrow_operate_count = ServiceOrderOperation::whereHas('reminds', function ($sql) {
$sql->where('remind_date', date('Y-m-d', strtotime('+1 day')));
})->whereDoesntHave('remarks', function ($sql) {
$sql->where('remind_date', date('Y-m-d', strtotime('+1 day')));
})->whereHas('role.admins', function ($sql) use ($admin_id) {
$sql->where('admin_id', $admin_id);
})->where('status', 0)->count();
if (!$today_operate_count && !$tomorrow_operate_count)
continue;
if ($today_operate_count) {
$title = "今日需要完成" . $today_operate_count . '条职责';
}
if ($tomorrow_operate_count) {
$other_title = '明日需要完成' . $tomorrow_operate_count . '条职责';
$title = $today_operate_count ? $title . ',' . $other_title : $other_title;
}
//模板消息提醒
$openid = null;
if ($admin_id) {
$openid = MerchantMembers::where('admin_id', $admin_id)->whereNotNull("notice_openid")->value('notice_openid');
}
if ($openid) {
$data['touser'] = $openid;
$data['template_id'] = config('wechat.tpls.role_operate_notice');
$data['url'] = '';
$data['data'] = [
'first' => '您好,服务流程职责提醒',
'keyword1' => '服务流程跟进',
'keyword2' => $title,
'remark' => '请进入服务商后台管理查看详情',
];
SendTemplateMsg::dispatch($data)->onQueue('love');
}
}
} catch (\Exception $e) {
$this->getError($e);
}
}
public function storeAdminNoticeUrl()
{
try {
MerchantMembers::whereNull('notice_bind_url')->chunk(100, function ($members) {
foreach ($members as $member) {
$url = config('app.url') . '/bind/merchants/' . $member->mch_id . '/admins/' . $member->admin_id . '/notice/openid';
$qrcode = $this->getUrlqrcode($url);
MerchantMembers::where('id', $member->id)->update(['notice_bind_url' => $qrcode]);
}
});
MerchantAccount::whereNull('notice_bind_url')->chunk(100, function ($accounts) {
foreach ($accounts as $account) {
$url = config('app.url') . '/bind/merchants/' . $account->id . '/admins/0/notice/openid';
$qrcode = $this->getUrlqrcode($url);
MerchantAccount::where('id', $account->id)->update(['notice_bind_url' => $qrcode]);
}
});
} catch (\Exception $e) {
$this->getError($e);
}
}
public function getUrlqrcode($url, $size = 300)
{
$name = mb_substr($url, stripos($url, 'community'));
$name = str_replace('/', '-', $name);
$name = base64_encode($name);
$path = storage_path("qrcode/$name.png");
QrCode::format('png')->margin(1)->size($size)->generate($url, $path);
$pic = $this->uploadFile($path);
try {
unlink($path);
} catch (\Exception $e) {
$this->getError($e);
}
return $pic;
}
//即将到截止时间拼团订单(截止前半小时) 自动成团
public function autoFinishGroup()
{
$histories = CollageGroupHistories::with('tOrder')->whereHas('tOrder', function ($sql) {
$sql->whereIn('pay_status', [1, 4]);
})
->where('is_initiator', 1)->where('status', 0)
->select('id', 'group_id', 'm_order_id', 'deadline')
->get();
$auto_ids = [];//需要自动成团的id
foreach ($histories as $key => $history) {
$deadline1 = strtotime($history->deadline);//截止时间时间戳
$deadline2 = strtotime(date('Y-m-d H:i:s'));//当前时间时间戳
if ($deadline1 - $deadline2 < 1800) {
$auto_ids[] = $history->id;
}
}
if (empty($auto_ids))
return;
foreach ($auto_ids as $key => $value) {
try {
DB::beginTransaction();
$history = CollageGroupHistories::where('id', $value)->first();
$group = CollageGroup::where('id', $history->group_id)->first();
$count = CollageGroupBatch::where('batch', $history->id)->get()->count();//当前几人
$need_count = $group->require_num - $count;//需要几人
$insert = [];
for ($i = 0; $i < $need_count; $i++) {
$insert_sub = [
'history_id' => 0,//0为虚拟用户
'batch' => $history->id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$insert[] = $insert_sub;
}
//插入虚拟用户
if (!empty($insert))
CollageGroupBatch::insert($insert);
//拼团成功
$history_ids = CollageGroupBatch::where('batch', $history->id)->where('history_id', '<>', 0)->pluck('history_id');
CollageGroupHistories::whereIn('id', $history_ids)->update(['status' => 1]);
switch ($group->type) {
case 'course':
$order = TouristOrder::find($history->m_order_id);
UserCourses::where('course_id', $group->type_id)->where('trade_no', $order->trade_no)
->where('merchant_user_id', $history->m_user_id)->update(['status' => 1]);
break;
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
return;
}
//本次拼团成功(给所有拼团人员发)
$m_order_ids = CollageGroupHistories::whereIn('id', $history_ids)->pluck('m_order_id')->toArray();
$notice_users = TouristOrder::whereIn('id', $m_order_ids)->whereIn('pay_status', [1, 4])->get();
foreach ($notice_users as $notice_user) {
if ($group->type == 'course') {
switch ($notice_user->channel) {
case "福恋小程序":
$param = $this->getMpGroupParams($notice_user, $group, $history->deadline, 1);
\WechatService::sendJoinGroupNotice($param);
break;
case "商家":
$jump_url = urlencode(env('APP_URL') . '/pu/#/courseDetail/' . $group->type_id);
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $notice_user->merchant_id .
'&anchor_openid=&url=' . $jump_url;
$first = "您的课程拼团订单已成功拼团!";
$param = [
'touser' => $order->open_id,
'template_id' => config('wechat.tpls.buy_success_notice'),
'url' => $url,
'data' => [
'first' => $first,
'keyword1' => $order->desc,
'keyword2' => $order->trade_no,
'keyword3' => "" . $order->price,
'keyword4' => $order->created_at->toDateTimeString(),
'remark' => '点击详情可查看课程',
]
];
//通知用户
SendTemplateMsg::dispatch($param)->onQueue("love");
break;
}
}
}
}
}
public function getMpGroupParams($order, $group, $deadline, $status = 0)
{
$history_id = CollageGroupHistories::where('m_order_id', $order->id)->value('id');
$param['openid'] = $order->open_id;
$param['order_id'] = $order->id;
$param['title'] = mb_substr($order->desc, 0, 8) . '..';
$param['price'] = $order->price . '元';
$param['num'] = $group->require_num . '人';
$param['deadline'] = $deadline;
//发送给团员的温馨提示
$param['team_desc'] = '您已成功参与拼团,具体拼团成败请留意通知';
//发送给团张的温馨提示
$param['lead_desc'] = '本团有效期为' . $group->expire_in . '小时 赶紧邀请好友来拼团吧';
$param['desc'] = '恭喜你,本次拼团已成功';
$param['status'] = $status;
$param['history_id'] = $history_id;
return $param;
}
public function getSaasGroupParams($order, $group, $deadline, $status = 0)
{
$history_id = CollageGroupHistories::where('m_order_id', $order->id)->value('id');
$param['openid'] = $order->open_id;
$param['order_id'] = $order->id;
$param['title'] = mb_substr($order->desc, 0, 8) . '..';
$param['price'] = $order->price . '元';
$param['num'] = $group->require_num . '人';
$param['deadline'] = $deadline;
//发送给团员的温馨提示
$param['team_desc'] = '您已成功参与拼团,具体拼团成败请留意通知';
//发送给团张的温馨提示
$param['lead_desc'] = '本团有效期为' . $group->expire_in . '小时 赶紧邀请好友来拼团吧';
$param['desc'] = '恭喜你,本次拼团已成功';
$param['status'] = $status;
$param['history_id'] = $history_id;
return $param;
}
public function startMessageNotice()
{
try {
$start_time = date('Y-m-d H:i', strtotime('-10 minute'));
$other_user_ids = ChatMessage::where('status', 0)->where('created_at', '>', $start_time)->distinct('other_user_id')->pluck('other_user_id');
foreach ($other_user_ids as $other_user_id) {
$other_user = User::find($other_user_id);
if (empty($other_user))
continue;
$users = ChatMessage::with('user')->where('other_user_id', $other_user_id)->where('status', 0)->where('created_at', '>', $start_time)->groupBy('user_id')->limit(3)->get();
$name = '';
if (isset($users[0]['user']['nickname'])) {
$name = $name . $users[0]['user']['nickname'];
}
if (isset($users[1]['user']['nickname'])) {
$name = $name . ', ' . $users[1]['user']['nickname'];
}
if (isset($users[2]['user']['nickname'])) {
$name = $name . '等';
}
$data['touser'] = $other_user->wechat ? $other_user->wechat->official_openid : null;
$data['template_id'] = config('wechat.tpls.start_message_notice');
// $data['template_id'] = '5ax0Q1o71701F1efuMBvdR5FfQNebuQyv0j11p-iPgw';
$data['url'] = '';
$data['miniprogram'] = [
'appid' => config('wechat.mini_program.app_id'),
'pagepath' => '/pages/tabBar/news'
];
// $ta = $user->sex == 1?'他':"她";
$data['data'] = [
'first' => 'Hi, Ta在找你',
'keyword1' => date('Y-m-d H:i:s'),
'keyword2' => $name,
'remark' => '本通知可在福恋小程序 我的-设置 中关闭。',
];
SendTemplateMsg::dispatch($data)->onQueue('start_message');
}
} catch (\Exception $e) {
$this->getError($e);
}
}
public function homeRecommendUser()
{
try {
$links = DB::table('recommend_linking_news as rln')->groupBy('id_users_left')->selectRaw('id_users_left as user_id, count(*) as count');
DB::table('users as u')->joinSub($links, 'ufutx_l', function ($join) {
$join->on('l.user_id', '=', 'u.id');
})
->where('l.count', '>', 1)
->where(['u.type' => 'single', 'u.hidden_profile' => 'NONE'])
->where("u.id", 58859)
->select('l.*', 'u.nickname', 'u.id', 'u.sex')->orderBy('u.id', 'desc')->chunk(100, function ($users) {
foreach ($users as $user) {
$start_time = date('Y-m-d 12:00:00');
$end_time = date('Y-m-d 12:00:00', strtotime('+1 day'));
$now_time = date('Y-m-d H:i:s');
//是否查看最新的
$is_preview = RecommendUser::where("user_id", $user->id)->orderBy('start_time', 'desc')->value('is_preview');
if (empty($is_preview)) {
//更新时间
RecommendUser::where("user_id", $user->id)->where('is_preview', 0)->update(['start_time' => $start_time, 'end_time' => $end_time]);
continue;
}
//拉黑用户
$black_ids = (new LinkingBlacklist())->getBlackIds($user->id);
$links = $this->maxScoreRecommendUsers($user, $black_ids);
$black_ids = array_merge($black_ids, User::FULLLINKIDS);
if (count($links) == 0) {
// RecommendUser::where("user_id", $user->id)->delete();
// $links = $this->maxScoreRecommendUsers($user,$black_ids);
// if (count($links) < 7) {
// $recommend_users = DB::table('users as u')->rightJoin('area_users as au', 'au.user_id', '=', 'u.id')
// ->leftJoin('profile_courtships as pc', 'pc.user_id', 'u.id')
// ->whereNotIn('au.user_id',$black_ids)
// ->where('au.area_id', 43)->where('au.is_audited', 1)->where("u.sex", '<>', $user->sex)->where('hidden_profile', 'NONE')->orderBy('au.created_at', 'desc')->select('u.id','u.photo', 'u.nickname','u.rank_id','u.is_approved', 'is_real_approved', 'pc.city','pc.birthday', 'pc.stature','u.industry', 'u.industry_sub', 'pc.interest_hobby' , 'pc.degree')->limit(7)->get();
$start_birthday = date('Y-m-d', strtotime($user->profileCourtship->birthday) - 5 * 365 * 24 * 60 * 60);
$end_birthday = date('Y-m-d', strtotime($user->profileCourtship->birthday) + 5 * 365 * 24 * 60 * 60);
$recommend_user_ids = RecommendUser::where("user_id", $user->id)->pluck('other_user_id')->toArray();
$recommend_users = DB::table('users as u')
->leftJoin('profile_courtships as pc', 'pc.user_id', '=', 'u.id')
// ->leftJoin("recommend_linking_news as rl", 'rl.id_users_right', '=','u.id')
// ->leftJoin('recommend_users as ru', 'ru.other_user_id','=', 'u.id')
->where("u.sex", '<>', $user->sex)
->whereNotNull('u.photo')
->where('u.is_approved', 1)
->where('u.hidden_profile', 'NONE')
->where("u.is_approved", 1)
->whereNotIn('u.id', $black_ids)
->where('u.type', 'single')
->where("u.belief", $user->belief)
->where("pc.state", ["从未结婚", "未婚"])
->where('pc.negative_score', '<>', 200)
// ->where('rl.id_users_left', $user->id)
->whereNotIn('u.id', $recommend_user_ids)
->where("pc.birthday", '>', $start_birthday)
->where('pc.birthday', '<', $end_birthday)
->select('u.id', 'u.photo', 'u.nickname', 'u.rank_id', 'u.is_approved', 'u.is_real_approved', 'pc.city', 'pc.birthday', 'pc.stature', 'u.industry', 'u.industry_sub', 'pc.interest_hobby', 'pc.introduction', 'pc.degree')
->limit(7)->get();
$data = [];
foreach ($recommend_users as $recommend_user) {
$data[] = ['user_id' => $user->id, 'other_user_id' => $recommend_user->id, 'start_time' => $start_time, 'end_time' => $end_time, 'is_preview' => 0, 'created_at' => $now_time, 'updated_at' => $now_time];
}
RecommendUser::insert($data);
}
// }
}
});
} catch (\Exception $e) {
$this->getError($e);
}
}
public function maxScoreRecommendUsers($user, $black_ids)
{
$start_time = date('Y-m-d 12:00:00');
$end_time = date('Y-m-d 12:00:00', strtotime('+1 day'));
$now_time = date('Y-m-d H:i:s');
$links = DB::table('recommend_linking_news as rln')->whereNotExists(function ($sql) use ($user) {
$sql->select(DB::raw(1))->from('recommend_users as ru')->whereRaw('ufutx_ru.other_user_id = ufutx_rln.id_users_right ')->where('ru.user_id', $user->id);
})
->leftJoin('users as u', 'u.id', '=', 'rln.id_users_right')
->where('u.hidden_profile', 'NONE')
->where('u.type', 'single')
->whereNotNull('u.photo')
->where('id_users_left', $user->id)->whereNotIn('id_users_right', $black_ids)->orderBy('rln.score', 'desc')->limit(7)->get();
if (count($links) == 7) {
$data = [];
foreach ($links as $link) {
$data[] = ['user_id' => $link->id_users_left, 'other_user_id' => $link->id_users_right, 'is_preview' => 0, 'start_time' => $start_time, 'end_time' => $end_time, 'created_at' => $now_time, 'updated_at' => $now_time];
}
RecommendUser::insert($data);
}
return $links;
}
//自动分区推荐
public function areaUserBySetting()
{
//获取所有要自动跑的分区
try {
$result = ClassAreaSetting::where('status', 1)->get();
$full_user_ids = StaffUser::pluck("user_id")->toArray();
$black_user_ids = SystemBlacklist::pluck('user_id')->toArray();
foreach ($result as $key => $value) {
$has_in_ids = AreaUser::where('area_id', $value->class_id)->where('is_show', 1)->where('is_audited', 1)->pluck('user_id')->toArray();
//屏蔽人员id
$has_in_ids = array_unique(array_merge($full_user_ids, $black_user_ids, $has_in_ids));
$users = DB::table('users as u')
->leftJoin('profile_courtships as pc', 'u.id', '=', 'pc.user_id')->whereNotNull('pc.user_id')
->select('u.id', 'u.nickname', 'u.photo', 'u.rank_id', 'u.belief', 'u.is_real_approved', 'u.hidden_profile', 'pc.user_id', 'pc.province', 'pc.city', 'pc.birthday', 'pc.degree', 'pc.introduction', 'pc.ideal_mate', 'pc.stature', DB::raw('char_length(introduction) as introduction_words'), DB::raw('char_length(ideal_mate) as ideal_mate_words'));
if ($value->min_birth && $value->max_birth) {
$users = $users->whereBetween('birthday', [$value->min_birth, $value->max_birth]);
}
if ($value->is_vip) {
$op = $value->is_vip == 1 ? '>' : '=';
$users = $users->where('u.rank_id', $op, 0);
}
if ($value->is_real_approved) {
$op = $value->is_real_approved == 1 ? '=' : '<>';
$users = $users->where('u.is_real_approved', $op, 1);
}
if ($value->belief) {
$belief = $value->belief == 1 ? '基督教' : '佛教';
$users = $users->where('u.belief', $belief);
}
if ($value->introduction_num) {
$users = $users->whereRaw('char_length(introduction) >= ' . $value->introduction_num);
}
if ($value->ideal_mate_num) {
$users = $users->whereRaw('char_length(ideal_mate) >= ' . $value->ideal_mate_num);
}
if ($value->province) {
$users = $users->where('pc.province', $value->province);
}
if ($value->city) {
$users = $users->where('pc.city', $value->city);
}
if ($value->min_degree || $value->max_degree) {
if ($value->min_degree && !in_array($value->min_degree, [1, 2, 3, 4]))
throw new \Exception('自动化专区,学历参数有误:' . $value->min_degree);
if ($value->max_degree && !in_array($value->max_degree, [1, 2, 3, 4]))
throw new \Exception('自动化专区,学历参数有误:' . $value->max_degree);
$result = $this->degreeSort($value->min_degree, $value->max_degree);
$users = $users->whereIn('pc.degree', $result);
}
if ($value->state) {
$users = $users->where('u.type', '=', $value->state);
}
if ($value->min_stature) {
$users = $users->where('pc.stature', '>=', $value->min_stature);
}
if ($value->max_stature) {
$users = $users->where('pc.stature', '<=', $value->max_stature);
}
if ($value->photo_num) {
$photo_user_ids = ProfilePhoto::selectRaw('count(id) as photo_count,user_id')->groupBy('user_id')->having('photo_count', '>=', $value->photo_num)->pluck('user_id')->toArray();
$users = $users->whereIn('u.id', $photo_user_ids);
}
if ($value->last_visit) {
$time = date("Y-m-d", strtotime("-" . ($value->last_visit) . " month"));
$users = $users->where("u.last_visit", ">", $time);
}
$users = $users->where('is_photo_audited', 1)->where('u.hidden_profile', 'NONE')->where('u.negative_score', '<', 200)->whereNotNull('u.photo')->whereNull('u.deleted_at')->whereNotIn('u.id', $has_in_ids)->orderBy('u.id', 'desc')->chunk(100, function ($users) use ($value) {
DB::beginTransaction();
// 该用户是否在此专区
//1在 变成通过 2.不在 加入分区
$insert = [];
foreach ($users as $key => $user) {
$exist = AreaUser::where('area_id', $value->class_id)->where('user_id', $user->id)->first();
if ($exist) {
$exist->update(['is_show' => 1, 'is_audited' => 1, 'is_apply' => 2]);
continue;
}
$insert_sub = ['user_id' => $user->id, 'area_id' => $value->class_id, 'is_show' => 1, 'is_audited' => 1, 'is_apply' => 2, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'),];
$insert[] = $insert_sub;
}
if (!empty($insert))
AreaUser::insert($insert);
DB::commit();
});
}
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
}
}
public function degreeSort($min_degree = null, $max_degree = null)
{
$degree_arr = ['专科', '本科', '硕士', '博士'];
$need_arr = [];
if (empty($min_degree) && empty($max_degree)) {
return $need_arr;
} elseif (empty($min_degree) && !empty($max_degree)) {
foreach ($degree_arr as $key => $value) {
$need_arr[] = $value;
if ($max_degree == $key + 1)
return $need_arr;
}
} elseif (!empty($min_degree) && empty($max_degree)) {
foreach ($degree_arr as $key => $value) {
$need_arr[] = $value;
if ($min_degree == $key + 1)
return $need_arr;
}
} elseif (!empty($min_degree) && !empty($max_degree) && $min_degree != $max_degree) {
foreach ($degree_arr as $key => $value) {//23 12
if ($min_degree > ($key + 1))
continue;
$need_arr[] = $value;
if ($max_degree == $key + 1)
return $need_arr;
}
} else {//最低学历最高学历相等
$need_arr[] = $degree_arr[$min_degree - 1];
return $need_arr;
}
}
// 不符合专区设置条件自动踢出
public function checkAreaUsers()
{
try {
$full_user_ids = StaffUser::pluck("user_id")->toArray();
$black_user_ids = SystemBlacklist::pluck('user_id')->toArray();
$out_user_ids = array_merge($full_user_ids, $black_user_ids);
$settings = ClassAreaSetting::where('status', 1)->get();
foreach ($settings as $key => $value) {
$del_user_id = [];//不符合条件的用户id
$area_users = AreaUser::where('area_id', $value->class_id)->where('is_audited', 1)->get();
foreach ($area_users as $key => $area_user) {
if (empty($area_user->user)) {
$del_user_id[] = $area_user->user_id;
continue;
}
if (in_array($area_user->user_id, $out_user_ids)) {
$del_user_id[] = $area_user->user_id;
continue;
}
if (empty($area_user->user->profileCourtship)) {
$del_user_id[] = $area_user->user_id;
continue;
}
$user = $area_user->user;
if ($user->is_photo_audited != 1) {//头像没认证移除
$del_user_id[] = $area_user->user_id;
continue;
}
$profile = $area_user->user->profileCourtship;
if ($value->min_birth && $value->max_birth) {//出生
$time = strtotime($profile->birthday);
$time1 = strtotime($value->min_birth);
$time2 = strtotime($value->max_birth);
if ($time < $time1 || $time > $time2) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->is_vip && $value->is_vip == 1) {//会员
if ($user->rank_id == 0) {
$del_user_id[] = $area_user->user_id;
continue;
}
} elseif ($value->is_vip && $value->is_vip == 2) {
if ($user->rank_id > 0) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->is_real_approved && $value->is_real_approved == 1) {//真人认证
if ($user->is_real_approved != 1) {
$del_user_id[] = $area_user->user_id;
continue;
}
} elseif ($value->is_real_approved && $value->is_real_approved == 2) {
if ($user->is_real_approved == 1) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->belief && $value->belief == 1) {//信仰
if ($user->belief != '基督教') {
$del_user_id[] = $area_user->user_id;
continue;
}
} elseif ($value->belief && $value->belief == 2) {
if ($user->belief != '佛教') {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->min_degree || $value->max_degree) {
$degree_arr = $this->degreeSort($value->min_degree, $value->max_degree);
if (!in_array($profile->degree, $degree_arr)) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->min_stature) {
if ($profile->stature < $value->min_stature) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->max_stature) {
if ($profile->stature > $value->max_stature) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->province) {
if ($profile->province != $value->province) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->city) {
if ($profile->city != $value->city) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->state) {
if ($user->type != $value->state) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->introduction_num) {
if (mb_strlen($profile->introduction) < $value->introduction_num) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->ideal_mate_num) {
if (mb_strlen($profile->ideal_mate) < $value->ideal_mate_num) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
if ($value->photo_num) {//生活照
$photo_num = $user->profilePhoto()->count();
if ($photo_num < $value->photo_num) {
$del_user_id[] = $area_user->user_id;
continue;
}
}
}
DB::beginTransaction();
AreaUser::where('area_id', $value->class_id)->whereIn('user_id', $del_user_id)->delete();
DB::commit();
}
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
}
}
public function initUserScore()
{
try {
set_time_limit(0);
$users = DB::table('users as u')
->leftJoin('recommend_linking_news as n', 'u.id', '=', 'n.id_users_left')
->leftJoin('profile_courtships as c', 'u.id', '=', 'c.user_id')
->leftJoin('system_blacklists as b', 'u.id', '=', 'b.user_id')
->whereNull('n.id')->whereNull('b.id')
->where('u.type', 'single')->where('u.hidden_profile', 'NONE')->whereNotNull('c.sex')
->whereNotNull('c.belief')->whereNotNull('c.province')->whereNotNull('c.city')->where('c.birthday', '<', '2004-01-01')
->select('u.id')
->orderBy('id', 'desc')
->chunk(100, function ($users) {
foreach ($users as $user) {
$redis = Redis::connection('big_data');
$redis->lpush('ai:update:ids', $user->id);
}
});
// foreach ($users as $user)
// {
// $redis = Redis::connection('big_data');
// $redis->lpush('ai:update:ids', $user->id);
// }
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function http_get_data($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
ob_start();
curl_exec($ch);
$return_content = ob_get_contents();
ob_end_clean();
$return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return $return_content;
}
//检测用户微信头像
public function checkUserPhoto()
{
$path = date('Y') . date('m') . "/" . date('d');
require_once base_path('vendor/aliyuncs/oss-sdk-php') . '/autoload.php';
try {
$ossClient = new \OSS\OssClient(config('alioss.id'), config('alioss.secret'), config('alioss.host'));
} catch (\OSS\Core\OssException $e) {
return $this->failure('oss_connect_failure', $e->getMessage());
}
//photo字段是微信头像用户
$users = User::where('photo', 'like', "%thirdwx%")->select('id', 'photo')->get();
foreach ($users as $key => $user) {
$rand = \CommonUtilsService::getTradeNO();
$object = $path . "/" . $rand . ".jpg";
$file_url = 'https://' . config('alioss.picture_domain') . '/' . $object;
$return_content = $this->http_get_data($user->photo);
$filename = storage_path("qrcode/" . time() . $rand . '.png');
$fp = @fopen($filename, "a"); //将文件绑定到流
fwrite($fp, $return_content); //写入文件
$ossClient->uploadFile(config('alioss.buckets.picture'), $object, $filename);
fclose($fp);
unlink($filename);
$user->update(['photo' => $file_url]);
}
return $this->success('ok');
}
public function errorMsg()
{
try {
$i = 100;
while ($i) {
$message = Redis::rpop('error_message');
if (empty($message))
break;
SendMail::dispatch($message)->onQueue('error_email');
$i--;
}
} catch (\Exception $e) {
$this->getError($e);
}
}
public function appointment_sendMessage()
{
$start_time = Carbon::now()->addMinute(30)->format('H:i');
$end_time = Carbon::now()->addHour(1)->format('H:i');
$start_date = Carbon::now()->format('Y-m-d');
$saas_appointment_ids = SaasUserAppointment::with('merchant', 'merchant_user')
->where('appointment_date', $start_date)
->where('start_time', '=', $start_time)
->where('end_time', "=", $end_time)
->get();
foreach ($saas_appointment_ids as $key => $val) {
if ($val->mobile) {
$message = '您在今天' . $val->start_time . '-' . $val->end_time . '预约了' . $val->merchant->share_title . '商家,请及时与对方沟通';
Message::create([
'phone' => $val->mobile,
'message' => $message,
'confirmed' => 1,
'ip' => request() ? request()->ip() : '127.0.0.1',
]);
Messengers::sendSMS($val->mobile, $message);
}
if (!empty($val->merchant->mobile)) {
$message = '用户' . $val->merchant_user->nickname . '今天' . $val->start_time . '-' . $val->end_time . '预约了您,请空闲出您的时间';
Message::create([
'phone' => $val->merchant->mobile,
'message' => $message,
'confirmed' => 1,
'ip' => request() ? request()->ip() : '127.0.0.1',
]);
Messengers::sendSMS($val->merchant->mobile, $message);
}
}
}
public function send_sms_message()
{
try {
$start = true;
while ($start) {
$message = Redis::rpop('send_sms_message');
if (!empty($message)) {
$message_array = json_decode($message, true);
SendSmsBatch::dispatch($message_array)->onQueue('love');
} else {
$start = false;
}
}
} catch (\Exception $e) {
$this->getError($e);
}
}
public function checkCrmComment()
{
try {
$date = date('Y-m-d H:i:s');
CrmUserLog::where('commented_at', '<', $date)->whereNotNull('commented_at')->whereNull('f_commented_at')->chunk(100, function ($logs) {
foreach ($logs as $log) {
CrmUser::where('user_id', $log->user_id)->update(['step' => 'sale', 'status' => 0, 'grade' => null, 'graded_at' => null]);
CrmUserLog::where("id", $log->id)->forceDelete();
}
});
} catch (\Exception $e) {
$this->getError($e);
}
}
public function CrmDataStat()
{
try {
$this->crmRoleStat('c_service');
$this->crmRoleStat('t_service');
} catch (\Exception $e) {
$this->getError($e);
}
}
public function crmRoleStat($type)
{
try {
$comment_type = ($type == 'c_service') ? 'crm' : "crm_t";
$role_type = ($type == 'c_service') ? '客服' : "销售";
$start_date = date('Y-m-d', strtotime('-1 day'));
$end_date = date('Y-m-d');
CrmRole::withCount([
'userLogs' => function ($sql) {
$sql->where('status', 1);
},
'comments' => function ($sql) use ($start_date, $end_date, $comment_type) {
$sql->where('type', $comment_type)->whereBetween('created_at', [$start_date, $end_date]);
}
])->with('wechat')->where('type', $type)->chunk(100, function ($roles) use ($start_date, $end_date, $comment_type, $role_type) {
foreach ($roles as $role) {
$comment_user_count = ClientComment::where('maker_user_id', $role->user_id)->where('type', $comment_type)->whereBetween('created_at', [$start_date, $end_date])->groupBy('user_id')->count();
$openid = $role->wechat ? $role->wechat->official_openid : null;
if ($openid) {
$data['touser'] = $openid;
$data['template_id'] = config('wechat.tpls.crm_role_data');
$data['url'] = 'https://love.ufutx.com/admin_pro/#/login';
$data['data'] = [
'first' => '您好,以下是昨天的工作进度提醒:',
'keyword1' => $role_type,
'keyword2' => ' 昨天一共沟通过用户' . $comment_user_count . '位、填写备注' . $role->comments_count . '条,当前在服务的用户' . $role->user_logs_count . '位',
'remark' => '详情请进入后台系统查看',
];
SendTemplateMsg::dispatch($data)->onQueue('template_message');
}
}
});
} catch (\Exception $e) {
$this->getError($e);
}
}
public function checkReportFile()
{
try {
ini_set('memory_limit', -1);
$file = ReportFile::whereNull('url')->orWhere('url', '')->first();
if (empty($file))
return;
SendMail::dispatch('有活动报告未生成成功 file_id:' . $file->id, 'hankin_h@126.com', 'message')->onQueue('error_email');
$order = TouristOrder::where('id', $file->order_id)->where('account_id', $file->user_id)->first();
// ReportExport::dispatch($order)->onQueue('report.export');
\App\Exports\ReportExport::export($order);
} catch (\Exception $e) {
$this->getError($e);
}
}
public function checkTencentFaceIdRes()
{
TencentFaceidLog::where('is_real_approved', 0)->whereNotNull('eid_token')->chunk(100, function ($logs) {
foreach ($logs as $log) {
\Log::info('faceid.' . $log->id);
$res = CommonUtilsService::tencentFaceidRes($log->eid_token);
if (isset($res->Text) && isset($res->Text->ErrCode) && $res->Text->ErrCode == 0) {
try {
DB::beginTransaction();
TencentFaceidLog::where('id', $log->id)->update(['is_real_approved' => 1]);
$sex = CommonUtilsService::getSexByCard($log->card_num);
MerchantUser::where('openid', $log->openid)->update(['sex' => $sex]);
DB::commit();
} catch (\Exception $e) {
$this->getError($e);
}
} else {
TencentFaceidLog::where('id', $log->id)->update(['eid_token' => null]);
}
}
});
}
public function checkUserDetailQrcode()
{
$city_arr = ["北京", "北京市"];
User::whereDoesntHave('userDetailQrcode')->whereHas("profileCourtship", function ($sql) use ($city_arr) {
$sql->whereIn('city', $city_arr);
})->chunk(100, function ($users) {
foreach ($users as $user) {
$qrcode_path = QrcodeRectService::getViewerMiniQrcode($user->id);
if (empty($qrcode_path))
continue;
// dd($qrcode_path);
$param = ['page' => 'pages/home/information?id=' . $user->id, 'from_user_id' => $user->id];
$param = json_encode($param);
$data = [
'user_id' => $user->id,
'qrcode_path' => $qrcode_path,
'type' => 4,
'param' => $param,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$user->my_qrcode = $qrcode_path;
DB::table('user_share_qrcode')->insert($data);
}
});
}
public function checkNoticeMsgStatus()
{
NoticeMessage::withCount('notices')->where('status', 0)->where('timing', "<", time())->chunk(100, function ($messages) {
foreach ($messages as $message) {
if ($message->notices_count) {
NoticeMessage::where('id', $message->id)->update(['status' => 1]);
}
}
});
}
public function checkTestQrcode()
{
QATest::whereDoesntHave('qrcode', function ($sql) {
$sql->where('type', 'test');
})->chunk(100, function ($tests) {
foreach ($tests as $test) {
MakeQrcode::dispatch('test', $test->id, $test->merchant_id)->onQueue('love');
}
});
}
public function transferOrderLinkmen()
{
TouristOrder::where('type', 'community')->whereIn('pay_status', [1, 4])->whereNull("linkmen_bk")->where('created_at', '>', '20230501')->chunk(100, function ($orders) {
foreach ($orders as $order) {
$linkmen = json_decode($order->linkmen);
TouristOrder::where('id', $order->id)->update(['linkmen_bk' => json_encode($linkmen, JSON_UNESCAPED_UNICODE)]);
}
});
}
/**
* 检测一分钟前更新的账户是否存在异常
*/
public function checkMEarningAccount()
{
$date = date('Y-m-d H:i', strtotime('-1 minute'));
MEarningAccount::where('updated_at', ">=", $date)->chunk(100, function ($accounts) {
foreach ($accounts as $account) {
Log::info("检测账号id:{$account->id}");
CheckMEarningAccount::dispatch($account)->onQueue('love');
}
});
}
/**
* 福恋小程序群聊未读通知
*/
public function groupChatUnreadNotice()
{
$datetime = date('Y-m-d H:i:s', strtotime('-30 minute'));
$where = [
['created_at', '>=', $datetime]
];
$team_ids = MsgHistory::where($where)->groupBy('team_id')->pluck('team_id');
foreach ($team_ids as $team_id) {
$cache_key = ApiRedisKey::getGroupChatUnreadKey($team_id);
$user_ids = Redis::sMembers($cache_key);
if (!$user_ids) {
continue;
}
Redis::del($cache_key);
foreach ($user_ids as $user_id) {
GroupChatUnreadNotice::dispatch($team_id, $user_id)->onQueue('start_message');
}
}
}
/**
* 关闭资料用户移除群聊
*/
public function clearCloseUserByGroupChat()
{
$ids = User::where('hidden_profile', 'ALLSEX')->limit(20)->pluck('id');
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$where = [
['type', '!=', 1],
];
$data = UserTeam::whereIn('user_id', $ids)->where($where)->limit(20)->get();
foreach ($data as $item) {
$result = $im_service->leaveTeam($item->team_id, $item->user_id);
if ($result['code'] == 200 || $result['code'] == 414) {
UserTeam::where('user_id', $item->user_id)->where('team_id', $item->team_id)->delete();
}
}
}
/**
* 提醒saas咨询用户
*/
public function remindConsult()
{
$start_date = date('Y-m-d H:i:s');
$end_date = date('Y-m-d H:i:s', strtotime('+30 minutes'));
$data = ConsultationRecords::where('pay_status', 1)
->where('status', '<>', 2)
->whereNull('comment')
->whereRaw("LEFT(reservation_time,16) between '{$start_date}' and '{$end_date}'")
->get();
foreach ($data as $order) {
$cache_key = sprintf("saas:remind:consult:%s", $order->id);
$check = Redis::get($cache_key);
//已经提醒过
if ($check) {
continue;
}
$merchant_user = MerchantUser::find($order->merchant_user_id);
if (!$merchant_user) {
continue;
}
$consult = Consultation::find($order->consulation_id);
if (!$consult) {
continue;
}
//公众号
$consult_account = ConsultAccount::find($consult->consult_account_id);
$content = "{$consult->title}】咨询即将开始,请准时参加哦!";
$url = env('APP_URL') . "/pu/#/consultationIn?id={$order->consulation_id}&orderId={$order->id}&merchant_id={$order->merchant_id}&time={$order->duration}&mobile={$consult_account->mobile}";
\CommonUtilsService::consultCustomNotice(
$merchant_user->openid,
$url,
$order->name,
$order->reservation_time,
$content
);
//短信
if ($order->phone) {
$content = "亲爱的用户,【{$consult->title}{$order->reservation_time}咨询即将开始,请准时参加哦!";
Message::create([
'phone' => $order->phone,
'message' => $content,
'confirmed' => 1,
'ip' => request() ? request()->ip() : '127.0.0.1',
]);
Messengers::sendSMS($order->phone, $content);
}
Redis::setex($cache_key, 60 * 60, 1);
}
}
/**
* 提醒saas咨询超过预约结束时间的邀请评价
*/
public function remindConsultEndComment()
{
$start_datetime = "2023-09-15 00:00";//过滤之前没处理的
$end_datetime = date('Y-m-d H:i');
$data = ConsultationRecords::where('pay_status', 1)
->where('status', '<>', 2)
->whereNull('comment')
->whereRaw("DATE_ADD(CONCAT(LEFT(reservation_time,11),RIGHT(reservation_time,5)),INTERVAL duration MINUTE)
between '{$start_datetime}' and '{$end_datetime}'")
->get();
foreach ($data as $order) {
$cache_key = sprintf("saas:remind:consult_end_comment:%s", $order->id);
$check = Redis::get($cache_key);
//已经提醒过
if ($check) {
continue;
}
$merchant_user = MerchantUser::find($order->merchant_user_id);
if (!$merchant_user) {
continue;
}
$consult = Consultation::find($order->consulation_id);
if (!$consult) {
continue;
}
//公众号
$content = "感谢您的咨询,别忘记给我们留下宝贵的评价哦!如另约时间,请忽略本通知。";
$url = env('APP_URL') . "/pu/#/evaluation?id={$order->consulation_id}&orderId={$order->id}&merchant_id={$order->merchant_id}";
\CommonUtilsService::consultCustomNotice(
$merchant_user->openid,
$url,
$order->name,
$order->reservation_time,
$content
);
//短信
if ($order->phone) {
$content = "亲爱的用户,【{$consult->title}】感谢您的咨询,别忘记给我们留下宝贵的评价哦!如另约时间,请忽略本通知。";
Message::create([
'phone' => $order->phone,
'message' => $content,
'confirmed' => 1,
'ip' => request() ? request()->ip() : '127.0.0.1',
]);
Messengers::sendSMS($order->phone, $content);
}
//修改为结束订单
ConsultationRecords::where('id', $order->id)->update(['status' => 2]);
Redis::setex($cache_key, 60 * 60 * 24, 1);
}
}
/**
* 移除专区/置顶推荐不是单身的用户
*/
public function clearAreasUserNotIsSingle()
{
$areas_ids = ClassArea::where('is_show', 1)->pluck('id')->toArray();
$areas_user_ids = AreaUser::whereIn('area_id', $areas_ids)
->where('is_audited', 1)
->groupBy('user_id')
->pluck('user_id')
->toArray();
$clear_user_ids = User::whereIn('id', $areas_user_ids)->where('type', '<>', 'single')->pluck('id')->toArray();
if (!$clear_user_ids) {
return;
}
AreaUser::whereIn('area_id', $areas_ids)
->whereIn('user_id', $clear_user_ids)
->where('is_audited', 1)
->delete();
}
/**
* 同步云信用户资料
*/
public function syncYunxinUser()
{
$cache_key = 'temp_cron_sync_yunxin_user_last_id';
$last_id = Redis::get($cache_key);
$limit = request()->input('limit', 100);
$where = [];
if ($last_id) {
$where[] = ['id', '>', $last_id];
}
$users = User::query()->where($where)->orderBy('id', 'asc')->limit($limit)->get();
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$last_user = $users->toArray()[count($users) - 1] ?? null;
foreach ($users as $user) {
$data = [
'accid' => $user->id,
'name' => $user->nickname,
'icon' => $user->photo,
'gender' => $user->sex
];
try {
$im_service->updateUinfoV2($data);
} catch (\Exception $e) {
continue;
}
}
if ($last_user) {
Redis::set($cache_key, $last_user['id']);
}
}
public function inviteUserCountNotice()
{
$start_time = date('Y-m-d 00:00:00', strtotime('-1 day'));
$end_time = date('Y-m-d 23:59:59', strtotime('-1 day'));
$users = User::query()
->selectRaw('from_user_id,count(*) as count,GROUP_CONCAT(nickname SEPARATOR "、") as nicknames')
->whereBetween('created_at', [$start_time, $end_time])
->whereNotNull('from_user_id')
->groupBy('from_user_id')
->get()
->toArray();
foreach ($users as &$item) {
$wechat = Wechat::query()->where('user_id', $item['from_user_id'])->first();
if (!$wechat->official_openid) {
continue;
}
$data['touser'] = $wechat->official_openid;
$data['template_id'] = config('wechat.tpls.invite_register_notice');
$data['url'] = '';
$data['miniprogram'] = [
'appid' => config('wechat.mini_program.app_id'),
'pagepath' => '/pages/users/myShare'
];
$data['data'] = [
'thing6' => mb_strimwidth($item['nicknames'], 0, 20, '...', 'utf-8'),
'thing5' => "您昨天邀请了{$item['count']}位福恋小程序新用户注册!",
'time3' => date('Y年m月d日', strtotime('-1 day')),
];
SendTemplateMsg::dispatch($data)->onQueue('template_message');
}
}
}