From b9c65cf0305b0f7d6c90baf1fde85c5a75f18d8d Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Sat, 6 Sep 2025 15:36:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(mobile):=20=E6=B7=BB=E5=8A=A0=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E7=AB=AF=E9=97=AE=E5=8D=B7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 AppQuestionnaireController 控制器,提供移动端问卷相关接口 - 实现问卷详情获取和问卷答案提交两个主要功能 - 集成 QuestionnaireIntegrationService 服务进行问卷数据处理 - 使用 ApiResponse 统一接口返回格式 - 添加日志记录和异常处理,提高系统稳定性 --- .../mobile/AppQuestionnaireController.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/main/java/com/ycwl/basic/controller/mobile/AppQuestionnaireController.java diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppQuestionnaireController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppQuestionnaireController.java new file mode 100644 index 00000000..e7049371 --- /dev/null +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppQuestionnaireController.java @@ -0,0 +1,76 @@ +package com.ycwl.basic.controller.mobile; + +import com.ycwl.basic.annotation.IgnoreToken; +import com.ycwl.basic.constant.BaseContextHandler; +import com.ycwl.basic.integration.questionnaire.dto.answer.ResponseDetailResponse; +import com.ycwl.basic.integration.questionnaire.dto.answer.SubmitAnswerRequest; +import com.ycwl.basic.integration.questionnaire.dto.questionnaire.QuestionnaireResponse; +import com.ycwl.basic.integration.questionnaire.service.QuestionnaireIntegrationService; +import com.ycwl.basic.utils.ApiResponse; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * 移动端问卷接口控制器 + * + * @author Claude Code + * @date 2025-09-05 + */ +@Slf4j +@RestController +@RequestMapping("/api/mobile/questionnaire/v1") +@RequiredArgsConstructor +public class AppQuestionnaireController { + + private final QuestionnaireIntegrationService questionnaireIntegrationService; + + /** + * 获取问卷详情 + * 包含问卷基本信息和所有题目 + */ + @IgnoreToken + @GetMapping("/{id}") + public ApiResponse getQuestionnaire(@PathVariable Long id) { + log.info("移动端获取问卷详情, id: {}", id); + try { + QuestionnaireResponse questionnaire = questionnaireIntegrationService.getQuestionnaire(id); + + // 检查问卷状态,只有已发布的问卷才能被移动端访问 + if (questionnaire.getStatus() != 2) { + return ApiResponse.fail("问卷未发布或已停止"); + } + + return ApiResponse.success(questionnaire); + } catch (Exception e) { + log.error("移动端获取问卷详情失败, id: {}", id, e); + return ApiResponse.fail("获取问卷详情失败: " + e.getMessage()); + } + } + + /** + * 提交问卷答案 + */ + @PostMapping("/{id}/submit") + public ApiResponse submitAnswer( + @PathVariable Long id, + @Valid @RequestBody SubmitAnswerRequest request) { + + String userId = BaseContextHandler.getUserId(); + log.info("移动端提交问卷答案, questionnaireId: {}, userId: {}, answers count: {}", + id, userId, request.getAnswers() != null ? request.getAnswers().size() : 0); + + try { + // 设置问卷ID和用户ID + request.setQuestionnaireId(id); + request.setUserId(userId); + + ResponseDetailResponse response = questionnaireIntegrationService.submitAnswer(request); + return ApiResponse.success(response); + } catch (Exception e) { + log.error("移动端提交问卷答案失败, questionnaireId: {}, userId: {}", id, userId, e); + return ApiResponse.fail("提交问卷答案失败: " + e.getMessage()); + } + } +} \ No newline at end of file