外呼统计修改

This commit is contained in:
zhangheng 2026-03-05 10:43:22 +08:00
parent 66c8db8e1b
commit 71711b2b9d
6 changed files with 195 additions and 12 deletions

View File

@ -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;
}
}

View File

@ -2,6 +2,7 @@ package com.xinelu.manage.mapper.questionsubject;
import com.xinelu.manage.domain.questionsubject.QuestionSubject; import com.xinelu.manage.domain.questionsubject.QuestionSubject;
import com.xinelu.manage.vo.questionsubject.QuestionSubjectVO; import com.xinelu.manage.vo.questionsubject.QuestionSubjectVO;
import com.xinelu.manage.vo.statistics.QuestionnaireTaskStatisticsVo;
import java.util.List; import java.util.List;
@ -84,4 +85,12 @@ public interface QuestionSubjectMapper {
* @return 结果 * @return 结果
*/ */
int deleteSubjectByQuestionInfoId(Long questionInfoId); int deleteSubjectByQuestionInfoId(Long questionInfoId);
/**
* 原问卷选项信息
*
* @param questionnaireId 问卷id
* @return QuestionnaireTaskStatisticsVo
*/
List<QuestionnaireTaskStatisticsVo> selectQuestionnaireByQuestionnaireId(Long questionnaireId);
} }

View File

