395 lines
17 KiB
PHP
395 lines
17 KiB
PHP
<?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', // JSAPI,NATIVE,APP...
|
||
'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 ;
|
||
}
|
||
}
|