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/mapper/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.java b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.java index 5625ecc4..279a4fa5 100644 --- a/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.java +++ b/postdischarge-manage/src/main/java/com/xinelu/manage/mapper/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.java @@ -272,4 +272,12 @@ public interface SignPatientManageRouteNodeMapper { * @return QuestionSubmitExportVo */ List selectQuestionSubmit(List manageRouteNodeIds); + + /** + * 管理任务节点数据根据问卷id + * + * @param questionnaireTaskStatisticsDto 信息 + * @return int + */ + int selectRouteNodeCountByQuestionId(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto); } 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..13061479 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; @@ -27,26 +29,25 @@ import com.xinelu.manage.vo.signpatientmanageroutenode.UploadRobotPublishRecordV import com.xinelu.manage.vo.statistics.*; import com.xinelu.system.mapper.SysUserMapper; import com.xinelu.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; -import javax.annotation.Resource; -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Service; /** * @description: 统计模块Service业务层处理 * @author: haown * @create: 2024-10-31 11:24 **/ +@Slf4j @Service public class StatisticsServiceImpl implements IStatisticsService { @@ -70,6 +71,8 @@ public class StatisticsServiceImpl implements IStatisticsService { private DepartmentMapper departmentMapper; @Resource private SysUserMapper sysUserMapper; + @Resource + private QuestionSubjectMapper questionSubjectMapper; /** * @description 随访成功率统计 @@ -317,23 +320,76 @@ public class StatisticsServiceImpl implements IStatisticsService { */ @Override public AjaxResult questionnaireTaskStatistics(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto) { - //查询问卷任务 - 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)); - } - } - } - return AjaxResult.success(questionnaireTaskStatisticsVos); + List output = new ArrayList<>(); + //查询原问卷信息 + List subjectAndOptionVos = questionSubjectMapper.selectQuestionnaireByQuestionnaireId(questionnaireTaskStatisticsDto.getQuestionInfoId()); + //空数据组装返回 + if (CollectionUtils.isEmpty(subjectAndOptionVos)) { + return AjaxResult.success(); + } + //查询问卷任务 + List questionnaireTaskStatisticsVos = signPatientManageRouteNodeMapper.questionnaireTaskStatistics(questionnaireTaskStatisticsDto); + //空数据返回原问卷信息 + 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); + } + } + //根据题号组装数据类型 + 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} + + diff --git a/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml b/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml index a5e956f0..89b51032 100644 --- a/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml +++ b/postdischarge-manage/src/main/resources/mapper/manage/signpatientmanageroutenode/SignPatientManageRouteNodeMapper.xml @@ -1242,11 +1242,11 @@ @@ -1557,4 +1537,30 @@ ORDER BY pqsm.create_time DESC + +