小程序满意度

This commit is contained in:
zhangheng 2024-04-29 13:45:42 +08:00
parent 5b8a78447b
commit 5aa0e7b730
9 changed files with 65 additions and 172 deletions

View File

@ -166,6 +166,8 @@ public class PatientQuestionSubmitResult extends BaseEntity {
@Excel(name = "问卷总得分,根据患者提交问卷得出的分值") @Excel(name = "问卷总得分,根据患者提交问卷得出的分值")
private BigDecimal totalScore; private BigDecimal totalScore;
private Long residentId;
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

View File

@ -105,11 +105,17 @@ public class QuestionInfoServiceImpl implements IQuestionInfoService {
log.info("新增问卷表失败," + questionInfo); log.info("新增问卷表失败," + questionInfo);
throw new SecurityException("新增问卷失败!请联系管理员!"); throw new SecurityException("新增问卷失败!请联系管理员!");
} }
if (CollectionUtils.isEmpty(question.getQuestionSubjectList())) {
throw new SecurityException("请添加问卷信息!");
}
//新增题目表 //新增题目表
List<QuestionSubjectVO> questionSubjectList = question.getQuestionSubjectList(); List<QuestionSubjectVO> questionSubjectList = question.getQuestionSubjectList();
List<QuestionSubject> questionSubjects = new ArrayList<>(); List<QuestionSubject> questionSubjects = new ArrayList<>();
List<QuestionSubjectOptionVO> questionSubjectOptions = new ArrayList<>(); List<QuestionSubjectOptionVO> questionSubjectOptions = new ArrayList<>();
for (QuestionSubjectVO questionSubject : questionSubjectList) { for (QuestionSubjectVO questionSubject : questionSubjectList) {
if (StringUtils.isBlank(questionSubject.getQuestionName())) {
throw new SecurityException("请添加完整问卷题目!");
}
QuestionSubject saveQuestionSubject = new QuestionSubject(); QuestionSubject saveQuestionSubject = new QuestionSubject();
BeanUtils.copyBeanProp(saveQuestionSubject, questionSubject); BeanUtils.copyBeanProp(saveQuestionSubject, questionSubject);
saveQuestionSubject.setQuestionInfoId(questionInfo.getId()); saveQuestionSubject.setQuestionInfoId(questionInfo.getId());
@ -125,6 +131,9 @@ public class QuestionInfoServiceImpl implements IQuestionInfoService {
log.info("新增问卷题目表失败," + questionSubjects); log.info("新增问卷题目表失败," + questionSubjects);
throw new SecurityException("新增问卷失败!请联系管理员!"); throw new SecurityException("新增问卷失败!请联系管理员!");
} }
if (CollectionUtils.isEmpty(questionSubjectOptions)) {
return AjaxResult.success();
}
//新增选项表 //新增选项表
List<QuestionSubjectOption> saveQuestionSubjectOptions = new ArrayList<>(); List<QuestionSubjectOption> saveQuestionSubjectOptions = new ArrayList<>();
for (QuestionSubjectOptionVO questionSubjectOption : questionSubjectOptions) { for (QuestionSubjectOptionVO questionSubjectOption : questionSubjectOptions) {
@ -183,6 +192,9 @@ public class QuestionInfoServiceImpl implements IQuestionInfoService {
List<QuestionSubject> questionSubjects = new ArrayList<>(); List<QuestionSubject> questionSubjects = new ArrayList<>();
List<QuestionSubjectOptionVO> questionSubjectOptions = new ArrayList<>(); List<QuestionSubjectOptionVO> questionSubjectOptions = new ArrayList<>();
for (QuestionSubjectVO questionSubject : questionSubjectList) { for (QuestionSubjectVO questionSubject : questionSubjectList) {
if (StringUtils.isBlank(questionSubject.getQuestionName())) {
throw new SecurityException("请添加完整问卷题目!");
}
QuestionSubject saveQuestionSubject = new QuestionSubject(); QuestionSubject saveQuestionSubject = new QuestionSubject();
BeanUtils.copyBeanProp(saveQuestionSubject, questionSubject); BeanUtils.copyBeanProp(saveQuestionSubject, questionSubject);
saveQuestionSubject.setQuestionInfoId(questionInfo.getId()); saveQuestionSubject.setQuestionInfoId(questionInfo.getId());

View File

@ -219,6 +219,8 @@
</if> </if>
<if test="totalScore != null">total_score, <if test="totalScore != null">total_score,
</if> </if>
<if test="residentId != null">resident_id,
</if>
<if test="remark != null">remark, <if test="remark != null">remark,
</if> </if>
<if test="createBy != null">create_by, <if test="createBy != null">create_by,
@ -269,6 +271,8 @@
</if> </if>
<if test="totalScore != null">#{totalScore}, <if test="totalScore != null">#{totalScore},
</if> </if>
<if test="residentId != null">#{residentId},
</if>
<if test="remark != null">#{remark}, <if test="remark != null">#{remark},
</if> </if>
<if test="createBy != null">#{createBy}, <if test="createBy != null">#{createBy},

View File

@ -54,8 +54,8 @@ public class HomePageController extends BaseController {
* 问卷记录信息 * 问卷记录信息
*/ */
@GetMapping("/selectQuestionSubmit") @GetMapping("/selectQuestionSubmit")
public AjaxResult selectQuestionSubmit(Long patientTaskExecuteRecordId) { public AjaxResult selectQuestionSubmit(Long patientQuestionSubmitResultId) {
return homePageService.selectQuestionSubmit(patientTaskExecuteRecordId); return homePageService.selectQuestionSubmit(patientQuestionSubmitResultId);
} }
/** /**
@ -77,20 +77,12 @@ public class HomePageController extends BaseController {
} }
/** /**
* 已完成满意度问卷 * 满意度问卷
*/ */
@GetMapping("/completedSatisfaction") @GetMapping("/satisfactionQuestionnaire")
private TableDataInfo completedSatisfactionQuestionnaire(Long residentId) { private TableDataInfo satisfactionQuestionnaire(Long residentId) {
startPage(); startPage();
List<SatisfactionQuestionnaire> list = homePageService.completedSatisfactionQuestionnaire(residentId); List<SatisfactionQuestionnaire> list = homePageService.satisfactionQuestionnaire(residentId);
return getDataTable(list); return getDataTable(list);
} }
/**
* 未执行满意度问卷
*/
@GetMapping("/incompleteSatisfaction")
private TableDataInfo incompleteSatisfactionQuestionnaire(Long residentId, Integer pageNum, Integer pageSize) {
return homePageService.incompleteSatisfactionQuestionnaire(residentId, pageNum, pageSize);
}
} }

View File

@ -33,23 +33,10 @@ public interface HomePageMapper {
List<PatientTaskExecuteRecord> selectTaskExecuteRecordByResidentId(@Param("residentId") Long residentId, @Param("nodeExecuteStatus") String nodeExecuteStatus); List<PatientTaskExecuteRecord> selectTaskExecuteRecordByResidentId(@Param("residentId") Long residentId, @Param("nodeExecuteStatus") String nodeExecuteStatus);
/** /**
* 根据居民查询已完成满意度问卷 * 根据居民查询满意度问卷
* *
* @param residentId 居民id * @param residentId 居民id
* @return SatisfactionQuestionnaire * @return SatisfactionQuestionnaire
*/ */
List<SatisfactionQuestionnaire> satisfactionQuestionnaireByResidentId(@Param("residentId") Long residentId, @Param("taskContent") String taskContent, List<SatisfactionQuestionnaire> satisfactionQuestionnaireByResidentId(@Param("residentId") Long residentId, @Param("questionType") String questionType, @Param("questionnaireStatus") String questionnaireStatus);
@Param("questionType") String questionType, @Param("routeNodeName") String routeNodeName);
/**
* 根据居民查询已完成满意度问卷
*
* @param residentId 居民id
* @return SatisfactionQuestionnaire
*/
List<SatisfactionQuestionnaire> incompleteSatisfactionQuestionnaire(@Param("residentId") Long residentId, @Param("taskContent") String taskContent,
@Param("questionType") String questionType, @Param("routeNodeName") String routeNodeName,
@Param("nodeExecuteStatus") String nodeExecuteStatus, @Param("routeCheckStatus") String routeCheckStatus);
} }

View File

@ -39,10 +39,10 @@ public interface HomePageService {
/** /**
* 问卷记录信息 * 问卷记录信息
* *
* @param patientTaskExecuteRecordId 记录表id * @param patientQuestionSubmitResultId 记录表id
* @return AjaxResult * @return AjaxResult
*/ */
AjaxResult selectQuestionSubmit(Long patientTaskExecuteRecordId); AjaxResult selectQuestionSubmit(Long patientQuestionSubmitResultId);
/** /**
* 问卷提交 * 问卷提交
@ -66,14 +66,5 @@ public interface HomePageService {
* @param residentId 居民信息 * @param residentId 居民信息
* @return SatisfactionQuestionnaire * @return SatisfactionQuestionnaire
*/ */
List<SatisfactionQuestionnaire> completedSatisfactionQuestionnaire(Long residentId); List<SatisfactionQuestionnaire> satisfactionQuestionnaire(Long residentId);
/**
* 未执行满意度问卷
*
* @param residentId 居民信息
* @return SatisfactionQuestionnaire
*/
TableDataInfo incompleteSatisfactionQuestionnaire(Long residentId, Integer pageNum, Integer pageSize);
} }

View File

@ -3,7 +3,10 @@ package com.xinelu.mobile.service.homepage.Impl;
import com.xinelu.common.constant.TaskCreateTypeConstant; import com.xinelu.common.constant.TaskCreateTypeConstant;
import com.xinelu.common.core.domain.AjaxResult; import com.xinelu.common.core.domain.AjaxResult;
import com.xinelu.common.core.page.TableDataInfo; import com.xinelu.common.core.page.TableDataInfo;
import com.xinelu.common.enums.*; import com.xinelu.common.enums.NodeExecuteStatusEnum;
import com.xinelu.common.enums.QuestionTypeEnum;
import com.xinelu.common.enums.QuestionnaireStatusEnum;
import com.xinelu.common.enums.RouteNodeNameEnum;
import com.xinelu.common.exception.ServiceException; import com.xinelu.common.exception.ServiceException;
import com.xinelu.common.utils.PageServiceUtil; import com.xinelu.common.utils.PageServiceUtil;
import com.xinelu.common.utils.bean.BeanUtils; import com.xinelu.common.utils.bean.BeanUtils;
@ -153,12 +156,12 @@ public class HomePageServiceImpl implements HomePageService {
/** /**
* 问卷记录信息 * 问卷记录信息
* *
* @param patientTaskExecuteRecordId 记录表id * @param patientQuestionSubmitResultId 记录表id
* @return AjaxResult * @return AjaxResult
*/ */
@Override @Override
public AjaxResult selectQuestionSubmit(Long patientTaskExecuteRecordId) { public AjaxResult selectQuestionSubmit(Long patientQuestionSubmitResultId) {
return AjaxResult.success(submitResultMapper.selectResultByTaskExecuteRecordId(patientTaskExecuteRecordId, null)); return AjaxResult.success(submitResultMapper.selectResultByTaskExecuteRecordId(null, patientQuestionSubmitResultId));
} }
/** /**
@ -170,17 +173,10 @@ public class HomePageServiceImpl implements HomePageService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public AjaxResult updatePatientTaskExecuteRecord(PatientQuestionSubmitResultDTO dto) { public AjaxResult updatePatientTaskExecuteRecord(PatientQuestionSubmitResultDTO dto) {
String routeHandlePerson = dto.getRouteHandlePerson();
LocalDateTime time = LocalDateTime.now(); LocalDateTime time = LocalDateTime.now();
// 更新节点任务表
updateSignPatientManageRouteNode(dto, routeHandlePerson, time);
// 新增患者管理任务执行记录
Long taskExecuteRecordId = insertPatientTaskExecuteRecord(dto, routeHandlePerson, time);
PatientQuestionSubmitResult patientQuestionSubmitResult = new PatientQuestionSubmitResult(); PatientQuestionSubmitResult patientQuestionSubmitResult = new PatientQuestionSubmitResult();
BeanUtils.copyBeanProp(patientQuestionSubmitResult, dto); BeanUtils.copyBeanProp(patientQuestionSubmitResult, dto);
patientQuestionSubmitResult.setCreateBy(routeHandlePerson);
patientQuestionSubmitResult.setCreateTime(time); patientQuestionSubmitResult.setCreateTime(time);
patientQuestionSubmitResult.setTaskExecuteRecordId(taskExecuteRecordId);
// 新增患者问卷提交结果 // 新增患者问卷提交结果
if (patientQuestionSubmitResultMapper.insertPatientQuestionSubmitResult(patientQuestionSubmitResult) <= 0) { if (patientQuestionSubmitResultMapper.insertPatientQuestionSubmitResult(patientQuestionSubmitResult) <= 0) {
throw new ServiceException("新增患者问卷提交结果失败"); throw new ServiceException("新增患者问卷提交结果失败");
@ -195,7 +191,6 @@ public class HomePageServiceImpl implements HomePageService {
PatientQuestionSubjectResult saveQuestionSubject = new PatientQuestionSubjectResult(); PatientQuestionSubjectResult saveQuestionSubject = new PatientQuestionSubjectResult();
BeanUtils.copyBeanProp(saveQuestionSubject, questionSubjectResult); BeanUtils.copyBeanProp(saveQuestionSubject, questionSubjectResult);
saveQuestionSubject.setQuestionSubmitResultId(patientQuestionSubmitResult.getId()); saveQuestionSubject.setQuestionSubmitResultId(patientQuestionSubmitResult.getId());
saveQuestionSubject.setCreateBy(routeHandlePerson);
saveQuestionSubject.setCreateTime(time); saveQuestionSubject.setCreateTime(time);
patientQuestionSubjectResults.add(saveQuestionSubject); patientQuestionSubjectResults.add(saveQuestionSubject);
if (CollectionUtils.isNotEmpty(questionSubjectResult.getOptionResultList())) { if (CollectionUtils.isNotEmpty(questionSubjectResult.getOptionResultList())) {
@ -218,7 +213,6 @@ public class HomePageServiceImpl implements HomePageService {
PatientQuestionSubjectResult patientQuestionSubjectResult = patientQuestionSubjectResults.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getQuestionNumber()) && patientQuestionOptionResult.getQuestionNumber().compareTo(item.getQuestionNumber()) == 0).findFirst().orElse(new PatientQuestionSubjectResult()); PatientQuestionSubjectResult patientQuestionSubjectResult = patientQuestionSubjectResults.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getQuestionNumber()) && patientQuestionOptionResult.getQuestionNumber().compareTo(item.getQuestionNumber()) == 0).findFirst().orElse(new PatientQuestionSubjectResult());
saveQuestionOption.setQuestionSubjectResultId(patientQuestionSubjectResult.getId()); saveQuestionOption.setQuestionSubjectResultId(patientQuestionSubjectResult.getId());
saveQuestionOption.setCreateTime(time); saveQuestionOption.setCreateTime(time);
saveQuestionOption.setCreateBy(routeHandlePerson);
saveQuestionSubjectOptions.add(saveQuestionOption); saveQuestionSubjectOptions.add(saveQuestionOption);
} }
// 新增患者问卷题目选项提交结果 // 新增患者问卷题目选项提交结果
@ -240,77 +234,13 @@ public class HomePageServiceImpl implements HomePageService {
} }
/** /**
* 已完成满意度问卷 * 满意度问卷
* *
* @param residentId 居民信息 * @param residentId 居民信息
* @return SatisfactionQuestionnaire * @return SatisfactionQuestionnaire
*/ */
@Override @Override
public List<SatisfactionQuestionnaire> completedSatisfactionQuestionnaire(Long residentId) { public List<SatisfactionQuestionnaire> satisfactionQuestionnaire(Long residentId) {
return homePageMapper.satisfactionQuestionnaireByResidentId(residentId, TaskContentEnum.QUESTIONNAIRE_SCALE.getInfo(), QuestionTypeEnum.SATISFACTION_QUESTIONNAIRE.getInfo(), RouteNodeNameEnum.AFTER_DISCHARGE.getInfo()); return homePageMapper.satisfactionQuestionnaireByResidentId(residentId, QuestionTypeEnum.SATISFACTION_QUESTIONNAIRE.getInfo(), QuestionnaireStatusEnum.PUBLISHED.getInfo());
}
/**
* 未执行满意度问卷
*
* @param residentId 居民信息
* @return SatisfactionQuestionnaire
*/
@Override
public TableDataInfo incompleteSatisfactionQuestionnaire(Long residentId, Integer pageNum, Integer pageSize) {
List<SatisfactionQuestionnaire> incompleteSatisfaction = homePageMapper.incompleteSatisfactionQuestionnaire(residentId, TaskContentEnum.QUESTIONNAIRE_SCALE.getInfo(), QuestionTypeEnum.SATISFACTION_QUESTIONNAIRE.getInfo(), RouteNodeNameEnum.AFTER_DISCHARGE.getInfo(), NodeExecuteStatusEnum.UNEXECUTED.getInfo(), RouteCheckStatusEnum.AGREE.getInfo());
if (CollectionUtils.isEmpty(incompleteSatisfaction)) {
return pageServiceUtil.getDataTable(incompleteSatisfaction);
}
int total = incompleteSatisfaction.size();
for (SatisfactionQuestionnaire satisfactionQuestionnaire : incompleteSatisfaction) {
if (Objects.nonNull(satisfactionQuestionnaire) && Objects.nonNull(satisfactionQuestionnaire.getDischargeTime())) {
satisfactionQuestionnaire.setExecuteTime(satisfactionQuestionnaire.getDischargeTime().plusDays(satisfactionQuestionnaire.getRouteNodeDay()));
}
}
incompleteSatisfaction.sort(Comparator.comparing(SatisfactionQuestionnaire::getExecuteTime).reversed());
if (Objects.nonNull(pageSize) || Objects.nonNull(pageNum)) {
incompleteSatisfaction = incompleteSatisfaction.stream().skip((long) (pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
}
TableDataInfo dataTable = pageServiceUtil.getDataTable(incompleteSatisfaction);
dataTable.setTotal(total);
return dataTable;
}
/**
* 更新节点任务表
*/
private void updateSignPatientManageRouteNode(PatientQuestionSubmitResultDTO dto, String routeHandlePerson, LocalDateTime time) {
SignPatientManageRouteNode signPatientManageRouteNode = new SignPatientManageRouteNode();
signPatientManageRouteNode.setId(dto.getManageRouteNodeId());
signPatientManageRouteNode.setRouteHandleRemark(dto.getRouteHandleRemark());
signPatientManageRouteNode.setNodeExecuteStatus(NodeExecuteStatusEnum.EXECUTED.toString());
signPatientManageRouteNode.setRouteHandleId(dto.getRouteHandleId());
signPatientManageRouteNode.setRouteHandlePerson(routeHandlePerson);
signPatientManageRouteNode.setUpdateBy(routeHandlePerson);
signPatientManageRouteNode.setUpdateTime(time);
// 更新节点任务表
if (signPatientManageRouteNodeMapper.updateSignPatientManageRouteNode(signPatientManageRouteNode) <= 0) {
throw new ServiceException("更新节点任务表失败");
}
}
/**
* 新增患者管理任务执行记录
*/
private Long insertPatientTaskExecuteRecord(PatientQuestionSubmitResultDTO dto, String routeHandlePerson, LocalDateTime time) {
PatientTaskExecuteRecord patientTaskExecuteRecord = new PatientTaskExecuteRecord();
BeanUtils.copyProperties(dto, patientTaskExecuteRecord);
patientTaskExecuteRecord.setExecuteTime(time);
patientTaskExecuteRecord.setTaskContent(dto.getTaskType());
patientTaskExecuteRecord.setExecutePerson(routeHandlePerson);
patientTaskExecuteRecord.setCreateBy(routeHandlePerson);
patientTaskExecuteRecord.setExecuteType(TaskCreateTypeConstant.MANUAL_CREATE);
patientTaskExecuteRecord.setCreateTime(time);
if (patientTaskExecuteRecordMapper.insertPatientTaskExecuteRecord(patientTaskExecuteRecord) > 0) {
return patientTaskExecuteRecord.getId();
} else {
throw new ServiceException("新增患者管理任务记录失败");
}
} }
} }

View File

@ -8,34 +8,26 @@ import java.time.LocalDateTime;
@Data @Data
public class SatisfactionQuestionnaire { public class SatisfactionQuestionnaire {
/**
* 路径名称
*/
private String manageRouteName;
/** /**
* 执行时间 * 执行时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime executeTime; private LocalDateTime executeTime;
/**
* 节点名称
*/
private String routeNodeName;
/**
* 节点天数
*/
private Integer routeNodeDay;
/** /**
* 问卷标题 * 问卷标题
*/ */
private String questionnaireName; private String questionnaireName;
/** /**
* 出院时间 * 问卷id
*/ */
@JsonFormat(pattern = "yyyy-MM-dd") private Long templateId;
private LocalDateTime dischargeTime;
private String sign;
/***
*
*/
private Long patientQuestionSubmitResultId;
} }

View File

@ -67,40 +67,23 @@
<select id="satisfactionQuestionnaireByResidentId" <select id="satisfactionQuestionnaireByResidentId"
resultType="com.xinelu.mobile.vo.satisfactionquestionnaire.SatisfactionQuestionnaire"> resultType="com.xinelu.mobile.vo.satisfactionquestionnaire.SatisfactionQuestionnaire">
select pter.manage_route_name, SELECT qi.id templateId,
pter.execute_time,
'出院后' as routeNodeName,
spmrn.route_node_day,
qi.questionnaire_name
from patient_task_execute_record pter
LEFT JOIN patient_info pi ON pi.id = pter.patient_id
LEFT JOIN resident_info ri on ri.id = pi.resident_id
LEFT JOIN sign_patient_manage_route_node spmrn ON spmrn.id = pter.manage_route_node_id
LEFT JOIN question_info qi ON spmrn.question_info_id = qi.id
where ri.id = #{residentId}
and pter.task_content = #{taskContent}
and qi.question_type = #{questionType}
and spmrn.route_node_name = #{routeNodeName}
Order BY pter.execute_time DESC
</select>
<select id="incompleteSatisfactionQuestionnaire"
resultType="com.xinelu.mobile.vo.satisfactionquestionnaire.SatisfactionQuestionnaire">
select spmr.route_name,
'出院后' as routeNodeName,
spmrn.route_node_day,
qi.questionnaire_name, qi.questionnaire_name,
pi.discharge_time (SELECT id
from sign_patient_manage_route spmr FROM patient_question_submit_result
LEFT JOIN patient_info pi ON pi.id = spmr.patient_id WHERE resident_id = #{residentId}
LEFT JOIN resident_info ri on ri.id = pi.resident_id AND question_info_id = templateId) patientQuestionSubmitResultId,
LEFT JOIN sign_patient_manage_route_node spmrn ON spmrn.manage_route_id = spmr.id pqsr.create_time executeTime,
LEFT JOIN question_info qi ON spmrn.question_info_id = qi.id pqsr.resident_id,
where ri.id = #{residentId} CASE
and spmrn.task_type = #{taskContent} WHEN pqsr.resident_id IS NULL THEN 'incomplete'
and qi.question_type = #{questionType} WHEN pqsr.resident_id = #{residentId} THEN 'completed'
and spmrn.route_node_name = #{routeNodeName} END AS sign
and spmrn.node_execute_status = #{nodeExecuteStatus} FROM question_info qi
and spmrn.route_check_status = #{routeCheckStatus} LEFT JOIN patient_question_submit_result pqsr ON pqsr.question_info_id = qi.id
WHERE qi.question_type = #{questionType}
and qi.questionnaire_status = #{questionnaireStatus}
GROUP BY qi.id
ORDER BY pqsr.create_time DESC
</select> </select>
</mapper> </mapper>