package com.ruoyi.web.controller.api; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.ImmutableMap; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.system.dto.TQuestionnaireDTO; import com.ruoyi.system.model.*; import com.ruoyi.system.query.TQuestionnaireQuery; import com.ruoyi.system.service.*; import com.ruoyi.system.task.base.QuartzManager; import com.ruoyi.system.task.base.TimeJobType; import com.ruoyi.system.task.jobs.QuestionnairePush; import com.ruoyi.system.vo.TQuestionnaireVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** *

* 问卷调查 前端控制器 *

* * @author xiaochen * @since 2025-11-06 */ @Api(tags = "问卷调查") @RestController @RequestMapping("/t-questionnaire") public class TQuestionnaireController { private final TQuestionnaireService questionnaireService; private final TQuestionnaireStemService questionnaireStemService; private final TQuestionnaireStemOptionService questionnaireStemOptionService; private final TQuestionnaireStemBriefAnswerService questionnaireStemBriefAnswerService; private final TAppUserService appUserService; @Autowired public TQuestionnaireController(TQuestionnaireService questionnaireService, TQuestionnaireStemService questionnaireStemService, TQuestionnaireStemOptionService questionnaireStemOptionService, TQuestionnaireStemBriefAnswerService questionnaireStemBriefAnswerService, TAppUserService appUserService) { this.questionnaireService = questionnaireService; this.questionnaireStemService = questionnaireStemService; this.questionnaireStemOptionService = questionnaireStemOptionService; this.questionnaireStemBriefAnswerService = questionnaireStemBriefAnswerService; this.appUserService = appUserService; } /** * 获取问卷调查管理列表 */ @ApiOperation(value = "获取问卷调查分页列表") @PostMapping(value = "/pageList") public R> pageList(@RequestBody TQuestionnaireQuery query) { return R.ok(questionnaireService.pageList(query)); } /** * 添加问卷调查管理 */ @Log(title = "问卷调查信息-新增问卷调查", businessType = BusinessType.INSERT) @ApiOperation(value = "添加问卷调查") @PostMapping(value = "/add") public R add(@Validated @RequestBody TQuestionnaireDTO dto) { LocalDateTime startTime = dto.getStartTime(); LocalDateTime endTime = dto.getEndTime(); LocalDateTime now = LocalDateTime.now(); if(now.isBefore(startTime)){ dto.setStatus(1); } if(now.isAfter(startTime) && now.isBefore(endTime)){ dto.setStatus(2); } if(now.isAfter(endTime)){ dto.setStatus(3); } questionnaireService.save(dto); // 添加题干 List options = new ArrayList<>(); List questionnaireStems = dto.getQuestionnaireStems(); for (TQuestionnaireStem questionnaireStem : questionnaireStems) { questionnaireStem.setQuestionnaireId(dto.getId()); questionnaireStemService.save(questionnaireStem); options = questionnaireStem.getOptions(); for (TQuestionnaireStemOption option : options) { option.setStemId(questionnaireStem.getId()); } } if(!CollectionUtils.isEmpty(options)){ questionnaireStemOptionService.saveBatch(options); } if(now.isBefore(startTime)){ // 添加定时任务 Map maps = new ImmutableMap.Builder(). put("id", dto.getId()).put("type","1") .build(); QuartzManager.addJob( QuestionnairePush.class, (QuestionnairePush.name+dto.getId()).toUpperCase(), TimeJobType.QUESTIONNAIRE_PUSH, DateUtils.localDateTimeToDate(dto.getStartTime()), maps ); } if(now.isAfter(startTime) && now.isBefore(endTime)){ // 添加定时任务 Map maps = new ImmutableMap.Builder(). put("id", dto.getId()).put("type","2") .build(); QuartzManager.addJob( QuestionnairePush.class, (QuestionnairePush.name+dto.getId()).toUpperCase(), TimeJobType.QUESTIONNAIRE_PUSH, DateUtils.localDateTimeToDate(dto.getEndTime()), maps ); } return R.ok(); } /** * 修改问卷调查 */ @Log(title = "问卷调查信息-修改问卷调查", businessType = BusinessType.UPDATE) @ApiOperation(value = "修改问卷调查") @PostMapping(value = "/update") public R update(@Validated @RequestBody TQuestionnaireDTO dto) { TQuestionnaire communityActivity = questionnaireService.getById(dto.getId()); if(communityActivity.getStatus() == 2 || communityActivity.getStatus() == 3){ return R.fail("问卷调查正在进行中或已结束,无法修改"); } LocalDateTime startTime = dto.getStartTime(); LocalDateTime endTime = dto.getEndTime(); LocalDateTime now = LocalDateTime.now(); if(now.isBefore(startTime)){ dto.setStatus(1); // 添加定时任务 Map maps = new ImmutableMap.Builder(). put("id", communityActivity.getId()).put("type","1") .build(); QuartzManager.addJob( QuestionnairePush.class, (QuestionnairePush.name+communityActivity.getId()).toUpperCase(), TimeJobType.QUESTIONNAIRE_PUSH, DateUtils.localDateTimeToDate(communityActivity.getStartTime()), maps ); } if(now.isAfter(startTime) && now.isBefore(endTime)){ dto.setStatus(2); // 添加定时任务 Map maps = new ImmutableMap.Builder(). put("id", communityActivity.getId()).put("type","2") .build(); QuartzManager.addJob( QuestionnairePush.class, (QuestionnairePush.name+communityActivity.getId()).toUpperCase(), TimeJobType.QUESTIONNAIRE_PUSH, DateUtils.localDateTimeToDate(communityActivity.getEndTime()), maps ); } if(now.isAfter(endTime)){ dto.setStatus(3); } questionnaireService.updateById(dto); return R.ok(); } /** * 查看问卷调查详情 */ @ApiOperation(value = "查看问卷调查详情") @GetMapping(value = "/getDetailById") public R getDetailById(@RequestParam String id) { TQuestionnaire questionnaire = questionnaireService.getById(id); TQuestionnaireVO questionnaireVO = new TQuestionnaireVO(); BeanUtils.copyProperties(questionnaire, questionnaireVO); // 查询用户 List appUsers = appUserService.list(); // 查询题干 List questionnaireStems = questionnaireStemService.list(Wrappers.lambdaQuery(TQuestionnaireStem.class) .eq(TQuestionnaireStem::getQuestionnaireId, id)); if(!CollectionUtils.isEmpty(questionnaireStems)){ List stemIds = questionnaireStems.stream().map(TQuestionnaireStem::getId).collect(Collectors.toList()); // 查询选项 List questionnaireStemOptions = questionnaireStemOptionService.list(Wrappers.lambdaQuery(TQuestionnaireStemOption.class) .in(TQuestionnaireStemOption::getStemId, stemIds)); // 查询解答题答案 List questionnaireStemBriefAnswers = questionnaireStemBriefAnswerService.list(Wrappers.lambdaQuery(TQuestionnaireStemBriefAnswer.class) .in(TQuestionnaireStemBriefAnswer::getStemId, stemIds)); for (TQuestionnaireStem questionnaireStem : questionnaireStems) { List options = questionnaireStemOptions.stream().filter(questionnaireStemOption -> questionnaireStemOption.getStemId().equals(questionnaireStem.getId())).collect(Collectors.toList()); // 匹配作答人数 for (TQuestionnaireStemOption option : options) { String answerValue = option.getAnswerValue(); option.setAnswerNum(StringUtils.hasLength(answerValue)?answerValue.split(",").length:0); } questionnaireStem.setOptions(options); // 匹配解答题答案 List answers = questionnaireStemBriefAnswers.stream().filter(questionnaireStemBriefAnswer -> questionnaireStemBriefAnswer.getStemId().equals(questionnaireStem.getId())).collect(Collectors.toList()); for (TQuestionnaireStemBriefAnswer answer : answers) { List appUserList = appUsers.stream().filter(appUser -> appUser.getId().equals(answer.getAppUserId())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(appUserList)){ answer.setNickName(appUserList.get(0).getNickName()); } } questionnaireStem.setAnswers(answers); } questionnaireVO.setQuestionnaireStems(questionnaireStems); } return R.ok(questionnaireVO); } /** * 删除问卷调查 */ @Log(title = "问卷调查信息-删除问卷调查", businessType = BusinessType.DELETE) @ApiOperation(value = "删除问卷调查") @DeleteMapping(value = "/deleteById") public R deleteById(@RequestParam String id) { // 查询题干 List questionnaireStems = questionnaireStemService.list(Wrappers.lambdaQuery(TQuestionnaireStem.class) .eq(TQuestionnaireStem::getQuestionnaireId, id)); if(!CollectionUtils.isEmpty(questionnaireStems)){ List stemIds = questionnaireStems.stream().map(TQuestionnaireStem::getId).collect(Collectors.toList()); // 删除题干选项 questionnaireStemOptionService.remove(Wrappers.lambdaQuery(TQuestionnaireStemOption.class) .in(TQuestionnaireStemOption::getStemId, stemIds)); // 删除解答题信息 questionnaireStemBriefAnswerService.remove(Wrappers.lambdaQuery(TQuestionnaireStemBriefAnswer.class) .in(TQuestionnaireStemBriefAnswer::getStemId, stemIds)); } // 删除题干 questionnaireStemService.remove(Wrappers.lambdaQuery(TQuestionnaireStem.class) .eq(TQuestionnaireStem::getQuestionnaireId, id)); return R.ok(questionnaireService.removeById(id)); } /** * 社区活动发布和完成 */ @Log(title = "问卷调查信息-问卷调查发布和完成", businessType = BusinessType.UPDATE) @ApiOperation(value = "问卷调查发布和完成") @PostMapping(value = "/updateReleaseFinish") public R updateReleaseFinish(@RequestParam(value = "id") String id, @RequestParam(value = "status") Integer status) { TQuestionnaire questionnaire = questionnaireService.getById(id); if(status == 2){ // 添加定时任务 Map maps = new ImmutableMap.Builder(). put("id", questionnaire.getId()).put("type","2") .build(); QuartzManager.addJob( QuestionnairePush.class, (QuestionnairePush.name+questionnaire.getId()).toUpperCase(), TimeJobType.QUESTIONNAIRE_PUSH, DateUtils.localDateTimeToDate(questionnaire.getEndTime()), maps ); } questionnaireService.update(Wrappers.lambdaUpdate(TQuestionnaire.class) .set(TQuestionnaire::getStatus, status) .eq(TQuestionnaire::getId, id)); return R.ok(); } }