人工随访代办处理

This commit is contained in:
youxilong 2024-04-07 17:14:44 +08:00
parent e3725f2052
commit 684ff54988
14 changed files with 267 additions and 15 deletions

View File

@ -12,7 +12,7 @@ import lombok.NoArgsConstructor;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
import java.time.LocalDateTime;
/**
@ -89,7 +89,7 @@ public class PatientTaskExecuteRecord extends BaseEntity {
@ApiModelProperty(value = "任务执行时间格式yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "任务执行时间格式yyyy-MM-dd HH:mm:ss", width = 30, dateFormat = "yyyy-MM-dd")
private Date executeTime;
private LocalDateTime executeTime;
/**
* 执行人姓名手动执行时记录

View File

@ -6,7 +6,6 @@ import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 人工随访查询DTO
@ -71,13 +70,15 @@ public class ManualFollowUpDTO {
@ApiModelProperty(value = "门诊(门诊患者)结束时间")
private LocalDate clinicalEndTime;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "出院时间(出院患者)开始时间")
private LocalDateTime dischargeStartTime;
private LocalDate dischargeStartTime;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "出院时间(出院患者)结束时间")
private LocalDateTime dischargeEndTime;
private LocalDate dischargeEndTime;
@ApiModelProperty(value = "主要诊断")
private String mainDiagnosis;

View File

@ -0,0 +1,21 @@
package com.xinelu.manage.dto.patientquestionoptionresult;
import com.xinelu.manage.domain.patientquestionoptionresult.PatientQuestionOptionResult;
import lombok.Data;
import java.math.BigDecimal;
/**
* 患者问卷题目选项提交结果DTO
*
* @author : youxilong
* @date : 2024/4/7 14:52
*/
@Data
public class PatientQuestionOptionResultDTO extends PatientQuestionOptionResult {
/**
* 题目序号
*/
private BigDecimal questionNumber;
}

View File

@ -1,7 +1,7 @@
package com.xinelu.manage.dto.patientquestionsubjectresult;
import com.xinelu.manage.domain.patientquestionoptionresult.PatientQuestionOptionResult;
import com.xinelu.manage.domain.patientquestionsubjectresult.PatientQuestionSubjectResult;
import com.xinelu.manage.dto.patientquestionoptionresult.PatientQuestionOptionResultDTO;
import lombok.Data;
import java.util.List;
@ -18,5 +18,5 @@ public class PatientQuestionSubjectResultDTO extends PatientQuestionSubjectResul
/**
* 患者问卷题目选项提交结果信息
*/
private List<PatientQuestionOptionResult> optionResultList;
private List<PatientQuestionOptionResultDTO> optionResultList;
}

View File

@ -2,7 +2,6 @@ package com.xinelu.manage.dto.patientquestionsubmitresult;
import com.xinelu.manage.domain.patientquestionsubmitresult.PatientQuestionSubmitResult;
import com.xinelu.manage.dto.patientquestionsubjectresult.PatientQuestionSubjectResultDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -20,6 +19,15 @@ public class PatientQuestionSubmitResultDTO extends PatientQuestionSubmitResult
@ApiModelProperty(value = "任务类型电话外呼PHONE_OUTBOUND问卷量表QUESTIONNAIRE_SCALE人工随访ARTIFICIAL_FOLLOW_UP")
private String taskType;
@ApiModelProperty(value = "任务处理人id")
private Long routeHandleId;
@ApiModelProperty(value = "任务处理人姓名")
private String routeHandlePerson;
@ApiModelProperty(value = "任务处理信息")
private String routeHandleRemark;
/**
* 患者问卷题目提交结果信息
*/

View File

@ -58,4 +58,10 @@ public interface PatientQuestionOptionResultMapper {
* @return 结果
*/
int deletePatientQuestionOptionResultByIds(Long[] ids);
/**
*批量新增问卷题目选项提交结果
*/
int saveQuestionOptionList(List<PatientQuestionOptionResult> saveQuestionSubjectOptions);
}

View File

@ -58,4 +58,10 @@ public interface PatientQuestionSubjectResultMapper {
* @return 结果
*/
int deletePatientQuestionSubjectResultByIds(Long[] ids);
/**
* 批量新增患者问卷题目提交结果信息
*/
int saveQuestionSubjectList(List<PatientQuestionSubjectResult> patientQuestionSubjectResults);
}

View File

