love_php/app/Http/Controllers/Server/H5/QuestionnaireController.php
2026-04-02 09:20:51 +08:00

395 lines
17 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\Http\Controllers\Server\H5;
use App\Facades\CommonUtilsService;
use App\Facades\WechatService;
use App\Models\Server\Survey;
use App\Models\Server\SurveyService;
use App\Models\Server\SurveyUser;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Jobs\BlindboxMatchComment;
use App\Models\User;
use App\Models\Answers;
use App\Models\ClientComment;
use App\Models\Questionnaire;
use App\Models\Server\MerchantUser;
use App\Models\Server\TouristOrder;
use App\Model\Server\TencentFaceidLog;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class QuestionnaireController extends Controller
{
//获取问卷调查
public function questionaireDetail(Request $request){
try {
$questionnaire_id = $request->questionnaire_id;
$result = Questionnaire::where('id',$questionnaire_id)->select('id','title','type','type_id','status',
'content','created_at','updated_at')->first();
if($result) $result->content = json_decode($result->content);
if($result->status != 1) return $this->failure('该问卷已过期或已下架');
//判断用户是否参与活动
// $is_join = TouristOrder::where('type','community')->where('type_id',$result->type_id)->whereIn('pay_status',[1,4])->where('account_id',$request->merchant_user_id)->first();
// if(!$is_join) return $this->failure('未参与,无法填写');
$user_id = $request->merchant_user_id;
$merchant_user = MerchantUser::select('nickname', 'mobile','openid','sex')->where('id', $user_id)->first();
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$openid = $wechatUser->getId();
} else {
$openid = $merchant_user->openid;
}
//判断用户性别
$answer = [];
if($merchant_user->sex && $merchant_user->sex != 0){
$sex = $merchant_user->sex;
}else{
$sex = $this->getUserSexByOpenid($openid,0);
}
foreach ($result->content as $key => $value) {
if($value->choice != 3) continue;//3是投票匹配
if($sex == 1){
//女嘉宾
$female_members = TouristOrder::where('type','community')->where('type_id',$result->type_id)
->whereIn('pay_status',[1,4])->where('remark','like',"%女%")->select('name','open_id','remark','linkmen', 'mobile')->get()
//->leftjoin('tencent_faceid_logs', 'tourist_orders.open_id','=', 'tencent_faceid_logs.openid')
->toArray();
$openid_list = [];
$mobile_list = [];
foreach ($female_members as $key => $member) {
$linkmen = json_decode($member['linkmen'], 1);
$mobile_list = $member['mobile'];
$openid_list[] = $member['open_id'];
}
$name_data = TencentFaceidLog::whereIn('openid', $openid_list)->select('openid', 'name')->get()->toArray();
$namelist = [];
foreach ($name_data as $name)
{
$namelist[$name['openid']] = $name['name'];
}
// $name_data2 = User::whereIn("mobile", $mobile_list)->where('is_real_approved', 1)->select('mobile', 'name')->get()->toArray();
// $namelist2 = [];
// foreach($name_data2 as $name2)
// {
// $namelist2[$name2['mobile']] = $name2['name'];
// }
foreach ($female_members as $key => $member) {
$linkmen = json_decode($member['linkmen'], 1);
if (isset($namelist[$member['open_id']]))
{
$answer[] = $namelist[$member['open_id']];
}elseif(isset($namelist2[$member['mobile']])){
// $answer[] = $namelist2[$member['mobile']];
}
}
$value->answer = $answer;
}elseif($sex == 2){
//男嘉宾
$male_members = TouristOrder::where('type','community')->where('type_id',$result->type_id)
->whereIn('pay_status',[1,4])->where('remark','like',"%男%")->select('name','open_id','remark','linkmen')
->get()
->toArray();
$openid_list = [];
foreach ($male_members as $key => $member) {
$openid_list[] = $member['open_id'];
}
$name_data = TencentFaceidLog::whereIn('openid', $openid_list)->select('openid', 'name')->get()->toArray();
$namelist = [];
foreach ($name_data as $name)
{
$namelist[$name['openid']] = $name['name'];
}
foreach ($male_members as $key => $member) {
$linkmen = json_decode($member['linkmen'], 1);
if (isset($namelist[$member['open_id']]))
{
$answer[] = $namelist[$member['open_id']];
}
}
$value->answer = $answer;
}else{
//获取所有参与用户及编号
$members = TouristOrder::where('type','community')->where('type_id',$result->type_id)
->whereIn('pay_status',[1,4])->select('name','remark')
->get()
->toArray();
foreach ($members as $key => $member) {
$answer[] = $member['remark'];
}
$value->answer = ['非认证用户不能参与选择']; // $answer; 没有认证的用户,直接不给选项
}
$answer = [];
}
return $this->success('ok',$result);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息,请稍后再试');
}
}
//提交问卷调查
public function submitQuestionnaire(Request $request){
try {
$m_user_id = $request->merchant_user_id;
$questionnaire_id = $request->questionnaire_id;
$value = Answers::where('user_id',$m_user_id)->where('questionnaire_id',$questionnaire_id)->first();
if($value) {
// if(!($questionnaire_id == 30 || $questionnaire_id == 35)){
// return $this->failure('你已填写过该问卷,不用重复提交');
// }
}
$questionnaire = Questionnaire::find($questionnaire_id);
if($questionnaire_id == 30 || $questionnaire_id == 33 || $questionnaire_id == 35 || $questionnaire_id == 38){
$remark = MerchantUser::where('id',$m_user_id)->value('nickname');
}else{
//我是几号嘉宾
$order = TouristOrder::where('type','community')->where('type_id',$questionnaire->type_id)
->where('account_id',$m_user_id)->whereIn('pay_status',[1,4])->first();
if(!$order) {
\Log::info('填写问卷用户id:'.$m_user_id.' 问卷id=>'.$questionnaire_id);
// if($questionnaire->id != 31){
// return $this->failure('报名人员才可填写');
// }
$remark = '无订单问卷';
}else{
$remark = $order->remark.'-'.$order->name;
}
}
$data = $request->data;
Answers::create([
'user_id'=>$m_user_id,
'questionnaire_id'=>$questionnaire_id,
'content'=>json_encode($data),
'desc'=> $remark,
]);
$user_id = $this->matchFulinkUser($m_user_id);
$array = [
'user_id'=>$user_id,
'm_user_id'=>$m_user_id,
'questionnaire_id'=>$questionnaire_id,
];
//选择了谁增加备注
if($user_id && ($questionnaire_id != 30 || $questionnaire_id != 33 || $questionnaire_id != 35))
BlindboxMatchComment::dispatch($array)->onQueue('love');
$url = '';
if($questionnaire_id == 33) {
$url = 'https://love.ufutx.com/pu/#/activityDetails/1596?merchant_id=491&from_openid=&share_channel_id=';
}
return $this->success('ok',$url);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息,请稍后再试');
}
}
public function test(Request $request){
$m_user_id = $request->merchant_user_id;
$user_id = $this->matchFulinkUser($m_user_id);
$questionnaire_id = $request->questionnaire_id;
//选了谁
$a = Answers::where('user_id',$m_user_id)->where('questionnaire_id',$questionnaire_id)->first();
$content = json_decode($a->content,true);
$choose_user = [];
foreach ($content as $key => $value) {
if($value['choice'] != 3) continue;
$answers = $value['answer'];
foreach ($answers as $key => $answer) {
$choose_user[] = explode('-',$answer)[0];
}
}
// dd($choose_user);
//获取这个活动的嘉宾id
$q = Questionnaire::find($questionnaire_id);
$choose_user_name = [];
foreach ($choose_user as $key => $remark) {
$choose_user_name [] =TouristOrder::where('type','community')->where('type_id',$q->type_id)
->whereIn('pay_status',[1,3,4])->where('remark',$remark)->value('name');
}
$client_comment = [];
foreach ($choose_user_name as $key => $value) {
$client_comment_sub = [
'user_id'=>$user_id,
'maker_user_id'=>0,
'type'=>'active',
'pics'=>null,
'comment'=>'ta在'.$q->title.' 盲盒活动中选择了'.$value,
'created_at'=>date('Y-m-d H:i:s'),
'updated_at'=>date('Y-m-d H:i:s'),
];
$client_comment[] = $client_comment_sub;
}
ClientComment::insert($client_comment);
return $this->success('ok');
}
/**
* 第二个版本的调查问卷
*/
/**
*
*/
public function answerQuestion(Request $request, $q_id, $qq_id)
{
try {
$m_user_id = $request->merchant_user_id;
$questionnaire_id = $request->questionnaire_id;
$value = Answers::where('user_id', $m_user_id)->where('questionnaire_id', $questionnaire_id)->first();
if ($value) {
if (!($questionnaire_id == 30 || $questionnaire_id == 35)) {
return $this->failure('你已填写过该问卷,不用重复提交');
}
}
$questionnaire = Questionnaire::find($questionnaire_id);
if ($questionnaire_id == 30 || $questionnaire_id == 33 || $questionnaire_id == 35 || $questionnaire_id == 38) {
$remark = MerchantUser::where('id', $m_user_id)->value('nickname');
} else {
//我是几号嘉宾
$order = TouristOrder::where('type', 'community')->where('type_id', $questionnaire->type_id)
->where('account_id', $m_user_id)->whereIn('pay_status', [1, 4])->first();
if (!$order) {
\Log::info('填写问卷用户id:' . $m_user_id . ' 问卷id=>' . $questionnaire_id);
// if($questionnaire->id != 31){
// return $this->failure('报名人员才可填写');
// }
$remark = '无订单问卷';
} else {
$remark = $order->remark . '-' . $order->name;
}
}
$data = $request->data;
Answers::create([
'user_id' => $m_user_id,
'questionnaire_id' => $questionnaire_id,
'content' => json_encode($data),
'desc' => $remark,
]);
$user_id = $this->matchFulinkUser($m_user_id);
$array = [
'user_id' => $user_id,
'm_user_id' => $m_user_id,
'questionnaire_id' => $questionnaire_id,
];
//选择了谁增加备注
if ($user_id && ($questionnaire_id != 30 || $questionnaire_id != 33 || $questionnaire_id != 35))
BlindboxMatchComment::dispatch($array)->onQueue('love');
$url = '';
if ($questionnaire_id == 33) {
$url = 'https://love.ufutx.com/pu/#/activityDetails/1596?merchant_id=491&from_openid=&share_channel_id=';
}
return $this->success('ok', $url);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息,请稍后再试');
}
}
public function survey(Request $request, $id)
{
$type = $request->input('type');
$type_id = $request->input('type_id');
$survey = Survey::find($id);
if(!$survey){
return $this->success('ok');
}
$survey->detail_title = SurveyService::where('survey_id',$id)
->where('type',$type)
->where('type_id',$type_id)
->value('title');
return $this->success('ok',$survey);
}
public function storeSurveyUser(Request $request, $id)
{
$type = $request->input('type');
$type_id = $request->input('type_id');
$content = $request->input('content');
if (empty($content) || count($content) == 0) throw new \Exception("缺少参数content");
$user_id = $request->merchant_user_id;
$wechatUser = session('wechat.oauth_user.new');
$openid = $wechatUser?$wechatUser->getId():MerchantUser::where('id', $user_id)->value('openid');
$survey = Survey::find($id);
$survey_service_id = null;
DB::beginTransaction();
$type = $type == 'undefined'?null:$type;
$type_id = $type_id == 'undefined'?null:$type_id;
if ($type && $type_id) {
$survey_service = SurveyService::where('survey_id',$id)->where('type',$type)->where('type_id',$type_id)->first();
if (!$survey_service) throw new \Exception("服务未绑定问卷调查");
$survey_service_id = $survey_service->id;
$survey_service->increment('num');
}
$survey_user = SurveyUser::create([
'openid'=>$openid,
'user_id'=>$user_id,
'survey_id'=>$id,
'survey_service_id'=>$survey_service_id,
'type'=>$type,
'type_id'=>$type_id,
'content'=>json_encode($content)
]);
$order = $this->makeSurveyOrder($survey, $openid);
SurveyUser::where('id', $survey_user->id)->update(['order_id'=>$order->id]);
DB::commit();
return $this->success('ok', $order);
}
public function makeSurveyOrder($survey, $openid)
{
$pay_status = $survey->price > 0?0:1;
$account_id = MerchantUser::where('openid', $openid)->value('id');
$trade_no = CommonUtilsService::getTradeNo();
//生成订单
$order = TouristOrder::create([
'open_id'=>$openid, 'price'=>$survey->price, 'num'=>1, 'pay_type'=>'wechat', 'type'=>'survey', 'type_id'=>$survey->id, 'pay_status'=>$pay_status,
'trade_no'=>$trade_no, 'desc'=>$survey->title, 'merchant_id'=>$survey->m_id, 'account_id'=>$account_id
]);
$wx_pay = [];
$callback = config('app.url') . '/api/s/h5/callback/survey/' . $trade_no;
if ($survey->price > 0) {
$attributes = array(
'trade_type' => 'JSAPI', // JSAPINATIVEAPP...
'body' => $survey->title,
'detail' => $survey->title,
'out_trade_no' => $trade_no,
'total_fee' => round($survey->price * 100),
'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'openid' => $openid,
'debug' =>config('wechat.payment.debug'),
);
$wx_pay = WechatService::officialPay($attributes);
}
$order->wx_pay = $wx_pay;
return $order;
}
/**
* 问卷调查订单回调
* @param $trade_no
* @return false|void
*/
public function surveyCallback($trade_no)
{
$order = TouristOrder::where('trade_no', $trade_no)->first();
if (empty($order)) return ;
if ($order->pay_status != 0) return ;
$result = WechatService::serverH5OrderPaid($trade_no);
if ($result) {
TouristOrder::where('id', $order->id)->update(['pay_status'=>1]);
return ;
}
return ;
}
}