diff --git a/postdischarge-common/src/main/java/com/xinelu/common/enums/QuestionSubjectTypeEnum.java b/postdischarge-common/src/main/java/com/xinelu/common/enums/QuestionSubjectTypeEnum.java new file mode 100644 index 00000000..c94c491c --- /dev/null +++ b/postdischarge-common/src/main/java/com/xinelu/common/enums/QuestionSubjectTypeEnum.java @@ -0,0 +1,37 @@ +package com.xinelu.common.enums; + +import lombok.Getter; + +/** + * 问卷题目选项类型 + */ +@Getter +public enum QuestionSubjectTypeEnum { + + /** + * 单选题 + */ + MULTIPLE_CHOICE("MULTIPLE_CHOICE"), + + /** + * 多选题 + */ + MULTIPLE_CHOICE_QUESTIONS("MULTIPLE_CHOICE_QUESTIONS"), + + /** + * 填空题 + */ + FILL_IN_THE_BLANKS("FILL_IN_THE_BLANKS"), + + /** + * 反馈填空题 + */ + FEEDBACK_BLANKS_SUBJECT("FEEDBACK_BLANKS_SUBJECT"), + ; + + final private String info; + + QuestionSubjectTypeEnum(String info) { + this.info = info; + } +} diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/questionsubject/QuestionSubjectMapper.java b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/questionsubject/QuestionSubjectMapper.java index aec4ec82..37e99eae 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/questionsubject/QuestionSubjectMapper.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/questionsubject/QuestionSubjectMapper.java @@ -2,6 +2,7 @@ package com.xinelu.manage.mapper.questionsubject; import com.xinelu.manage.domain.questionsubject.QuestionSubject; import com.xinelu.manage.vo.questionsubject.QuestionSubjectVO; +import com.xinelu.manage.vo.statistics.QuestionnaireTaskStatisticsVo; import java.util.List; @@ -84,4 +85,12 @@ public interface QuestionSubjectMapper { * @return 结果 */ int deleteSubjectByQuestionInfoId(Long questionInfoId); + + /** + * 原问卷选项信息 + * + * @param questionnaireId 问卷id + * @return QuestionnaireTaskStatisticsVo + */ + List selectQuestionnaireByQuestionnaireId(Long questionnaireId); } diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/service/statistics/impl/StatisticsServiceImpl.java b/postdischarge-manage/src/main/java/com/xinelu/manage/service/statistics/impl/StatisticsServiceImpl.java index 20c53d30..367685a9 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/service/statistics/impl/StatisticsServiceImpl.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/service/statistics/impl/StatisticsServiceImpl.java @@ -4,6 +4,7 @@ import com.xinelu.common.core.domain.AjaxResult; import com.xinelu.common.core.domain.entity.SysUser; import com.xinelu.common.enums.NodeTypeEnum; import com.xinelu.common.enums.PhoneDialMethodEnum; +import com.xinelu.common.enums.QuestionSubjectTypeEnum; import com.xinelu.common.enums.QuestionTypeEnum; import com.xinelu.common.utils.StringUtils; import com.xinelu.manage.domain.agency.Agency; @@ -14,6 +15,7 @@ import com.xinelu.manage.dto.statistics.QuestionnaireTaskStatisticsDto; import com.xinelu.manage.mapper.department.DepartmentMapper; import com.xinelu.manage.mapper.patientvisitrecord.PatientVisitRecordMapper; import com.xinelu.manage.mapper.phonedialrecord.PhoneDialRecordMapper; +import com.xinelu.manage.mapper.questionsubject.QuestionSubjectMapper; import com.xinelu.manage.mapper.shortmessagesendrecord.ShortMessageSendRecordMapper; import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper; import com.xinelu.manage.mapper.subscribemessagesendrecord.SubscribeMessageSendRecordMapper; @@ -70,6 +72,8 @@ public class StatisticsServiceImpl implements IStatisticsService { private DepartmentMapper departmentMapper; @Resource private SysUserMapper sysUserMapper; + @Resource + private QuestionSubjectMapper questionSubjectMapper; /** * @description 随访成功率统计 @@ -317,23 +321,76 @@ public class StatisticsServiceImpl implements IStatisticsService { */ @Override public AjaxResult questionnaireTaskStatistics(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto) { + List output = new ArrayList<>(); + //查询原问卷信息 + List subjectAndOptionVos = questionSubjectMapper.selectQuestionnaireByQuestionnaireId(questionnaireTaskStatisticsDto.getQuestionInfoId()); + //空数据组装返回 + if (CollectionUtils.isEmpty(subjectAndOptionVos)) { + return AjaxResult.success(); + } //查询问卷任务 List questionnaireTaskStatisticsVos = signPatientManageRouteNodeMapper.questionnaireTaskStatistics(questionnaireTaskStatisticsDto); - //遍历计算比例 - if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVos)){ - for (QuestionnaireTaskStatisticsVo questionnaireTaskStatisticsVo : questionnaireTaskStatisticsVos) { - //除数不能为空或0 - if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos()) && Objects.nonNull(questionnaireTaskStatisticsVo.getTotal()) && questionnaireTaskStatisticsVo.getTotal() != 0){ - questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos() - .forEach(item -> item.setChoiceProportion( - new BigDecimal(item.getChoiceNumber()) - .divide(new BigDecimal(questionnaireTaskStatisticsVo.getTotal()),2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")))); - } else if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos()) && (Objects.isNull(questionnaireTaskStatisticsVo.getTotal()) || questionnaireTaskStatisticsVo.getTotal() == 0)){ - questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos().forEach(item -> item.setChoiceProportion(BigDecimal.ZERO)); + //空数据返回原问卷信息 + List total = null; + if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVos)) { + questionnaireTaskStatisticsVos = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getQuestionSubjectOptionId())).collect(Collectors.toList()); + total = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull).map(QuestionnaireTaskStatisticsVo::getManageRouteNodeId).distinct().collect(Collectors.toList()); + } + //遍历计算 + List optionStatisticsVos = new ArrayList<>(); + if (questionnaireTaskStatisticsVos.size() > 0 && total != null && total.size() > 0) { + for (QuestionnaireTaskStatisticsVo subjectAndOptionVo : subjectAndOptionVos) { + QuestionnaireTaskOptionStatisticsVo optionStatisticsVo = new QuestionnaireTaskOptionStatisticsVo(); + //根据 题目序号、选项已选择过滤 + List choice = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull) + .filter(item -> Objects.nonNull(item.getQuestionNumber()) && item.getQuestionNumber().equals(subjectAndOptionVo.getQuestionNumber()) + && Objects.equals(item.getQuestionSubjectOptionId(), subjectAndOptionVo.getQuestionSubjectOptionId()) + && item.getOptionChooseSign() == 0) + .collect(Collectors.toList()); + if (choice.size() > 0) { + subjectAndOptionVo.setChoiceProportion(new BigDecimal(choice.size()).divide(new BigDecimal(total.size()), 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))); + optionStatisticsVo.setChoiceNumber((long) choice.size()); + } else { + subjectAndOptionVo.setChoiceProportion(BigDecimal.ZERO); + optionStatisticsVo.setChoiceNumber(0L); } + optionStatisticsVo.setQuestionSubjectOptionId(subjectAndOptionVo.getQuestionSubjectOptionId()); + optionStatisticsVo.setQuestionInfoId(questionnaireTaskStatisticsDto.getQuestionInfoId()); + optionStatisticsVo.setOptionName(subjectAndOptionVo.getOptionName()); + optionStatisticsVo.setQuestionNumber(subjectAndOptionVo.getQuestionNumber()); + optionStatisticsVo.setChoiceProportion(subjectAndOptionVo.getChoiceProportion()); + optionStatisticsVos.add(optionStatisticsVo); + } + } else { + //如果没数据返回问卷模板 + for (QuestionnaireTaskStatisticsVo subjectAndOptionVo : subjectAndOptionVos) { + QuestionnaireTaskOptionStatisticsVo optionStatisticsVo = new QuestionnaireTaskOptionStatisticsVo(); + optionStatisticsVo.setQuestionInfoId(questionnaireTaskStatisticsDto.getQuestionInfoId()); + optionStatisticsVo.setQuestionSubjectOptionId(subjectAndOptionVo.getQuestionSubjectOptionId()); + optionStatisticsVo.setOptionName(subjectAndOptionVo.getOptionName()); + optionStatisticsVo.setQuestionNumber(subjectAndOptionVo.getQuestionNumber()); + optionStatisticsVo.setChoiceProportion(BigDecimal.ZERO); + optionStatisticsVo.setChoiceNumber(0L); + optionStatisticsVos.add(optionStatisticsVo); } } - return AjaxResult.success(questionnaireTaskStatisticsVos); + //根据题号组装数据类型 + List questionNumberList = subjectAndOptionVos.stream().filter(Objects::nonNull) + .filter(item -> item.getQuestionType().equals(QuestionSubjectTypeEnum.MULTIPLE_CHOICE.getInfo()) || item.getQuestionType().equals(QuestionSubjectTypeEnum.MULTIPLE_CHOICE_QUESTIONS.getInfo())) + .map(QuestionnaireTaskStatisticsVo::getQuestionNumber).distinct().collect(Collectors.toList()); + for (BigDecimal questionNumber : questionNumberList) { + QuestionnaireTaskStatisticsVo questionnaireTaskStatisticsVo = new QuestionnaireTaskStatisticsVo(); + List collect = optionStatisticsVos.stream().filter(Objects::nonNull).filter(item -> questionNumber.equals(item.getQuestionNumber())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(collect)) { + questionnaireTaskStatisticsVo.setQuestionnaireName(collect.get(0).getQuestionnaireName()); + questionnaireTaskStatisticsVo.setCreateTime(collect.get(0).getCreateTime()); + questionnaireTaskStatisticsVo.setQuestionName(collect.get(0).getQuestionName()); + questionnaireTaskStatisticsVo.setQuestionNumber(collect.get(0).getQuestionNumber()); + questionnaireTaskStatisticsVo.setQuestionnaireTaskOptionStatisticsVos(collect); + output.add(questionnaireTaskStatisticsVo); + } + } + return AjaxResult.success(output); } /** diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskOptionStatisticsVo.java b/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskOptionStatisticsVo.java index 66f9dfcf..6642829f 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskOptionStatisticsVo.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskOptionStatisticsVo.java @@ -1,9 +1,11 @@ package com.xinelu.manage.vo.statistics; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; +import java.time.LocalDateTime; /** * @description: 问卷任务统计选项返回值 @@ -75,4 +77,20 @@ public class QuestionnaireTaskOptionStatisticsVo { * 选择比例 */ private BigDecimal choiceProportion; + + /** + * 题目序号 + */ + private BigDecimal questionNumber; + + /** + * 问卷标题(上层数据使用) + */ + private String questionnaireName; + + /** + * 创建时间(上层数据使用) + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; } \ No newline at end of file diff --git a/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskStatisticsVo.java b/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskStatisticsVo.java index 7c9a77af..3141f00b 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskStatisticsVo.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/vo/statistics/QuestionnaireTaskStatisticsVo.java @@ -22,6 +22,12 @@ public class QuestionnaireTaskStatisticsVo { @ApiModelProperty(value = "问卷提交结果信息表id") private Long questionSubmitResultId; + /** + * 问卷选项id + */ + @ApiModelProperty(value = "问卷选项id") + private Long questionSubmitId; + /** * 问卷表id */ @@ -48,6 +54,36 @@ public class QuestionnaireTaskStatisticsVo { @ApiModelProperty(value = "题目名称") private String questionName; + /** + * 问卷选项提交结果信息表id + */ + @ApiModelProperty(value = "问卷选项提交结果信息表id") + private Long patientQuestionOptionResult; + + /** + * 问卷选项信息表id + */ + @ApiModelProperty(value = "问卷选项信息表id") + private Long questionSubjectOptionId; + + /** + * 问卷选项名称 + */ + @ApiModelProperty(value = "问卷选项名称") + private String optionName; + + /** + * 问卷选项排序 + */ + @ApiModelProperty(value = "问卷选项排序") + private Long optionSort; + + /** + * 问卷选项是否选择 + */ + @ApiModelProperty(value = "问卷选项是否选择") + private Integer optionChooseSign; + /** * 填写问卷总数 */ @@ -69,4 +105,14 @@ public class QuestionnaireTaskStatisticsVo { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; + + /** + * 填写问卷总数 + */ + private Long manageRouteNodeId; + + /** + * 选择比例 + */ + private BigDecimal choiceProportion; } \ No newline at end of file diff --git a/postdischarge-manage/src/main/resources/mapper/manage/questionsubject/QuestionSubjectMapper.xml b/postdischarge-manage/src/main/resources/mapper/manage/questionsubject/QuestionSubjectMapper.xml index 28ef85de..2e4fa216 100644 --- a/postdischarge-manage/src/main/resources/mapper/manage/questionsubject/QuestionSubjectMapper.xml +++ b/postdischarge-manage/src/main/resources/mapper/manage/questionsubject/QuestionSubjectMapper.xml @@ -369,4 +369,20 @@ from question_subject where question_info_id = #{questionInfoId} + +