474 lines
15 KiB
PHP
Raw Normal View History

2025-04-01 18:18:52 +08:00
<?php
namespace app\api\controller\backend;
use app\common\controller\Api;
use app\common\library\Ems;
use app\common\library\Sms;
use fast\Random;
use think\Config;
use think\Validate;
use think\Db;
use think\Model;
use fast\Tree;
/**
* 调查问卷接口
*/
class Questionnaire extends Api
{
//如果$noNeedLogin为空表示所有接口都需要登录才能请求
//如果$noNeedRight为空表示所有接口都需要验证权限才能请求
//如果接口已经设置无需登录,那也就无需鉴权了
//
// 无需登录的接口,*表示全部
protected $noNeedLogin = ['*','searchById', 'search'];
// 无需鉴权的接口,*表示全部
protected $noNeedRight = ['test2'];
protected $dataLimit = 'personal';
/**
*
* 问卷列表
*
*/
public function questionnaireIndex(){
$title = input('questionnaire');
$page = input("page",1);
$size = input("size",10);
$Token = $this->request->header('Token');
if(!$Token){
return $this->error('缺少参数');
}
$user_id = Db::name('user')->where('token', $Token)->value('id');
if(!$user_id){
return $this->error('该用户不存在');
}
$where = [];
if($title){
$where['title'] = ['like',"%$title%"];
}
$data = Db::name('questionnaire')
->where($where)
->order('releasetime desc')
->page($page,$size)
->select();
foreach ($data as $key => $val){
$res = Db::name('questionnaire_log')
->where('questionnaire_id', $val['id'])
->where('user_id', $user_id)
->select();
$data[$key]['type'] = '未填写';
if($res){
$data[$key]['type'] = '已填写';
}
}
$count = Db::name('questionnaire')
->where($where)
->count();
$data = [
'count' => $count,
'data' => $data
];
$this->success('返回成功',$data);
}
//单挑查询
public function questionnairefind()
{
$questionnaireId = input('id');
// 1. 查询问卷所有题目(带权重排序)
$topics = Db::name('questionnaire_topic')
->where('questionnaire_id', $questionnaireId)
->order('id desc') // 注意:原代码中的"wight"应为"weight"的拼写错误
->select();
// 2. 预处理题目数据:解码选项
$processedTopics = [];
foreach ($topics as $topic) {
$topic['option'] = json_decode($topic['option'], true);
$processedTopics[$topic['id']] = $topic; // 使用ID作为键方便后续匹配
}
// 3. 查询该问卷所有题目的答题记录
$topicIds = array_keys($processedTopics);
$answerLogs = Db::name('questionnaire_log')
->where('topic_id', 'in', $topicIds)
->select();
// 4. 合并答题记录到题目数据
foreach ($answerLogs as $log) {
$topicId = $log['topic_id'];
if (isset($processedTopics[$topicId])) {
// 添加 type 标识和答案数据
// $processedTopics[$topicId]['type'] = 1;
$processedTopics[$topicId]['topic'] = $log['option'];
}
}
// 5. 转换为数组(保持顺序)
$result = array_values($processedTopics);
$this->success('查询成功', $result);
}
//问卷统计查询
public function questionnaireStatistics(){
$id = input('id');
// 题目
$topic = Db::name('questionnaire_topic')
->where('activity_id', $id)
->select();
$jianda = Db::name('questionnaire_topic')
->where('questionnaire_id', $id)
->order('wight desc')
->select();
foreach($jianda as $key => $val){
$jianda[$key]['option'] = json_decode($val['option'], true);
}
$jianda_log = Db::name('questionnaire_topic')
->where('questionnaire_id', $id)
->column('id');
$topic_id = implode(',',$jianda_log);
$jiandaer = Db::name('questionnaire_log')
->where('topic_id','in' ,$topic_id)
->select();
foreach($jianda as $topic_key => $topic_val){
$log_jianda = [];
foreach($jiandaer as $log_key => $log_val){
if($topic_val['id'] == $log_val['topic_id']){
array_push($log_jianda, $log_val);
}
}
$jianda[$topic_key]['list'] = $log_jianda;
$jianda[$topic_key]['quantity'] = count($jianda[$topic_key]['list']);
}
// 遍历 $jianda 数组
foreach ($jianda as &$val) { // 使用引用 & 来直接修改原数组
// 遍历 'option' 数组
foreach ($val['option'] as &$option) { // 使用引用 & 来直接修改原数组
// 初始化 'num' 为 0以防 'list' 中没有任何匹配的项)
$option['num'] = 0;
// 遍历 'list' 数组
foreach ($val['list'] as $b) {
// 检查 'list' 中的 'option' 是否包含当前 'option' 的 'name'
if (strpos($b['option'], $option['name']) !== false) {
// 如果找到匹配项,增加 'num' 并退出循环(因为不需要继续检查)
$option['num']++;
// break; // 退出当前 'list' 的循环
}
}
}
// 取消对 $val 的引用,避免后续潜在问题
unset($val);
}
$this->success('返回成功',$jianda);
}
public function questionnaireAdd(){
$data = input();
$data['createtime'] = time();
$adddata = Db::name('questionnaire')->strict(false)->insert($data);
if ($adddata) {
$this->success('已添加');
} else {
$this->error('添加失败');
}
}
public function questionnaireEdit(){
$data = input();
$id = $data['id'];
// $this->success('已更新',$data);
$update = Db::name('questionnaire')->where('id', $id)->strict(false)->update($data);
if ($update) {
$this->success('已更新');
} else {
$this->error('更新失败');
}
}
public function questionnaireDel(){
$data = input();
$id = $data['id'];
$delete = Db::name('questionnaire')->where('id', $id)->delete();
if ($delete) {
$this->success('已删除');
} else {
$this->error('删除失败');
}
}
public function topicIndex(){
$data = input();
$id = $data['id'];
$topic = Db::name('questionnaire_topic')->where('questionnaire_id',$id)->select();
if ($topic) {
$this->success('查询成功',$topic);
} else {
$this->success('查询成功',[]);
}
}
public function topicAdd(){
$data = $_POST['topic'];
$activity_id = $this->request->post('questionnaire_id');
if (!$activity_id) {
$this->error(__('Invalid parameters'));
}
// 解析 JSON 并校验
$array = json_decode($data, true);
if ($array === null) {
$error = json_last_error_msg();
$this->error("JSON 解析失败: " . $error);
}
// 遍历处理数据
foreach ($array as $key => $val) {
$array[$key]['questionnaire_id'] = $activity_id;
$array[$key]['createtime'] = date('Y-m-d H:i:s');
$array[$key]['option'] = json_encode($val['option'], JSON_UNESCAPED_UNICODE); // 避免中文转义
}
// 插入数据库
$adddata = Db::name('questionnaire_topic')->strict(false)->insertAll($array);
if ($adddata) {
$this->success('已添加');
} else {
$this->error('添加失败');
}
}
public function topicEdit(){
$data = $_POST['topic'];
$array = json_decode($data, true);
// $this->success('已更新', $array);
$id = $array['id'];
$array['option'] = json_encode( $array['option'],true);
$update = Db::name('questionnaire_topic')->where('id', $id)->strict(false)->update($array);
if ($update) {
$this->success('已更新');
} else {
$this->error('内容未更新');
}
}
public function topicDel(){
$id = $this->request->post('id');
if(!$id){
$this->error(__('Invalid parameters'));
}
$delete = Db::name('questionnaire_topic')->where('id', $id)->delete();
if ($delete) {
$this->success('已删除');
} else {
$this->error('删除失败');
}
}
// --------------------------------------------------------------------------------------------
// 移动端
public function appIndex(){
$title = input('questionnaire');
$page = input("page",1);
$size = input("size",10);
$where = [];
if($title){
$where['title'] = ['like',"%$title%"];
}
$data = Db::name('questionnaire')
->where($where)
->order('releasetime desc')
->page($page,$size)
->select();
$one = [];
$two = [];
$there = [];
foreach($data as $key => $val){
if(strtotime($val['releasetime']) < time() && strtotime($val['endtime']) > time()){
$id = $val['id'];
$val['log'] = Db::name('questionnaire_log')
->where('questionnaire_id', $id)
->group('member_id')
->count();
array_push($two,$val);
}
}
$this->success('返回成功',$two);
}
//单挑查询
public function appFind(){
$id = input('id');
$data = Db::name('questionnaire')
->where('id', $id)
->order('releasetime desc')
->select();
// 题目
$topic = Db::name('questionnaire_topic')
->where('questionnaire_id', $id)
->select();
$jianda = Db::name('questionnaire_topic')
->where('questionnaire_id', $id)
->where('type',1)
->select();
$jianda_log = Db::name('questionnaire_topic')
// ->field('id')
->where('questionnaire_id', $id)
->where('type',1)
->column('id');
$topic_id = implode(',',$jianda_log);
$jiandaer = Db::name('questionnaire_log')
// ->field('id')
->where('topic_id','in' ,$topic_id)
->select();
// var_dump($jiandaer);die();
if($jianda_log){
foreach($jianda as $topic_key => $topic_val){
$log_jianda = [];
foreach($jiandaer as $log_key => $log_val){
if($topic_val['id'] == $log_val['topic_id']){
array_push($log_jianda, $log_val);
}
}
$jianda[$topic_key]['list'] = $log_jianda;
}
}else{
$jianda_log = [];
}
foreach($topic as $key => $val){
$topic[$key]['count'] = Db::name('questionnaire_topic')
->where('questionnaire_id', $id)
->count();
$option = json_decode($val['option'],true);
$b = [];
$c = [];
foreach($option as $k => $v){
$a = Db::name('questionnaire_log')
->where('topic_id', $val['id'])
->where('option','like',"%$k%")
->count();
$b = [
'name' => $v['name'],
'xvanxiang' => $k,
'mun' => $a
];
array_push($c,$b);
}
$topic[$key]['canyurenshu'] = $c;
if($val['type'] == 1){
unset($topic[$key]);
}
}
$topic = array_values($topic);
$info = [
'data' => $data,
'topic' =>$topic,
'jianda'=>$jianda
];
$this->success('返回成功',$info);
}
public function appAdd(){
$option = $_POST['option'];
$Token = $this->request->header('Token');
if(!$Token){
return $this->error('缺少参数');
}
$user_id = Db::name('user')->where('token', $Token)->value('id');
if(!$user_id){
return $this->error('该用户不存在');
}
$member_id = $user_id;
$option = json_decode($option, true);
foreach($option as $key => $val){
$option[$key]['user_id'] = $user_id;
$option[$key]['createtime'] = date('Y-m-d H:i:s');
$where = [];
if($member_id){
$where['user_id'] = $member_id;
}
if($val['questionnaire_id']){
$where['questionnaire_id'] = $val['questionnaire_id'];
}
$if = Db::name('questionnaire_log')
->where($where)
->find();
if($if){
$this->success('问卷只能填写一次哦');
}
}
// $this->success('提交成功',$option);
// $data = json_decode($option,true);
$adddata = Db::name('questionnaire_log')
->strict(false)
->insertAll($option);
$this->success('提交成功',$adddata);
}
public function appFindLog(){
$member_id = input('member_id');
$questionnaire_id = input('questionnaire_id');
$where = [];
if($member_id){
$where['member_id'] = $member_id;
}
if($questionnaire_id){
$where['questionnaire_id'] = $questionnaire_id;
}
$if = Db::name('questionnaire_log')
->where($where)
->select();
if($if){
$this->success('返回成功',$if);
}
$this->error('未查询到');
}
}