@ -4,6 +4,7 @@ import com.xinelu.common.core.domain.AjaxResult;
import com.xinelu.common.core.domain.entity.SysUser; import com.xinelu.common.core.domain.entity.SysUser;
import com.xinelu.common.enums.NodeTypeEnum; import com.xinelu.common.enums.NodeTypeEnum;
import com.xinelu.common.enums.PhoneDialMethodEnum; import com.xinelu.common.enums.PhoneDialMethodEnum;
import com.xinelu.common.enums.QuestionSubjectTypeEnum;
import com.xinelu.common.enums.QuestionTypeEnum; import com.xinelu.common.enums.QuestionTypeEnum;
import com.xinelu.common.utils.StringUtils; import com.xinelu.common.utils.StringUtils;
import com.xinelu.manage.domain.agency.Agency; 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.department.DepartmentMapper;
import com.xinelu.manage.mapper.patientvisitrecord.PatientVisitRecordMapper; import com.xinelu.manage.mapper.patientvisitrecord.PatientVisitRecordMapper;
import com.xinelu.manage.mapper.phonedialrecord.PhoneDialRecordMapper; 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.shortmessagesendrecord.ShortMessageSendRecordMapper;
import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper; import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper;
import com.xinelu.manage.mapper.subscribemessagesendrecord.SubscribeMessageSendRecordMapper; import com.xinelu.manage.mapper.subscribemessagesendrecord.SubscribeMessageSendRecordMapper;
@ -70,6 +72,8 @@ public class StatisticsServiceImpl implements IStatisticsService {
private DepartmentMapper departmentMapper; private DepartmentMapper departmentMapper;
@Resource @Resource
private SysUserMapper sysUserMapper; private SysUserMapper sysUserMapper;
@Resource
private QuestionSubjectMapper questionSubjectMapper;
/** /**
* @description 随访成功率统计 * @description 随访成功率统计
@ -317,23 +321,76 @@ public class StatisticsServiceImpl implements IStatisticsService {
*/ */
@Override @Override
public AjaxResult questionnaireTaskStatistics(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto) { public AjaxResult questionnaireTaskStatistics(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto) {
List<QuestionnaireTaskStatisticsVo> output = new ArrayList<>();
//查询原问卷信息
List<QuestionnaireTaskStatisticsVo> subjectAndOptionVos = questionSubjectMapper.selectQuestionnaireByQuestionnaireId(questionnaireTaskStatisticsDto.getQuestionInfoId());
//空数据组装返回
if (CollectionUtils.isEmpty(subjectAndOptionVos)) {
return AjaxResult.success();
}
//查询问卷任务 //查询问卷任务
List<QuestionnaireTaskStatisticsVo> questionnaireTaskStatisticsVos = signPatientManageRouteNodeMapper.questionnaireTaskStatistics(questionnaireTaskStatisticsDto); List<QuestionnaireTaskStatisticsVo> questionnaireTaskStatisticsVos = signPatientManageRouteNodeMapper.questionnaireTaskStatistics(questionnaireTaskStatisticsDto);
//遍历计算比例 //空数据返回原问卷信息
if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVos)){ List<Long> total = null;
for (QuestionnaireTaskStatisticsVo questionnaireTaskStatisticsVo : questionnaireTaskStatisticsVos) { if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVos)) {
//除数不能为空或0 questionnaireTaskStatisticsVos = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getQuestionSubjectOptionId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos()) && Objects.nonNull(questionnaireTaskStatisticsVo.getTotal()) && questionnaireTaskStatisticsVo.getTotal() != 0){ total = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull).map(QuestionnaireTaskStatisticsVo::getManageRouteNodeId).distinct().collect(Collectors.toList());
questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos() }
.forEach(item -> item.setChoiceProportion( //遍历计算
new BigDecimal(item.getChoiceNumber()) List<QuestionnaireTaskOptionStatisticsVo> optionStatisticsVos = new ArrayList<>();
.divide(new BigDecimal(questionnaireTaskStatisticsVo.getTotal()),2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")))); if (questionnaireTaskStatisticsVos.size() > 0 && total != null && total.size() > 0) {
} else if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos()) && (Objects.isNull(questionnaireTaskStatisticsVo.getTotal()) || questionnaireTaskStatisticsVo.getTotal() == 0)){ for (QuestionnaireTaskStatisticsVo subjectAndOptionVo : subjectAndOptionVos) {
questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos().forEach(item -> item.setChoiceProportion(BigDecimal.ZERO)); QuestionnaireTaskOptionStatisticsVo optionStatisticsVo = new QuestionnaireTaskOptionStatisticsVo();
//根据 题目序号选项已选择过滤
List<QuestionnaireTaskStatisticsVo> 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<BigDecimal> 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<QuestionnaireTaskOptionStatisticsVo> 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);
} }
/** /**

View File

@ -1,9 +1,11 @@
package com.xinelu.manage.vo.statistics; package com.xinelu.manage.vo.statistics;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
/** /**
* @description: 问卷任务统计选项返回值 * @description: 问卷任务统计选项返回值
@ -75,4 +77,20 @@ public class QuestionnaireTaskOptionStatisticsVo {
* 选择比例 * 选择比例
*/ */
private BigDecimal choiceProportion; private BigDecimal choiceProportion;
/**
* 题目序号
*/
private BigDecimal questionNumber;
/**
* 问卷标题(上层数据使用)
*/
private String questionnaireName;
/**
* 创建时间(上层数据使用)
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
} }

View File

@ -22,6 +22,12 @@ public class QuestionnaireTaskStatisticsVo {
@ApiModelProperty(value = "问卷提交结果信息表id") @ApiModelProperty(value = "问卷提交结果信息表id")
private Long questionSubmitResultId; private Long questionSubmitResultId;
/**
* 问卷选项id
*/
@ApiModelProperty(value = "问卷选项id")
private Long questionSubmitId;
/** /**
* 问卷表id * 问卷表id
*/ */
@ -48,6 +54,36 @@ public class QuestionnaireTaskStatisticsVo {
@ApiModelProperty(value = "题目名称") @ApiModelProperty(value = "题目名称")
private String questionName; 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") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime; private LocalDateTime createTime;
/**
* 填写问卷总数
*/
private Long manageRouteNodeId;
/**
* 选择比例
*/
private BigDecimal choiceProportion;
} }

View File

@ -369,4 +369,20 @@
from question_subject from question_subject
where question_info_id = #{questionInfoId} where question_info_id = #{questionInfoId}
</delete> </delete>
<select id="selectQuestionnaireByQuestionnaireId"
resultType="com.xinelu.manage.vo.statistics.QuestionnaireTaskStatisticsVo">
select qs.question_info_id,
qs.id questionSubjectId,
qs.question_number,
qs.question_type,
qs.question_name,
qso.id questionSubjectOptionId,
qso.option_name,
qso.option_sort
from question_subject qs
LEFT JOIN question_subject_option qso ON qso.questionnaire_subject_id = qs.id
where qs.question_info_id = #{questionnaireId}
order by qs.question_number ASC, qso.id ASC
</select>
</mapper> </mapper>