@ -12,6 +12,7 @@ import com.xinelu.manage.mapper.labelfieldcontent.LabelFieldContentMapper;
import com.xinelu.manage.service.labelfieldcontent.ILabelFieldContentService;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
@ -72,6 +73,7 @@ public class LabelFieldContentServiceImpl implements ILabelFieldContentService {
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int updateLabelFieldContent(LabelFieldContent labelFieldContent) {
if (ObjectUtils.isEmpty(labelFieldContentMapper.selectLabelFieldContentById(labelFieldContent.getId()))) {
throw new ServiceException("当前字段内容不存在,无法修改,请联系管理员");
@ -112,6 +114,7 @@ public class LabelFieldContentServiceImpl implements ILabelFieldContentService {
* 批量新增标签字段内容信息
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int insertLabelFieldContents(LabelFieldContentAddDTO labelFieldContentAddDTO) {
// 获取到标签字段内容信息集合
List<LabelFieldContentDTO> fieldContentList = labelFieldContentAddDTO.getFieldContentList();

View File

@ -1,12 +1,27 @@
package com.xinelu.manage.service.signpatientmanageroute.impl;
import com.xinelu.common.constant.TaskCreateTypeConstant;
import com.xinelu.common.core.domain.AjaxResult;
import com.xinelu.common.enums.NodeExecuteStatusEnum;
import com.xinelu.common.enums.TaskContentEnum;
import com.xinelu.common.exception.ServiceException;
import com.xinelu.common.utils.AgeUtil;
import com.xinelu.common.utils.SecurityUtils;
import com.xinelu.common.utils.bean.BeanUtils;
import com.xinelu.manage.domain.patientquestionoptionresult.PatientQuestionOptionResult;
import com.xinelu.manage.domain.patientquestionsubjectresult.PatientQuestionSubjectResult;
import com.xinelu.manage.domain.patientquestionsubmitresult.PatientQuestionSubmitResult;
import com.xinelu.manage.domain.patienttaskexecuterecord.PatientTaskExecuteRecord;
import com.xinelu.manage.domain.signpatientmanageroute.SignPatientManageRoute;
import com.xinelu.manage.domain.signpatientmanageroutenode.SignPatientManageRouteNode;
import com.xinelu.manage.dto.manualfollowup.ManualFollowUpDTO;
import com.xinelu.manage.dto.patientquestionoptionresult.PatientQuestionOptionResultDTO;
import com.xinelu.manage.dto.patientquestionsubjectresult.PatientQuestionSubjectResultDTO;
import com.xinelu.manage.dto.patientquestionsubmitresult.PatientQuestionSubmitResultDTO;
import com.xinelu.manage.mapper.patientquestionoptionresult.PatientQuestionOptionResultMapper;
import com.xinelu.manage.mapper.patientquestionsubjectresult.PatientQuestionSubjectResultMapper;
import com.xinelu.manage.mapper.patientquestionsubmitresult.PatientQuestionSubmitResultMapper;
import com.xinelu.manage.mapper.patienttaskexecuterecord.PatientTaskExecuteRecordMapper;
import com.xinelu.manage.mapper.signpatientmanageroute.SignPatientManageRouteMapper;
import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper;
import com.xinelu.manage.service.signpatientmanageroute.ISignPatientManageRouteService;
@ -15,10 +30,13 @@ import com.xinelu.manage.vo.manualfollowup.ManualFollowUpVO;
import com.xinelu.manage.vo.signpatientmanageroute.SignPatientManageRouteVO;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
@ -33,6 +51,14 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout
private SignPatientManageRouteMapper signPatientManageRouteMapper;
@Resource
private SignPatientManageRouteNodeMapper signPatientManageRouteNodeMapper;
@Resource
private PatientTaskExecuteRecordMapper patientTaskExecuteRecordMapper;
@Resource
private PatientQuestionSubmitResultMapper patientQuestionSubmitResultMapper;
@Resource
private PatientQuestionSubjectResultMapper patientQuestionSubjectResultMapper;
@Resource
private PatientQuestionOptionResultMapper patientQuestionOptionResultMapper;
/**
* 查询签约患者管理任务路径
@ -149,6 +175,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout
/**
* 查询人工随访患者基本信息
*
* @param id 签约患者管理任务表id
* @return 人工随访患者基本信息VO
*/
@ -165,12 +192,110 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout
/**
* 人工随访代办处理
*
* @param dto 患者问卷提交结果信息表DTO
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult addPatientQuestionResult(PatientQuestionSubmitResultDTO dto) {
String routeHandlePerson = dto.getRouteHandlePerson();
LocalDateTime time = LocalDateTime.now();
// 如果任务类型是电话外呼更新节点任务表新增患者管理任务执行记录
if (dto.getTaskType().equals(TaskContentEnum.PHONE_OUTBOUND.getInfo())) {
// 更新节点任务表
updateSignPatientManageRouteNode(dto, routeHandlePerson, time);
// 新增患者管理任务执行记录
insertPatientTaskExecuteRecord(dto, routeHandlePerson, time);
} else {
// 如果任务类型不是电话外呼(人工随访问卷量表)新增问卷提交结果表(题目选项表)更新节点任务表新增患者管理任务执行记录
PatientQuestionSubmitResult patientQuestionSubmitResult = new PatientQuestionSubmitResult();
BeanUtils.copyBeanProp(patientQuestionSubmitResult, dto);
patientQuestionSubmitResult.setCreateBy(routeHandlePerson);
patientQuestionSubmitResult.setCreateTime(time);
// 新增患者问卷提交结果
if (patientQuestionSubmitResultMapper.insertPatientQuestionSubmitResult(patientQuestionSubmitResult) <= 0) {
throw new ServiceException("新增患者问卷提交结果失败");
}
// 获取到患者问卷题目提交结果信息DTO
List<PatientQuestionSubjectResultDTO> subjectResultList = dto.getSubjectResultDTOList();
// 初始化患者问卷题目提交结果信息
List<PatientQuestionSubjectResult> patientQuestionSubjectResults = new ArrayList<>();
// 获取到患者问卷题目选项提交结果DTO
List<PatientQuestionOptionResultDTO> patientQuestionOptionResults = new ArrayList<>();
for (PatientQuestionSubjectResultDTO questionSubjectResult : subjectResultList) {
PatientQuestionSubjectResult saveQuestionSubject = new PatientQuestionSubjectResult();
BeanUtils.copyBeanProp(saveQuestionSubject, questionSubjectResult);
saveQuestionSubject.setQuestionSubmitResultId(patientQuestionSubmitResult.getId());
saveQuestionSubject.setCreateBy(routeHandlePerson);
saveQuestionSubject.setCreateTime(time);
patientQuestionSubjectResults.add(saveQuestionSubject);
patientQuestionOptionResults.addAll(questionSubjectResult.getOptionResultList());
}
// 新增患者问卷题目提交结果
if (patientQuestionSubjectResultMapper.saveQuestionSubjectList(patientQuestionSubjectResults) <= 0) {
throw new ServiceException("新增患者问卷题目提交结果失败");
}
// 初始化患者问卷题目选项提交结果
List<PatientQuestionOptionResult> saveQuestionSubjectOptions = new ArrayList<>();
for (PatientQuestionOptionResultDTO patientQuestionOptionResult : patientQuestionOptionResults) {
PatientQuestionOptionResult saveQuestionOption = new PatientQuestionOptionResult();
BeanUtils.copyBeanProp(saveQuestionOption, patientQuestionOptionResult);
// 从已保存的患者问卷题目结果列表中查找当前选项所对应的题目结果
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.setCreateTime(time);
saveQuestionOption.setCreateBy(routeHandlePerson);
saveQuestionSubjectOptions.add(saveQuestionOption);
}
// 新增患者问卷题目选项提交结果
if (patientQuestionOptionResultMapper.saveQuestionOptionList(saveQuestionSubjectOptions) <= 0) {
throw new ServiceException("新增患者问卷题目选项提交结果失败");
}
// 更新节点任务表
updateSignPatientManageRouteNode(dto, routeHandlePerson, time);
// 新增患者管理任务执行记录
insertPatientTaskExecuteRecord(dto, routeHandlePerson, time);
return null;
}
return AjaxResult.success();
}
/**
* 新增患者管理任务执行记录
*/
private void insertPatientTaskExecuteRecord(PatientQuestionSubmitResultDTO dto, String routeHandlePerson, LocalDateTime time) {
PatientTaskExecuteRecord patientTaskExecuteRecord = new PatientTaskExecuteRecord();
BeanUtils.copyProperties(dto, patientTaskExecuteRecord);
patientTaskExecuteRecord.setTaskContent(dto.getTaskType());
patientTaskExecuteRecord.setExecuteTime(time);
patientTaskExecuteRecord.setExecutePerson(routeHandlePerson);
patientTaskExecuteRecord.setExecuteType(TaskCreateTypeConstant.MANUAL_CREATE);
patientTaskExecuteRecord.setCreateBy(routeHandlePerson);
patientTaskExecuteRecord.setCreateTime(time);
if (patientTaskExecuteRecordMapper.insertPatientTaskExecuteRecord(patientTaskExecuteRecord) <= 0) {
throw new ServiceException("新增患者管理任务记录失败");
}
}
/**
* 更新节点任务表
*/
private void updateSignPatientManageRouteNode(PatientQuestionSubmitResultDTO dto, String routeHandlePerson, LocalDateTime time) {
SignPatientManageRouteNode signPatientManageRouteNode = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeById(dto.getManageRouteNodeId());
signPatientManageRouteNode.setNodeExecuteStatus(NodeExecuteStatusEnum.EXECUTED.toString());
signPatientManageRouteNode.setRouteHandleRemark(dto.getRouteHandleRemark());
signPatientManageRouteNode.setRouteHandleId(dto.getRouteHandleId());
signPatientManageRouteNode.setRouteHandlePerson(routeHandlePerson);
signPatientManageRouteNode.setCreateBy(routeHandlePerson);
signPatientManageRouteNode.setCreateTime(time);
// 更新节点任务表
if (signPatientManageRouteNodeMapper.updateSignPatientManageRouteNode(signPatientManageRouteNode) <= 0) {
throw new ServiceException("更新节点任务表失败");
}
}
}

View File

@ -19,11 +19,6 @@ public class ManualFollowPatientVO {
*/
private Long id;
/**
* 患者信息表id
*/
private Long patientId;
@ApiModelProperty(value = "姓名")
private String patientName;

View File

@ -15,6 +15,11 @@ import java.time.LocalDateTime;
@Data
public class ManualFollowUpVO {
/**
* 患者信息表id
*/
private Long patientId;
/**
* 签约患者管理任务id
*/
@ -31,6 +36,9 @@ public class ManualFollowUpVO {
@ApiModelProperty(value = "管理路径节点名称出院后AFTER_DISCHARGE入院后AFTER_ADMISSION就诊后AFTER_CONSULTATION就诊/出院后AFTER_VISIT_DISCHARGE术前PREOPERATIVE术后POSTOPERATIVE")
private String routeNodeName;
@ApiModelProperty(value = "患者就诊记录基本信息表id")
private Long visitRecordId;
@ApiModelProperty(value = "患者姓名")
private String patientName;

View File

@ -149,6 +149,39 @@
</trim>
</insert>
<insert id="saveQuestionOptionList">
insert into patient_question_option_result(
question_subject_result_id,
questionnaire_subject_id,
question_name,
option_name,
option_answer,
option_score,
option_choose_sign,
option_submit_answer,
option_sort,
option_remark,
create_by,
create_time
) values
<foreach item="QuestionSubjectOption" index="index" collection="list" separator=",">
(
#{QuestionSubjectOption.questionSubjectResultId},
#{QuestionSubjectOption.questionnaireSubjectId},
#{QuestionSubjectOption.questionName},
#{QuestionSubjectOption.optionName},
#{QuestionSubjectOption.optionAnswer},
#{QuestionSubjectOption.optionScore},
#{QuestionSubjectOption.optionChooseSign},
#{QuestionSubjectOption.optionSubmitAnswer},
#{QuestionSubjectOption.optionSort},
#{QuestionSubjectOption.optionRemark},
#{QuestionSubjectOption.createBy},
#{QuestionSubjectOption.createTime}
)
</foreach>
</insert>
<update id="updatePatientQuestionOptionResult" parameterType="PatientQuestionOptionResult">
update patient_question_option_result
<trim prefix="SET" suffixOverrides=",">

View File

@ -194,6 +194,50 @@
</trim>
</insert>
<insert id="saveQuestionSubjectList" useGeneratedKeys="true"
keyProperty="id">
insert into patient_question_subject_result(
question_submit_result_id,
question_info_id,
question_number,
question_type,
question_name,
question_description,
write_description,
fill_blanks_answer,
option_count,
whether_score,
scoring_method,
scoring_description,
question_score,
question_sort,
question_remark,
create_by,
create_time
) values
<foreach item="QuestionSubject" index="index" collection="list" separator=",">
(
#{QuestionSubject.questionSubmitResultId},
#{QuestionSubject.questionInfoId},
#{QuestionSubject.questionNumber},
#{QuestionSubject.questionType},
#{QuestionSubject.questionName},
#{QuestionSubject.questionDescription},
#{QuestionSubject.writeDescription},
#{QuestionSubject.fillBlanksAnswer},
#{QuestionSubject.optionCount},
#{QuestionSubject.whetherScore},
#{QuestionSubject.scoringMethod},
#{QuestionSubject.scoringDescription},
#{QuestionSubject.questionScore},
#{QuestionSubject.questionSort},
#{QuestionSubject.questionRemark},
#{QuestionSubject.createBy},
#{QuestionSubject.createTime}
)
</foreach>
</insert>
<update id="updatePatientQuestionSubjectResult" parameterType="PatientQuestionSubjectResult">
update patient_question_subject_result
<trim prefix="SET" suffixOverrides=",">

View File

@ -96,6 +96,7 @@
<select id="selectManualFollowUpList"
resultType="com.xinelu.manage.vo.manualfollowup.ManualFollowUpVO">
SELECT
pi.id AS 'patientId',
pi.patient_name,
pi.patient_phone,
pi.sex,
@ -110,6 +111,7 @@
pi.in_hospital_number,
pi.visit_serial_number,
pi.main_diagnosis,
pvr.id AS 'visitRecordId',
pvr.surgical_name,
pi.attending_physician_id,
pi.attending_physician_name,