package com.panzhihua.service_community.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.panzhihua.common.model.dtos.community.PageQuestnaireAnswerDTO; import com.panzhihua.common.model.dtos.community.PageQuestnaireDTO; import com.panzhihua.common.model.dtos.community.PageQuestnaireSubDetailsDTO; import com.panzhihua.common.model.dtos.community.QuestnaireAnswersDTO; import com.panzhihua.common.model.dtos.community.questnaire.StatisticsSummaryDTO; import com.panzhihua.common.model.vos.LoginUserInfoVO; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.ComActQuestnaireAnswerContentVO; import com.panzhihua.common.model.vos.community.ComActQuestnaireSubSelectionVO; import com.panzhihua.common.model.vos.community.ComActQuestnaireSubVO; import com.panzhihua.common.model.vos.community.ComActQuestnaireVO; import com.panzhihua.common.model.vos.community.questnaire.*; import com.panzhihua.common.service.user.UserService; import com.panzhihua.common.utlis.DateUtils; import com.panzhihua.service_community.dao.*; import com.panzhihua.service_community.model.dos.*; import com.panzhihua.service_community.service.ComActQuestnaireService; import lombok.extern.slf4j.Slf4j; /** * @Author: llming * @Description: */ @Slf4j @Service public class ComActQuestnaireServiceImpl implements ComActQuestnaireService { @Resource ComActQuestnaireDAO questnaireDAO; @Resource ComActQuestnaireSubDAO questnaireSubDAO; @Resource ComActDynUserDAO userDAO; @Resource ComActQuestnaireSubSelectionDAO questnaireSubSelectionDAO; @Resource ComActQuestnaireAnswerContentDAO questnaireAnswerContentDAO; @Resource ComActQuestnaireSubServiceImpl questnaireSubService; @Resource ComActQuestnaireSubSelectionServiceImpl subSelectionService; @Resource ComActQuestnaireAnswerContentServiceImpl answerContentService; @Resource UserService userService; @Resource private ComActQuestnaireUserAnswerMapper comActQuestnaireUserAnswerMapper; @Override @Transactional(rollbackFor = Exception.class) public R addQuestnaire(QuestnaireVO questnaireVO) { Long userId = questnaireVO.getUserId(); if (questnaireVO.getAdverPositionPopup().equals(ComActQuestnaireDO.isOk.yes)) { // 查询当前时间段是否已有弹窗提醒了 Integer count = questnaireDAO.getAdvPopupCount(questnaireVO.getCommunityId(), questnaireVO.getStartTime(), questnaireVO.getEndTime(), null); if (count > 0) { return R.fail("所选时间段已设置了问卷调查弹窗,暂不支持再次添加!"); } } ComActQuestnaireDO comActQuestnaireDO = new ComActQuestnaireDO(); Date nowDate = new Date(); BeanUtils.copyProperties(questnaireVO, comActQuestnaireDO); comActQuestnaireDO.setState(ComActQuestnaireDO.state.dfb); comActQuestnaireDO.setTitle(questnaireVO.getTitle()); comActQuestnaireDO.setJoinCount(0); comActQuestnaireDO.setCreateBy(userId); comActQuestnaireDO.setCreateAt(nowDate); Date startDate = DateUtils.stringToDate(questnaireVO.getStartTime(), DateUtils.ymdhms_format); if (startDate != null && startDate.getTime() <= nowDate.getTime()) { comActQuestnaireDO.setState(ComActQuestnaireDO.state.dyz); comActQuestnaireDO.setPublishTime(nowDate); } Date endDate = DateUtils.stringToDate(questnaireVO.getEndTime(), DateUtils.ymdhms_format); if (endDate != null && endDate.getTime() <= nowDate.getTime()) { comActQuestnaireDO.setState(ComActQuestnaireDO.state.yjs); } comActQuestnaireDO.setStartTime(startDate); comActQuestnaireDO.setEndTime(endDate); if (questnaireVO.getIdentity().equals(QuestnaireVO.identity.jm)) { comActQuestnaireDO.setForMasses(ComActQuestnaireDO.isOk.yes); } else if (questnaireVO.getIdentity().equals(QuestnaireVO.identity.dy)) { comActQuestnaireDO.setForParty(ComActQuestnaireDO.isOk.yes); } else if (questnaireVO.getIdentity().equals(QuestnaireVO.identity.zyz)) { comActQuestnaireDO.setForVolunteer(ComActQuestnaireDO.isOk.yes); } if (questnaireVO.getIsRelease() != null && questnaireVO.getIsRelease().equals(1)) { comActQuestnaireDO.setStartTime(nowDate); } // 统计该调查问卷填报题目数量 int count = 0; List questnaiteSubVOS = JSON.parseArray(questnaireVO.getJsonObject(), QuestnaiteSubVO.class); if (!questnaiteSubVOS.isEmpty()) { count = questnaiteSubVOS.size(); } comActQuestnaireDO.setCount(count); comActQuestnaireDO.setJsonObject(questnaireVO.getJsonObject()); int quesCount = questnaireDAO.insert(comActQuestnaireDO); if (quesCount != 1) { return R.fail("创建失败"); } if (!questnaiteSubVOS.isEmpty()) { questnaiteSubVOS.forEach(sub -> { ComActQuestnaireSubDO comActQuestnaireSubDO = new ComActQuestnaireSubDO(); comActQuestnaireSubDO.setType(sub.getType()); comActQuestnaireSubDO.setContent(sub.getLabel()); comActQuestnaireSubDO.setSort(sub.getSort()); comActQuestnaireSubDO.setQueId(comActQuestnaireDO.getId()); comActQuestnaireSubDO.setCreateBy(userId); comActQuestnaireSubDO.setKey(sub.getKey()); questnaireSubDAO.insert(comActQuestnaireSubDO); ArrayList subSelectionList = Lists.newArrayList(); if (sub.getOptions() != null && !sub.getOptions().isEmpty()) { List subOptions = sub.getOptions(); for (int i = 0; i < subOptions.size(); i++) { QuestnaiteSubSelectionVO subSelect = subOptions.get(i); ComActQuestnaireSubSelectionDO subSelectionDO = new ComActQuestnaireSubSelectionDO(); subSelectionDO.setQueSubId(comActQuestnaireSubDO.getId()); if (subSelect.getType().equals(1)) { // 添加选项名称 subSelectionDO.setOptionName(subSelect.getOptionName()); } else { subSelectionDO.setOptionName(String.valueOf(Character.toChars('A' + i))); } subSelectionDO.setContent(subSelect.getLabel()); subSelectionDO.setQueId(comActQuestnaireDO.getId()); subSelectionDO.setCreateBy(userId); subSelectionDO.setType(subSelect.getType()); subSelectionDO.setKey(subSelect.getKey()); subSelectionDO.setUrl(subSelect.getUrl()); subSelectionList.add(subSelectionDO); } } subSelectionService.saveBatch(subSelectionList); }); } return R.ok(); } @Override public R pageQuestnaire(PageQuestnaireDTO pageQuestnaireDTO) { IPage voPage = questnaireDAO.selectPageList( new Page<>(pageQuestnaireDTO.getPageNum(), pageQuestnaireDTO.getPageSize()), pageQuestnaireDTO); return R.ok(voPage); } @Override public R pageQuestnaireAdmin(PageQuestnaireDTO pageQuestnaireDTO) { IPage voPage = questnaireDAO.selectPageListAdmin( new Page<>(pageQuestnaireDTO.getPageNum(), pageQuestnaireDTO.getPageSize()), pageQuestnaireDTO); if (!voPage.getRecords().isEmpty()) { voPage.getRecords().forEach(vo -> { // 判断调查人员身份 if (vo.getForMasses().equals(ComActQuestnaireDO.isOk.yes)) { vo.setIdentity("全部居民"); } else if (vo.getForParty().equals(ComActQuestnaireDO.isOk.yes)) { vo.setIdentity("党员"); } else if (vo.getForVolunteer().equals(ComActQuestnaireDO.isOk.yes)) { vo.setIdentity("志愿者"); } // 判断广告位置 StringBuilder sb = new StringBuilder(); if (vo.getAdverPositionPopup().equals(ComActQuestnaireDO.isOk.yes)) { sb.append("首页弹窗,"); } if (vo.getAdverPositionTop().equals(ComActQuestnaireDO.isOk.yes)) { sb.append("首页顶部,"); } if (vo.getAdverPositionApplication().equals(ComActQuestnaireDO.isOk.yes)) { sb.append("首页应用,"); } if (vo.getIsCover().equals(ComActQuestnaireDO.isOk.yes)) { sb.append("设置封面,"); } String advertPosition = sb.toString(); if (advertPosition.length() > 0) { vo.setAdvertPosition(advertPosition.substring(0, advertPosition.length() - 1)); } else { vo.setAdvertPosition("无"); } }); } return R.ok(voPage); } @Override @Transactional(rollbackFor = Exception.class) public R editQuestnaire(QuestnaireVO questnaireVO) { Long queId = questnaireVO.getId(); Long userId = questnaireVO.getUserId(); ComActQuestnaireDO questnaireDO = this.questnaireDAO.selectById(queId); if (questnaireDO == null) { return R.fail("未查询到该问卷调查"); } if (!questnaireDO.getState().equals(1)) { return R.fail("该调查问卷不是待发布状态,不可编辑"); } if (questnaireVO.getAdverPositionPopup().equals(ComActQuestnaireDO.isOk.yes)) { // 查询当前时间段是否已有弹窗提醒了 Integer count = questnaireDAO.getAdvPopupCount(questnaireVO.getCommunityId(), questnaireVO.getStartTime(), questnaireVO.getEndTime(), queId); if (count > 0) { return R.fail("所选时间段已设置了问卷调查弹窗,暂不支持再次添加!"); } } // 更新调查问卷信息 Date nowDate = new Date(); BeanUtils.copyProperties(questnaireVO, questnaireDO); questnaireDO.setState(ComActQuestnaireDO.state.dfb); questnaireDO.setTitle(questnaireVO.getTitle()); questnaireDO.setUpdateBy(userId); questnaireDO.setUpdateAt(nowDate); Date startDate = DateUtils.stringToDate(questnaireVO.getStartTime(), DateUtils.ymdhms_format); if (startDate != null && startDate.getTime() <= nowDate.getTime()) { questnaireDO.setState(ComActQuestnaireDO.state.dyz); questnaireDO.setPublishTime(nowDate); } Date endDate = DateUtils.stringToDate(questnaireVO.getEndTime(), DateUtils.ymdhms_format); if (endDate != null && endDate.getTime() <= nowDate.getTime()) { questnaireDO.setState(ComActQuestnaireDO.state.yjs); } questnaireDO.setStartTime(startDate); questnaireDO.setEndTime(endDate); if (questnaireVO.getIdentity().equals(QuestnaireVO.identity.jm)) { questnaireDO.setForMasses(ComActQuestnaireDO.isOk.yes); } else if (questnaireVO.getIdentity().equals(QuestnaireVO.identity.dy)) { questnaireDO.setForParty(ComActQuestnaireDO.isOk.yes); } else if (questnaireVO.getIdentity().equals(QuestnaireVO.identity.zyz)) { questnaireDO.setForVolunteer(ComActQuestnaireDO.isOk.yes); } if (questnaireVO.getIsRelease() != null && questnaireVO.getIsRelease().equals(1)) { questnaireDO.setStartTime(nowDate); } // 统计该调查问卷填报题目数量 int count = 0; List questnaiteSubVOS = JSON.parseArray(questnaireVO.getJsonObject(), QuestnaiteSubVO.class); if (!questnaiteSubVOS.isEmpty()) { count = questnaiteSubVOS.size(); } questnaireDO.setCount(count); questnaireDO.setJsonObject(questnaireVO.getJsonObject()); questnaireDAO.updateById(questnaireDO); // 删除原调查问卷题目以及选项,重新进行新增 questnaireDAO.deleteQuesSubAll(queId); questnaireDAO.deleteQuesSubAll2(queId); // 重新新增题目以及题目选项 if (!questnaiteSubVOS.isEmpty()) { questnaiteSubVOS.forEach(sub -> { ComActQuestnaireSubDO comActQuestnaireSubDO = new ComActQuestnaireSubDO(); comActQuestnaireSubDO.setType(sub.getType()); comActQuestnaireSubDO.setContent(sub.getLabel()); comActQuestnaireSubDO.setSort(sub.getSort()); comActQuestnaireSubDO.setKey(sub.getKey()); comActQuestnaireSubDO.setQueId(queId); comActQuestnaireSubDO.setCreateBy(userId); questnaireSubDAO.insert(comActQuestnaireSubDO); ArrayList subSelectionList = Lists.newArrayList(); if (sub.getOptions() != null && !sub.getOptions().isEmpty()) { List subOptions = sub.getOptions(); for (int i = 0; i < subOptions.size(); i++) { QuestnaiteSubSelectionVO subSelect = subOptions.get(i); ComActQuestnaireSubSelectionDO subSelectionDO = new ComActQuestnaireSubSelectionDO(); subSelectionDO.setQueSubId(comActQuestnaireSubDO.getId()); if (subSelect.getType().equals(1)) { // 添加选项名称 subSelectionDO.setOptionName(subSelect.getOptionName()); } else { subSelectionDO.setOptionName(String.valueOf(Character.toChars('A' + i))); } subSelectionDO.setKey(subSelect.getKey()); subSelectionDO.setContent(subSelect.getLabel()); subSelectionDO.setQueId(queId); subSelectionDO.setCreateBy(userId); subSelectionDO.setType(subSelect.getType()); subSelectionList.add(subSelectionDO); } } subSelectionService.saveBatch(subSelectionList); }); } return R.ok(); } @Override public R editQuestnaireDO(EditComActQuestnaireVo editComActQuestnaireVo) { Long userId = editComActQuestnaireVo.getUserId(); LambdaQueryWrapper subParam = new LambdaQueryWrapper() .eq(ComActQuestnaireDO::getId, editComActQuestnaireVo.getQuestId()); ComActQuestnaireDO questDO = questnaireDAO.selectOne(subParam); if (questDO == null) { return R.fail("未查询到调查问卷记录"); } if (editComActQuestnaireVo.getType().equals(EditComActQuestnaireVo.type.jx)) { questDO.setEndTime(DateUtils.stringToDate(editComActQuestnaireVo.getEndTime(), DateUtils.ymdhms_format)); questDO.setState(ComActQuestnaireDO.state.dyz); } else if (editComActQuestnaireVo.getType().equals(EditComActQuestnaireVo.type.tz)) { questDO.setState(ComActQuestnaireDO.state.yjs); } else if (editComActQuestnaireVo.getType().equals(EditComActQuestnaireVo.type.fb)) { questDO.setState(ComActQuestnaireDO.state.dyz); questDO.setStartTime(new Date()); } questDO.setUpdateBy(userId); questDO.setUpdateAt(new Date()); if (questnaireDAO.updateById(questDO) > 0) { return R.ok(); } else { return R.fail(); } } @Override public R deleteQuestnaire(Long questId, Long userId) { ComActQuestnaireDO queDO = questnaireDAO.selectById(questId); if (queDO == null) { return R.fail("未查询到调查问卷记录"); } // if (!queDO.getState().equals(ComActQuestnaireDO.state.dfb) ) { // return R.fail("该调查问卷不是待发布状态,不可删除"); if (queDO.getState().equals(ComActQuestnaireDO.state.dyz) ) { return R.fail("该调查问卷不是待发布状态或已结束状态,不可删除"); } queDO.setUpdateBy(userId); queDO.setUpdateAt(new Date()); queDO.setIsHide(1); if (questnaireDAO.updateById(queDO) > 0) { return R.ok(); } else { return R.fail(); } } @Override public R statQuestnaire(Long questId) { ComActQuestnaireDO comActQuestnaireDO = questnaireDAO.selectOne(new QueryWrapper().lambda() .eq(ComActQuestnaireDO::getId, questId).eq(ComActQuestnaireDO::getIsHide, 0)); if (comActQuestnaireDO == null) { return R.fail("问卷已删除!"); } QuestnaireAnswerStatVO usersAnswerStatVO = new QuestnaireAnswerStatVO(); // 问卷信息 ComActQuestnaireVO comActQuestnaireVO = new ComActQuestnaireVO(); BeanUtils.copyProperties(comActQuestnaireDO, comActQuestnaireVO); usersAnswerStatVO.setQuestnaire(comActQuestnaireVO); // 问卷题目列表 List comActQuestnaireSubDOList = questnaireSubDAO.selectList( new QueryWrapper().lambda().eq(ComActQuestnaireSubDO::getQueId, questId)); // 题目统计信息 List usearSubAnswerSelectionStatVOList = questnaireAnswerContentDAO.selectQuestnaireStat(questId); List usersSubAnswerStatVOList = new ArrayList<>(); comActQuestnaireSubDOList.forEach(comActQuestnaireSubDO -> { UsersSubAnswerStatVO usersSubAnswerStatVO = new UsersSubAnswerStatVO(); ComActQuestnaireSubVO comActQuestnaireSubVO = new ComActQuestnaireSubVO(); BeanUtils.copyProperties(comActQuestnaireSubDO, comActQuestnaireSubVO); usersSubAnswerStatVO.setQuestSubVO(comActQuestnaireSubVO); List userSubAnswerSelectionStatVOList = new ArrayList<>(); usersSubAnswerStatVO.setTotal(0); usearSubAnswerSelectionStatVOList.forEach(stat -> { if (stat.getSubId().equals(comActQuestnaireSubDO.getId()) && stat.getTotal() > 0) { userSubAnswerSelectionStatVOList.add(stat); } }); usersSubAnswerStatVO.setUsersAnswer(userSubAnswerSelectionStatVOList); Integer count = questnaireAnswerContentDAO .selectCount(new QueryWrapper().select(" DISTINCT sub_id, user_id ") .lambda().eq(ComActQuestnaireAnswerContentDO::getSubId, comActQuestnaireSubDO.getId())); usersSubAnswerStatVO.setTotal(count); usersSubAnswerStatVOList.add(usersSubAnswerStatVO); }); usersAnswerStatVO.setUsersSubAnswerStat(usersSubAnswerStatVOList); return R.ok(usersAnswerStatVO); } @Override public R infoQuestnaire(Long questId) { return answerInfoQuestnaire(null, questId); } @Override public R answerInfoQuestnaire(Long userId, Long questId) { ComActQuestnaireDO comActQuestnaireDO = questnaireDAO.selectOne(new QueryWrapper().lambda() .eq(ComActQuestnaireDO::getId, questId).eq(ComActQuestnaireDO::getIsHide, 0)); if (comActQuestnaireDO == null) { return R.fail("问卷不存在!"); } UsersAnswerVO usersAnswerVO = new UsersAnswerVO(); ComActQuestnaireVO comActQuestnaireVO = new ComActQuestnaireVO(); BeanUtils.copyProperties(comActQuestnaireDO, comActQuestnaireVO); usersAnswerVO.setQuestnaire(comActQuestnaireVO); List list = questnaireSubDAO.selectList( new QueryWrapper().lambda().eq(ComActQuestnaireSubDO::getQueId, questId)); list.sort(Comparator.comparing(ComActQuestnaireSubDO::getSort)); List usersSubAnswerVOList = new ArrayList<>(); list.forEach(comActQuestnaireSubDO -> { UsersSubAnswerVO usersSubAnswerVO = new UsersSubAnswerVO(); // 问卷调查题目 ComActQuestnaireSubVO comActQuestnaireSubVO = new ComActQuestnaireSubVO(); BeanUtils.copyProperties(comActQuestnaireSubDO, comActQuestnaireSubVO); usersSubAnswerVO.setQuestSubVO(comActQuestnaireSubVO); // 问卷调查题目-选项 Long subId = comActQuestnaireSubDO.getId(); List comActQuestnaireSubSelectionDOs = questnaireSubSelectionDAO.selectList(new QueryWrapper().lambda() .eq(ComActQuestnaireSubSelectionDO::getQueSubId, subId)); List comActQuestnaireSubSelectionVOs = new ArrayList<>(); comActQuestnaireSubSelectionDOs.forEach(comActQuestnaireSubSelectionDO -> { ComActQuestnaireSubSelectionVO comActQuestnaireSubSelectionVO = new ComActQuestnaireSubSelectionVO(); BeanUtils.copyProperties(comActQuestnaireSubSelectionDO, comActQuestnaireSubSelectionVO); comActQuestnaireSubSelectionVOs.add(comActQuestnaireSubSelectionVO); }); usersSubAnswerVO.setQuestSelectionList(comActQuestnaireSubSelectionVOs); // 用户回答 if (userId != null) { List questnaireAnswerContentDOList = questnaireAnswerContentDAO.selectList(new QueryWrapper().lambda() .eq(ComActQuestnaireAnswerContentDO::getUserId, userId) .eq(ComActQuestnaireAnswerContentDO::getSubId, subId)); List questnaireAnswerContentVOList = new ArrayList<>(); questnaireAnswerContentDOList.forEach(questnaireAnswerContentDO -> { ComActQuestnaireAnswerContentVO comActQuestnaireSubSelectionVO = new ComActQuestnaireAnswerContentVO(); BeanUtils.copyProperties(questnaireAnswerContentDO, comActQuestnaireSubSelectionVO); questnaireAnswerContentVOList.add(comActQuestnaireSubSelectionVO); }); usersSubAnswerVO.setUsersAnswer(questnaireAnswerContentVOList); } usersSubAnswerVOList.add(usersSubAnswerVO); }); usersAnswerVO.setUsersSubAnswer(usersSubAnswerVOList); return R.ok(usersAnswerVO); } @Override public R answerResultList(Long questId) { QuestnaireAnswersDTO questnaireAnswersDTO = new QuestnaireAnswersDTO(); /** * 查询题目 */ List list = questnaireSubDAO.selectList( new QueryWrapper().lambda() .eq(ComActQuestnaireSubDO::getQueId, questId).orderByAsc(ComActQuestnaireSubDO::getCreateAt)); List listSubVo = new ArrayList<>(); list.forEach(subDo -> { if(!subDo.getType().equals(ComActQuestnaireSubDO.type.describe)){ ComActQuestnaireSubVO comActQuestnaireSubVO = new ComActQuestnaireSubVO(); BeanUtils.copyProperties(subDo, comActQuestnaireSubVO); listSubVo.add(comActQuestnaireSubVO); } }); questnaireAnswersDTO.setSubs(listSubVo); /** * 查询用户回答 */ List questnaireAnswerContentDOList = questnaireAnswerContentDAO.selectListByQuestnaire(questId); questnaireAnswersDTO.setAnswers(questnaireAnswerContentDOList); return R.ok(questnaireAnswersDTO); } @Override public R qaQeustDetails(PageQuestnaireSubDetailsDTO pageQuestnaireSubDetailsDTO) { Page userPage = new Page(pageQuestnaireSubDetailsDTO.getPageNum(), pageQuestnaireSubDetailsDTO.getPageSize()); IPage doPager = questnaireAnswerContentDAO.selectVoByPage(userPage, pageQuestnaireSubDetailsDTO); return R.ok(doPager); } @Override public R pageQuestnaireAnswer(PageQuestnaireAnswerDTO pageQuestnaireAnswerDTO) { if (pageQuestnaireAnswerDTO.getPageNum() == null || pageQuestnaireAnswerDTO.getPageNum().longValue() == 0) { pageQuestnaireAnswerDTO.setPageNum(1L); } if (pageQuestnaireAnswerDTO.getPageSize() == null || pageQuestnaireAnswerDTO.getPageSize().longValue() == 0) { pageQuestnaireAnswerDTO.setPageSize(10L); } Page userPage = new Page(pageQuestnaireAnswerDTO.getPageNum(), pageQuestnaireAnswerDTO.getPageSize()); IPage doPager = questnaireAnswerContentDAO.selectAnswersByPage(userPage, pageQuestnaireAnswerDTO); return R.ok(doPager); } @Override @Transactional(rollbackFor = Exception.class) public R usersAnsweQuestnaire(UsersAnswerQuestnaireVO answerQuestnaireVO) { if (answerQuestnaireVO == null || answerQuestnaireVO.getJsonObject() == null) { return R.fail("数据为空!"); } Long userId = answerQuestnaireVO.getUserId(); Long questId = answerQuestnaireVO.getQuestId(); Date nowDate = new Date(); ComActQuestnaireDO questnaireDO = questnaireDAO.selectById(questId); if (questnaireDO == null) { return R.fail("调查问卷不存在!"); } if (!questnaireDO.getState().equals(ComActQuestnaireDO.state.dyz)) { return R.fail("该调查问卷已结束,不可提交!"); } ComActQuestnaireUserAnswerDO oldUserAnswerDO = comActQuestnaireUserAnswerMapper.selectOne(new QueryWrapper().lambda() .eq(ComActQuestnaireUserAnswerDO::getQuestnaireId, questId) .eq(ComActQuestnaireUserAnswerDO::getUserId, userId)); if (oldUserAnswerDO != null) { return R.fail("您已填写该问卷,不可重复提交"); } // 查询填报人员信息 R userResult = userService.getUserInfoByUserId(userId + ""); if (!R.isOk(userResult)) { log.error("填写问卷调查失败,未查询到用户信息"); return R.fail("填写失败"); } LoginUserInfoVO userInfo = userResult.getData(); if (questnaireDO.getForParty().equals(ComActQuestnaireDO.isOk.yes)) { if (!userInfo.getIsPartymember().equals(1)) { return R.fail("您还未进行党员认证,无法填报"); } } if (questnaireDO.getForVolunteer().equals(ComActQuestnaireDO.isOk.yes)) { if (!userInfo.getIsVolunteer().equals(1)) { return R.fail("您还未进行志愿者认证,无法填报"); } } List answerContentList = new ArrayList<>(); // 解析用户上传json数据 List questnaiteSubVOS = JSON.parseArray(answerQuestnaireVO.getJsonObject(), QuestnaiteSubVO.class); if (!questnaiteSubVOS.isEmpty()) { for (QuestnaiteSubVO questnaiteSub : questnaiteSubVOS) { // 查询用户填写题目 ComActQuestnaireSubDO questnaireSubDO = questnaireSubDAO.selectOne( new QueryWrapper().lambda().eq(ComActQuestnaireSubDO::getQueId, questId) .eq(ComActQuestnaireSubDO::getKey, questnaiteSub.getKey())); if (questnaireSubDO == null) { log.error("未查询到调查问卷题目,题目名称:" + questnaiteSub.getLabel() + "题目key:" + questnaiteSub.getKey()); continue; } Long queSubId = questnaireSubDO.getId(); // 根据上传的类型查询不同的题目选项 if (questnaiteSub.getType().equals(QuestnaiteSubVO.type.danxuan) || questnaiteSub.getType().equals(QuestnaiteSubVO.type.imgselect)) { // 单选题处理 ComActQuestnaireSubSelectionDO subSelectionDO = questnaireSubSelectionDAO.selectOne(new QueryWrapper().lambda() .eq(ComActQuestnaireSubSelectionDO::getQueSubId, queSubId) .eq(ComActQuestnaireSubSelectionDO::getQueId, questId) .eq(ComActQuestnaireSubSelectionDO::getKey, questnaiteSub.getValues())); if (subSelectionDO == null) { log.error("未查询到调查问卷选项,题目名称:" + questnaiteSub.getLabel() + "选项key:" + questnaiteSub.getValues()); continue; } ComActQuestnaireAnswerContentDO answerContentDO = new ComActQuestnaireAnswerContentDO(); answerContentDO.setUserId(userId); answerContentDO.setCreateAt(nowDate); answerContentDO.setCreateBy(userId); answerContentDO.setSelectionId(subSelectionDO.getId()); answerContentDO.setSubId(queSubId); answerContentDO.setType(1); answerContentDO.setChoice(subSelectionDO.getOptionName()); answerContentDO.setAnswerContent(subSelectionDO.getContent()); answerContentList.add(answerContentDO); } else if (questnaiteSub.getType().equals(QuestnaiteSubVO.type.duoxuan)) { // 多选题处理 String values = questnaiteSub.getValues(); String[] value = values.split(","); for (int i = 0; i < value.length; i++) { ComActQuestnaireSubSelectionDO subSelectionDO = questnaireSubSelectionDAO.selectOne(new QueryWrapper() .lambda().eq(ComActQuestnaireSubSelectionDO::getQueSubId, queSubId) .eq(ComActQuestnaireSubSelectionDO::getQueId, questId) .eq(ComActQuestnaireSubSelectionDO::getKey, value[i])); if (subSelectionDO == null) { log.error( "未查询到调查问卷选项,题目名称:" + questnaiteSub.getLabel() + "选项key:" + questnaiteSub.getValues()); continue; } ComActQuestnaireAnswerContentDO answerContentDO = new ComActQuestnaireAnswerContentDO(); answerContentDO.setUserId(userId); answerContentDO.setCreateAt(nowDate); answerContentDO.setCreateBy(userId); answerContentDO.setSelectionId(subSelectionDO.getId()); answerContentDO.setSubId(queSubId); answerContentDO.setType(1); answerContentDO.setChoice(subSelectionDO.getOptionName()); answerContentDO.setAnswerContent(subSelectionDO.getContent()); answerContentList.add(answerContentDO); } } else { // 问答题处理 String values = questnaiteSub.getValues(); ComActQuestnaireAnswerContentDO answerContentDO = new ComActQuestnaireAnswerContentDO(); answerContentDO.setUserId(userId); answerContentDO.setCreateAt(nowDate); answerContentDO.setCreateBy(userId); answerContentDO.setSubId(queSubId); answerContentDO.setType(2); answerContentDO.setAnswerContent(values); answerContentList.add(answerContentDO); } } } // 新增用户填写的答卷 if (!answerContentList.isEmpty()) { // 更新回答用户数量 Integer joinCount = questnaireDO.getJoinCount(); questnaireDO.setJoinCount(joinCount != null ? joinCount + 1 : 1); questnaireDAO.updateById(questnaireDO); // 新增用户答题记录 ComActQuestnaireUserAnswerDO userAnswerDO = new ComActQuestnaireUserAnswerDO(); userAnswerDO.setQuestnaireId(questId); userAnswerDO.setUserId(userId); userAnswerDO.setCreateAt(nowDate); userAnswerDO.setJsonObject(answerQuestnaireVO.getJsonObject()); comActQuestnaireUserAnswerMapper.insert(userAnswerDO); answerContentList.forEach(answerContent -> { answerContent.setAnswerId(userAnswerDO.getId()); }); answerContentService.saveBatch(answerContentList); } return R.ok(); } /** * 社区后台-查询问卷调查详情 * * @param questId * 问卷id * @return 问卷调查详情 */ @Override public R getQuesDetailAdmin(Long questId) { QuestnaireDetailAdminVO result = questnaireDAO.getQuesDetailAdmin(questId); if (result == null) { return R.fail("未查询到该记录"); } return R.ok(result); } /** * 小程序-问卷调查详情 * * @param userId * 用户id * @param questId * 问卷id * @return 问卷调查详情 */ @Override public R getQuesDetail(Long questId, Long userId) { QuestnaireDetailAdminVO result = questnaireDAO.getQuesDetail(questId, userId); if (result == null) { return R.fail("未查询到该记录"); } ComActQuestnaireUserAnswerDO oldUserAnswerDO = comActQuestnaireUserAnswerMapper.selectOne(new QueryWrapper().lambda() .eq(ComActQuestnaireUserAnswerDO::getQuestnaireId, questId) .eq(ComActQuestnaireUserAnswerDO::getUserId, userId)); if (oldUserAnswerDO != null) { result.setIsOk(1); } return R.ok(result); } /** * 问卷调查统计汇总 * * @param summaryDTO * 请求参数 * @return 统计汇总 */ @Override public R statisticsSummary(StatisticsSummaryDTO summaryDTO) { IPage summaryAdminList = questnaireDAO .getStatisticsSummaryAdmin(new Page(summaryDTO.getPageNum(), summaryDTO.getPageSize()), summaryDTO); summaryAdminList.getRecords().forEach(summary -> { if (summary.getAllCount().equals(0)) { summary.setTag(BigDecimal.ZERO); } else { summary.setTag(BigDecimal.valueOf(summary.getCount()) .divide(BigDecimal.valueOf(summary.getAllCount()), 2, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100))); } }); return R.ok(summaryAdminList); } /** * 问卷调查统计汇总导出数据查询 * * @param questId * 调查问卷id * @return 调查统计汇总导出数据 */ @Override public R statisticsSummaryExport(Long questId) { List summaryExcelList = questnaireDAO.getStatisticsSummaryExcelAdmin(questId); summaryExcelList.forEach(summary -> { if (summary.getAllCount().equals(0)) { summary.setTag(BigDecimal.ZERO); } else { summary.setTag(BigDecimal.valueOf(summary.getCount()) .divide(BigDecimal.valueOf(summary.getAllCount()), 2, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100))); } }); return R.ok(summaryExcelList); } /** * 问卷调查统计汇总表头统计 * * @param questId * 调查问卷id * @return 问卷调查统计汇总表头统计数据 */ @Override public R statisticsSummaryHeader(Long questId, Long communityId) { QuestnaireStatisticsSummaryHeaderAdminVO summaryHeaderAdminVO = this.questnaireDAO.statisticsSummaryHeader(questId, communityId); if (summaryHeaderAdminVO != null) { if (!summaryHeaderAdminVO.getUserCount().equals(0)) { BigDecimal nub1 = BigDecimal.valueOf(summaryHeaderAdminVO.getAllCount()); BigDecimal nub2 = BigDecimal.valueOf(summaryHeaderAdminVO.getUserCount()); BigDecimal result = nub1.divide(nub2, 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); summaryHeaderAdminVO.setTag(result); } } return R.ok(summaryHeaderAdminVO); } /** * 定时任务检测待发布,调研中的问卷调查状态 */ @Override @Transactional(rollbackFor = Exception.class) public R timedTaskQuestionnaire() { Date nowDate = new Date(); // 查询所有开始时间已经超过当前时间的待发布状态调查问卷 List questnaireDOList = questnaireDAO.selectList(new QueryWrapper() .lambda().eq(ComActQuestnaireDO::getState, ComActQuestnaireDO.state.dfb) .eq(ComActQuestnaireDO::getIsHide, 0).le(ComActQuestnaireDO::getStartTime, nowDate)); questnaireDOList.forEach(questnaire -> { questnaire.setState(ComActQuestnaireDO.state.dyz); questnaire.setPublishTime(nowDate); questnaireDAO.updateById(questnaire); }); // 查询所有结束时间已经超过当前时间的调研中状态调查问卷 List questnaireList = questnaireDAO.selectList(new QueryWrapper() .lambda().eq(ComActQuestnaireDO::getState, ComActQuestnaireDO.state.dyz) .eq(ComActQuestnaireDO::getIsHide, 0).le(ComActQuestnaireDO::getEndTime, nowDate)); questnaireList.forEach(questnaire -> { questnaire.setState(ComActQuestnaireDO.state.yjs); questnaireDAO.updateById(questnaire); }); return R.ok(); } /** * 小程序-新增问卷调查浏览数量 * * @param questId * 问卷调查id * @return 增加结果 */ @Override public R addQuestnaireView(Long questId) { ComActQuestnaireDO questnaireDO = questnaireDAO.selectById(questId); if (questnaireDO != null) { questnaireDO.setViewNum(questnaireDO.getViewNum() + 1); questnaireDAO.updateById(questnaireDO); } return R.ok(); } /** * 小程序-用户弹窗添加不在提醒接口 * * @param questId * 问卷id * @param userId * 用户id * @return 添加结果 */ @Override public R addNoNotice(Long questId, Long userId) { questnaireDAO.addNoNotice(questId, userId); return R.ok(); } }