患者任务数量统计数据预生成。

This commit is contained in:
haown 2024-08-15 08:37:25 +08:00
parent 8d5e74e497
commit bb7ca50f37
19 changed files with 339 additions and 59 deletions

View File

@ -130,4 +130,10 @@ public class SignPatientManageRouteNodeController extends BaseController {
return R.ok(signNodeService.getSpecialDiseaseNode(patientTaskDto));
}
@GetMapping("/generateStatistic")
public R<String> generateStatistic() {
signNodeService.generateStatistic();
return R.ok();
}
}

View File

@ -4,6 +4,7 @@ import com.xinelu.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -52,4 +53,14 @@ public class PatientTaskStatistics extends BaseEntity {
@ApiModelProperty(value = "任务完成数量")
private BigDecimal taskFinishNum;
/**
* 下次任务名称
*/
private String nextTaskName;
/**
* 任务执行时间
*/
private LocalDateTime nextTaskTime;
}

View File

@ -140,6 +140,11 @@ public class ScriptInfo extends BaseEntity {
*/
private Long sourceTemplateId;
/**
* 爱医声平台机器人ID
*/
private String robotPublishId;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

View File

@ -1,6 +1,7 @@
package com.xinelu.manage.mapper.patienttaskstatistics;
import com.xinelu.manage.domain.patienttaskstatistics.PatientTaskStatistics;
import com.xinelu.manage.vo.patientinfo.PatientNextTaskVo;
import java.util.List;
/**
@ -42,6 +43,10 @@ public interface PatientTaskStatisticsMapper {
*/
int updatePatientTaskStatistics(PatientTaskStatistics patientTaskStatistics);
PatientTaskStatistics selectNum(Long patientId);
PatientNextTaskVo getPatientNextTask(Long patientId);
/**
* 删除患者任务统计
*

View File

@ -152,4 +152,14 @@ public interface SignPatientManageRouteNodeMapper {
* @return int
*/
int updateNodeExecuteStatusByIds(@Param("manageRouteNodeIds") List<Long> manageRouteNodeIds, @Param("nodeExecuteStatus") String nodeExecuteStatus, @Param("appletStatus") String appletStatus, @Param("messageStatus") String messageStatus, @Param("officialStatus") String officialStatus);
/**
* @description 根据签约记录表主键查询患者已执行任务数量
* @param signPatientRecordId 签约记录表主键
* @return 任务执行数量
* @Author haown
* @Date 2024-08-13 14:00
*/
int getPatientExecutedTaskNum(Long signPatientRecordId);
}

View File

@ -21,7 +21,6 @@ import com.xinelu.manage.mapper.signpatientrecord.SignPatientRecordMapper;
import com.xinelu.manage.service.patientinfo.IPatientInfoService;
import com.xinelu.manage.service.patientvisitrecord.IPatientVisitRecordService;
import com.xinelu.manage.vo.patientinfo.PatientInfoVo;
import com.xinelu.manage.vo.patientinfo.PatientNextTaskVo;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@ -82,14 +81,14 @@ public class PatientInfoServiceImpl implements IPatientInfoService {
@DataScope(agencyAlias = "p", userAlias = "p.attending_physician_id")
@Override public List<PatientInfoVo> getPatientList(PatientInfoDto patientInfo) {
List<PatientInfoVo> patientInfoVoList = patientInfoMapper.getPatientList(patientInfo);
patientInfoVoList.forEach(patientInfoVo -> {
// 下次任务
PatientNextTaskVo patientNextTask = patientInfoMapper.getPatientNextTask(patientInfoVo.getId());
if (ObjectUtils.isNotEmpty(patientNextTask)) {
patientInfoVo.setNextTaskName(patientNextTask.getTaskName());
patientInfoVo.setNextTaskTime(patientNextTask.getExecuteDateTime());
}
});
//patientInfoVoList.forEach(patientInfoVo -> {
// // 下次任务
// PatientNextTaskVo patientNextTask = patientInfoMapper.getPatientNextTask(patientInfoVo.getId());
// if (ObjectUtils.isNotEmpty(patientNextTask)) {
// patientInfoVo.setNextTaskName(patientNextTask.getTaskName());
// patientInfoVo.setNextTaskTime(patientNextTask.getExecuteDateTime());
// }
//});
// 按照患者id分组
//Map<Long, List<PatientInfoVo>> groupById = patientInfoVoList.stream().collect(Collectors.groupingBy(PatientInfoVo::getId));

View File

@ -79,11 +79,19 @@ public interface IPatientTaskStatisticsService {
/**
* @description 根据任务表主键列表修改任务总数执行数完成数
* @param signManageRouteNodeIds 任务表主键列表
* @param manageRouteNodeId 任务表主键
* @param type 字段种类TASK_NUM任务总数TASK_EXECUTE_NUM: 任务执行数TASK_FINISH_NUM任务完成数
* @return 结果
* @Author haown
* @Date 2024-8-12 17:19
*/
int updateNumByManageRouteNodeIds(List<Long> signManageRouteNodeIds, String type);
int updateNumByManageRouteNodeId(Long manageRouteNodeId, String type, Integer count);
/**
* @description 修改患者统计表任务数量下次任务
* @param patientIdList 患者主键列表
* @Author haown
* @Date 2024-8-14 11:37
*/
void updateNum(List<Long> patientIdList);
}

View File

@ -1,15 +1,24 @@
package com.xinelu.manage.service.patienttaskstatistics.impl;
import com.xinelu.common.constant.SignRecordServiceStatusConstants;
import com.xinelu.common.constant.TaskStatisticsTypeConstants;
import com.xinelu.manage.domain.patientinfo.PatientInfo;
import com.xinelu.manage.domain.patienttaskstatistics.PatientTaskStatistics;
import com.xinelu.manage.domain.signpatientmanageroute.SignPatientManageRoute;
import com.xinelu.manage.domain.signpatientmanageroutenode.SignPatientManageRouteNode;
import com.xinelu.manage.domain.signpatientrecord.SignPatientRecord;
import com.xinelu.manage.mapper.patientinfo.PatientInfoMapper;
import com.xinelu.manage.mapper.patienttaskstatistics.PatientTaskStatisticsMapper;
import com.xinelu.manage.mapper.signpatientmanageroute.SignPatientManageRouteMapper;
import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper;
import com.xinelu.manage.mapper.signpatientrecord.SignPatientRecordMapper;
import com.xinelu.manage.service.patienttaskstatistics.IPatientTaskStatisticsService;
import com.xinelu.manage.vo.patientinfo.PatientNextTaskVo;
import java.math.BigDecimal;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
@ -24,13 +33,19 @@ public class PatientTaskStatisticsServiceImpl implements IPatientTaskStatisticsS
private PatientTaskStatisticsMapper patientTaskStatisticsMapper;
@Resource
private SignPatientRecordMapper signPatientRecordMapper;
@Resource
private SignPatientManageRouteNodeMapper signPatientManageRouteNodeMapper;
@Resource
private SignPatientManageRouteMapper signPatientManageRouteMapper;
@Resource
private PatientInfoMapper patientInfoMapper;
/**
* 查询患者任务统计
*
* @param patientId 患者任务统计主键
* @return 患者任务统计
*/
/**
* 查询患者任务统计
*
* @param patientId 患者任务统计主键
* @return 患者任务统计
*/
@Override
public PatientTaskStatistics selectPatientTaskStatisticsByPatientId(Long patientId) {
return patientTaskStatisticsMapper.selectPatientTaskStatisticsByPatientId(patientId);
@ -92,12 +107,20 @@ public class PatientTaskStatisticsServiceImpl implements IPatientTaskStatisticsS
}
@Override public int insertOrUpdate(PatientTaskStatistics patientTaskStatistics) {
int flag = 0;
SignPatientRecord signPatientRecord = signPatientRecordMapper.selectByPrimaryKey(patientTaskStatistics.getSignPatientRecordId());
if (ObjectUtils.isNotEmpty(signPatientRecord)) {
PatientTaskStatistics patientTask = patientTaskStatisticsMapper.selectPatientTaskStatisticsByPatientId(patientTaskStatistics.getPatientId());
if (ObjectUtils.isEmpty(patientTask)) {
// 插入数据
patientTaskStatisticsMapper.insertPatientTaskStatistics(patientTaskStatistics);
flag = patientTaskStatisticsMapper.insertPatientTaskStatistics(patientTaskStatistics);
// 查询最新的任务
PatientNextTaskVo patientNextTaskVo = patientTaskStatisticsMapper.getPatientNextTask(signPatientRecord.getPatientId());
if (ObjectUtils.isNotEmpty(patientNextTaskVo)) {
patientTaskStatistics.setNextTaskName(patientNextTaskVo.getTaskName());
patientTaskStatistics.setNextTaskTime(patientNextTaskVo.getExecuteDateTime());
patientTaskStatisticsMapper.updatePatientTaskStatistics(patientTaskStatistics);
}
} else {
// 修改数据
patientTask.setServiceStatus(signPatientRecord.getServiceStatus());
@ -105,11 +128,17 @@ public class PatientTaskStatisticsServiceImpl implements IPatientTaskStatisticsS
patientTask.setTaskNum(patientTask.getTaskNum().add(patientTaskStatistics.getTaskNum()));
patientTask.setTaskExecuteNum(patientTask.getTaskExecuteNum().add(patientTaskStatistics.getTaskExecuteNum()));
patientTask.setTaskFinishNum(patientTask.getTaskFinishNum().add(patientTaskStatistics.getTaskFinishNum()));
patientTaskStatisticsMapper.updatePatientTaskStatistics(patientTask);
// 查询最新的任务
PatientNextTaskVo patientNextTaskVo = patientTaskStatisticsMapper.getPatientNextTask(signPatientRecord.getPatientId());
if (ObjectUtils.isNotEmpty(patientNextTaskVo)) {
patientTask.setNextTaskName(patientNextTaskVo.getTaskName());
patientTask.setNextTaskTime(patientNextTaskVo.getExecuteDateTime());
}
flag = patientTaskStatisticsMapper.updatePatientTaskStatistics(patientTask);
}
}
return 0;
return flag;
}
/**
@ -124,22 +153,60 @@ public class PatientTaskStatisticsServiceImpl implements IPatientTaskStatisticsS
@Override
public int updateNum(Long patientId, String type, Integer count) {
PatientTaskStatistics patientTaskStatistics = patientTaskStatisticsMapper.selectPatientTaskStatisticsByPatientId(patientId);
switch (type) {
case TaskStatisticsTypeConstants.TASK_NUM:
patientTaskStatistics.setTaskNum(patientTaskStatistics.getTaskNum().add(BigDecimal.valueOf(count)));
break;
case TaskStatisticsTypeConstants.TASK_EXECUTE_NUM:
patientTaskStatistics.setTaskExecuteNum(patientTaskStatistics.getTaskExecuteNum().add(BigDecimal.valueOf(count)));
break;
case TaskStatisticsTypeConstants.TASK_FINISH_NUM:
patientTaskStatistics.setTaskFinishNum(patientTaskStatistics.getTaskFinishNum().add(BigDecimal.valueOf(count)));
break;
PatientInfo patientInfo = patientInfoMapper.selectPatientInfoById(patientId);
if (ObjectUtils.isNotEmpty(patientInfo) && StringUtils.equals(SignRecordServiceStatusConstants.SERVICE_CENTER, patientInfo.getServiceStatus())) {
switch (type) {
case TaskStatisticsTypeConstants.TASK_NUM:
patientTaskStatistics.setTaskNum(patientTaskStatistics.getTaskNum().add(BigDecimal.valueOf(count)));
break;
case TaskStatisticsTypeConstants.TASK_EXECUTE_NUM:
patientTaskStatistics.setTaskExecuteNum(patientTaskStatistics.getTaskExecuteNum().add(BigDecimal.valueOf(count)));
// 下次任务
PatientNextTaskVo patientNextTask = patientTaskStatisticsMapper.getPatientNextTask(patientId);
if (ObjectUtils.isNotEmpty(patientNextTask)) {
patientTaskStatistics.setNextTaskName(patientNextTask.getTaskName());
patientTaskStatistics.setNextTaskTime(patientNextTask.getExecuteDateTime());
patientTaskStatisticsMapper.updatePatientTaskStatistics(patientTaskStatistics);
}
break;
case TaskStatisticsTypeConstants.TASK_FINISH_NUM:
patientTaskStatistics.setTaskFinishNum(patientTaskStatistics.getTaskFinishNum().add(BigDecimal.valueOf(count)));
break;
}
}
return patientTaskStatisticsMapper.updatePatientTaskStatistics(patientTaskStatistics);
}
@Override public int updateNumByManageRouteNodeIds(List<Long> signManageRouteNodeIds, String type) {
@Override public int updateNumByManageRouteNodeId(Long manageRouteNodeId, String type, Integer count) {
SignPatientManageRouteNode signPatientManageRouteNode = signPatientManageRouteNodeMapper.selectSignPatientManageRouteNodeById(manageRouteNodeId);
if (ObjectUtils.isNotEmpty(signPatientManageRouteNode)) {
SignPatientManageRoute signPatientManageRoute = signPatientManageRouteMapper.selectSignPatientManageRouteById(signPatientManageRouteNode.getManageRouteId());
if (ObjectUtils.isNotEmpty(signPatientManageRoute)) {
return updateNum(signPatientManageRoute.getPatientId(), type, count);
}
}
return 0;
}
/**
* @description 修改患者统计表任务数量下次任务
* @param patientIdList 患者主键列表
* @Author haown
* @Date 2024-8-14 11:37
*/
@Override
public void updateNum(List<Long> patientIdList) {
// 修改任务执行数量任务完成数量
patientIdList.forEach(patientId -> {
PatientTaskStatistics patientTaskStatistics = patientTaskStatisticsMapper.selectNum(patientId);
// 修改数据
if (ObjectUtils.isNotEmpty(patientTaskStatistics)) {
// 下次任务
PatientNextTaskVo patientNextTask = patientTaskStatisticsMapper.getPatientNextTask(patientId);
patientTaskStatistics.setNextTaskName(patientNextTask.getTaskName());
patientTaskStatistics.setNextTaskTime(patientNextTask.getExecuteDateTime());
patientTaskStatisticsMapper.updatePatientTaskStatistics(patientTaskStatistics);
}
});
}
}

View File

@ -484,6 +484,7 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout
throw new ServiceException("新增患者问卷题目选项提交结果失败");
}
}
return AjaxResult.success();
}
@ -954,6 +955,11 @@ public class SignPatientManageRouteServiceImpl implements ISignPatientManageRout
// 更新节点任务表
if (signPatientManageRouteNodeMapper.updateSignPatientManageRouteNode(signPatientManageRouteNode) <= 0) {
throw new ServiceException("更新节点任务表失败");
} else {
if (dto.getTaskNodeType().equals(TaskContentEnum.QUESTIONNAIRE_SCALE.getInfo())) {
// 修改任务统计表任务完成数量
patientTaskStatisticsService.updateNum(dto.getPatientId(), TaskStatisticsTypeConstants.TASK_FINISH_NUM, 1);
}
}
}

View File

@ -206,4 +206,6 @@ public interface ISignPatientManageRouteNodeService {
* @return 是否满足触发条件true:满足false:不满足
*/
Boolean getSignTriggerConditon(Long signPatientManageRouteId, Long patientId);
void generateStatistic();
}

View File

@ -64,6 +64,8 @@ import com.xinelu.manage.service.questioninfo.IQuestionInfoService;
import com.xinelu.manage.service.signpatientmanageroutenode.ISignPatientManageRouteNodeService;
import com.xinelu.manage.service.specialdiseaseroute.ISpecialDiseaseRouteService;
import com.xinelu.manage.vo.labelfieldcontent.LabelFieldInfoContentVo;
import com.xinelu.manage.vo.patientinfo.PatientInfoVo;
import com.xinelu.manage.vo.patientinfo.PatientNextTaskVo;
import com.xinelu.manage.vo.patientquestionsubmitresult.PatientQuestionSubmitResultVO;
import com.xinelu.manage.vo.propagandainfo.PropagandaMaterialsVo;
import com.xinelu.manage.vo.questionInfo.QuestionVO;
@ -197,6 +199,9 @@ public class SignPatientManageRouteNodeServiceImpl implements ISignPatientManage
if (ObjectUtils.isEmpty(signPatientRecord)) {
throw new ServiceException("数据有误,请联系管理员!");
}
if (!StringUtils.equals(RouteCheckStatusEnum.AGREE.getInfo(), signPatientRecord.getRouteCheckStatus())) {
return new ArrayList<>();
}
PatientVisitRecord patientVisitRecord = patientVisitRecordMapper.selectPatientVisitRecordById(signPatientRecord.getPatientVisitRecordId());
// 根据签约记录主键查询患者任务列表
SignPatientManageRoute manageRouteQuery = new SignPatientManageRoute();
@ -1097,6 +1102,29 @@ public class SignPatientManageRouteNodeServiceImpl implements ISignPatientManage
return generateTask;
}
@Override public void generateStatistic() {
// 查询患者
PatientInfoDto patientInfo = new PatientInfoDto();
List<PatientInfoVo> patientInfoVoList = patientInfoMapper.getPatientList(patientInfo);
patientInfoVoList.forEach(patientInfoVo -> {
PatientInfo patientInfo1 = patientInfoMapper.selectPatientInfoById(patientInfoVo.getId());
PatientTaskStatistics patientTaskStatistics = new PatientTaskStatistics();
patientTaskStatistics.setPatientId(patientInfoVo.getId());
patientTaskStatistics.setSignPatientRecordId(patientInfo1.getSignPatientRecordId());
patientTaskStatistics.setServiceStatus(patientInfo1.getServiceStatus());
patientTaskStatistics.setTaskNum(patientInfoVo.getTaskNum());
patientTaskStatistics.setTaskExecuteNum(patientInfoVo.getTaskExecuteNum());
patientTaskStatistics.setTaskFinishNum(patientInfoVo.getTaskFinishNum());
// 下次任务
PatientNextTaskVo patientNextTask = patientInfoMapper.getPatientNextTask(patientInfoVo.getId());
if (ObjectUtils.isNotEmpty(patientNextTask)) {
patientTaskStatistics.setNextTaskName(patientNextTask.getTaskName());
patientTaskStatistics.setNextTaskTime(patientNextTask.getExecuteDateTime());
}
patientTaskStatisticsService.insertPatientTaskStatistics(patientTaskStatistics);
});
}
/**
* 根据管理路径生成任务
* @param signPatientManageRoute 签约管理路径

View File

@ -158,6 +158,8 @@ public class PatientInfoVo {
@ApiModelProperty(value = "最新一条就诊记录id")
private Long patientVisitRecordId;
private Long signPatientRecordId;
/**
* 就诊时间格式yyyy-MM-dd HH:mm:ss
*/

View File

@ -171,17 +171,63 @@
<select id="getPatientList" parameterType="com.xinelu.manage.dto.patientinfo.PatientInfoDto"
resultType="com.xinelu.manage.vo.patientinfo.PatientInfoVo">
select p.*, count(p.manage_route_node_id) as taskNum, SUM(p.task_finish_status) as taskFinishNum, SUM(p.task_execute_status) as taskExecuteNum,
select p.id AS id,
p.resident_id AS resident_id,
p.patient_name AS patient_name,
p.patient_phone AS patient_phone,
p.birth_date AS birth_date,
p.card_no AS card_no,
p.sex AS sex,
p.address AS address,
p.patient_type AS patient_type,
p.visit_method AS visit_method,
p.visit_serial_number AS visit_serial_number,
p.in_hospital_number AS in_hospital_number,
p.attending_physician_id AS attending_physician_id,
p.attending_physician_name AS attending_physician_name,
p.main_diagnosis AS main_diagnosis,
p.hospital_agency_id AS hospital_agency_id,
p.hospital_agency_name AS hospital_agency_name,
p.campus_agency_id AS campus_agency_id,
p.campus_agency_name AS campus_agency_name,
p.department_id AS department_id,
p.department_name AS department_name,
p.ward_id AS ward_id,
p.ward_name AS ward_name,
p.patient_visit_record_id AS patient_visit_record_id,
p.sign_patient_record_id,
p.visit_date AS visit_date,
p.patient_source AS patient_source,
CASE
WHEN isnull( p.sign_patient_record_id) THEN '新建'
WHEN sign.service_status = 'INTENTIONAL_SIGNING' THEN '意向签约'
WHEN sign.service_status = 'SERVICE_CENTER' AND sign.route_check_status = 'AGREE' THEN '服务中'
WHEN sign.service_status = 'SERVICE_END' THEN '已归档' ELSE '已签约' END AS patientSignStatus,
pts.task_num, pts.task_execute_num, pts.task_finish_num, pts.next_task_name as nextTaskName, pts.next_task_time as nextTaskTime,
case
when count(p.manage_route_node_id) = 0 then 0
when pts.task_num = 0 then 0
else
ROUND(SUM(p.task_finish_status) / count(p.manage_route_node_id) * 100, 2) end as taskFinishRate,
ROUND(pts.task_finish_num / pts.task_num * 100, 2) end as taskFinishRate,
case
when count(p.manage_route_node_id) = 0 then 0
when pts.task_num = 0 then 0
else
ROUND(SUM(p.task_execute_status) / count(p.manage_route_node_id) * 100, 2) end as taskExecuteRate
ROUND(pts.task_execute_num / pts.task_num * 100, 2) end as taskExecuteRate
from
patient_task_view p
patient_info p
left join sign_patient_record sign on p.sign_patient_record_id = sign.id
left join patient_task_statistics pts on p.id = pts.patient_id
-- select p.*, count(p.manage_route_node_id) as taskNum, SUM(p.task_finish_status) as taskFinishNum, SUM(p.task_execute_status) as taskExecuteNum,
-- case
-- when count(p.manage_route_node_id) = 0 then 0
-- else
-- ROUND(SUM(p.task_finish_status) / count(p.manage_route_node_id) * 100, 2) end as taskFinishRate,
-- case
-- when count(p.manage_route_node_id) = 0 then 0
-- else
-- ROUND(SUM(p.task_execute_status) / count(p.manage_route_node_id) * 100, 2) end as taskExecuteRate
-- from
-- patient_task_view p
<where>
<if test="residentId != null">
and p.resident_id = #{residentId}
@ -271,7 +317,7 @@
<!-- 数据范围过滤 -->
${params.dataScope}
</where>
GROUP BY p.id order by p.id desc
order by p.id desc
</select>
<select id="getPatientNextTask" parameterType="Long" resultType="com.xinelu.manage.vo.patientinfo.PatientNextTaskVo">

View File

@ -12,10 +12,12 @@
<result property="taskNum" column="task_num"/>
<result property="taskExecuteNum" column="task_execute_num"/>
<result property="taskFinishNum" column="task_finish_num"/>
<result property="nextTaskName" column="next_task_name"/>
<result property="nextTaskTime" column="next_task_time"/>
</resultMap>
<sql id="selectPatientTaskStatisticsVo">
select patient_id, sign_patient_record_id, service_status, route_check_status, task_num, task_execute_num, task_finish_num from patient_task_statistics
select patient_id, sign_patient_record_id, service_status, route_check_status, task_num, task_execute_num, task_finish_num,next_task_name,next_task_time from patient_task_statistics
</sql>
<select id="selectPatientTaskStatisticsList" parameterType="PatientTaskStatistics" resultMap="PatientTaskStatisticsResult">
@ -68,6 +70,10 @@
</if>
<if test="taskFinishNum != null">task_finish_num,
</if>
<if test="nextTaskName != null">next_task_name,
</if>
<if test="nextTaskTime != null">next_task_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="signPatientRecordId != null">#{signPatientRecordId},
@ -84,6 +90,10 @@
</if>
<if test="taskFinishNum != null">#{taskFinishNum},
</if>
<if test="nextTaskName != null">#{nextTaskName},
</if>
<if test="nextTaskTime != null">#{nextTaskTime},
</if>
</trim>
</insert>
@ -108,10 +118,29 @@
<if test="taskFinishNum != null">task_finish_num =
#{taskFinishNum},
</if>
<if test="nextTaskName != null">next_task_name =
#{nextTaskName},
</if>
<if test="nextTaskTime != null">next_task_time =
#{nextTaskTime},
</if>
</trim>
where patient_id = #{patientId}
</update>
<select id="selectNum" parameterType="Long" resultMap="PatientTaskStatisticsResult">
select id as patientId, sign_patient_record_id as signPatientRecordId,
sum(task_execute_status) as taskExecuteNum, sum(task_finish_status) as taskFinishNum
from patient_task_statistics_view
where id = #{patientId}
</select>
<select id="getPatientNextTask" parameterType="Long" resultType="com.xinelu.manage.vo.patientinfo.PatientNextTaskVo">
select p.task_name, p.execute_date_time from patient_task_statistics_view p
where p.id = #{patientId} and p.node_execute_status = 'UNEXECUTED'
order by p.execute_date_time limit 1
</select>
<delete id="deletePatientTaskStatisticsByPatientId" parameterType="Long">
delete from patient_task_statistics where patient_id = #{patientId}
</delete>

View File

@ -25,6 +25,8 @@
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="robotPublishId" column="robot_publish_id"/>
</resultMap>
<resultMap type="com.xinelu.manage.vo.scriptInfo.ScriptVO" id="ScriptVOResult">
@ -53,7 +55,8 @@
create_by,
create_time,
update_by,
update_time
update_time,
robot_publish_id
from script_info
</sql>
@ -76,7 +79,8 @@
si.create_by,
si.create_time,
si.update_by,
si.update_time
si.update_time,
si.robot_publish_id
from script_info si
left join department d on d.id = si.department_id
<where>
@ -194,6 +198,8 @@
</if>
<if test="updateTime != null">update_time,
</if>
<if test="robotPublishId != null">robot_publish_id,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="departmentId != null">#{departmentId},
@ -234,6 +240,8 @@
</if>
<if test="updateTime != null">#{updateTime},
</if>
<if test="robotPublishId != null">#{robotPublishId},
</if>
</trim>
</insert>
@ -293,6 +301,9 @@
<if test="updateTime != null">update_time =
#{updateTime},
</if>
<if test="robotPublishId != null">robot_publish_id =
#{robotPublishId},
</if>
</trim>
where id = #{id}
</update>

View File

@ -863,13 +863,12 @@
dic.dict_label as taskNodeTypeName
from sign_patient_manage_route_node node
left join task_type_dict ttd on node.task_type = ttd.task_type_code
left join sys_dict_data dic on node.task_node_type = dic.dict_value
left join sys_dict_data dic on node.task_node_type = dic.dict_value and dic.dict_type ='task_node_type'
left join task_partition_dict tpd on node.task_subdivision = tpd.task_partition_code
where node.manage_route_id in
<foreach item="manageRouteId" collection="manageRouteIds" open="(" separator="," close=")">
#{manageRouteId}
</foreach>
and dic.dict_type ='task_node_type'
</select>
<select id="selectNodesByManageIds" resultMap="SignPatientManageRouteNodeResult">
@ -938,4 +937,13 @@
#{manageRouteNodeIds}
</foreach>
</update>
<select id="getPatientExecutedTaskNum" resultType="java.lang.Integer">
select spmr.patient_id, spmr.sign_patient_record_id, count(spmrn.id)
from sign_patient_manage_route_node spmrn
LEFT JOIN sign_patient_manage_route spmr ON spmr.id = spmrn.manage_route_id
LEFT JOIN patient_info pi ON pi.sign_patient_record_id = spmr.sign_patient_record_id
where spmr.patient_id = #{patientId} and spmrn.del_flag = 0 and spmrn.node_execute_status = 'EXECUTED'
GROUP BY spmr.patient_id, spmr.sign_patient_record_id
</select>
</mapper>

View File

@ -1,9 +1,14 @@
package com.xinelu.mobile.service.homepage.Impl;
import com.alibaba.fastjson2.JSONObject;
import com.xinelu.common.constant.TaskStatisticsTypeConstants;
import com.xinelu.common.core.domain.AjaxResult;
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.enums.TaskContentEnum;
import com.xinelu.common.exception.ServiceException;
import com.xinelu.common.utils.PageServiceUtil;
import com.xinelu.common.utils.bean.BeanUtils;
@ -25,6 +30,7 @@ import com.xinelu.manage.mapper.questioninfo.QuestionInfoMapper;
import com.xinelu.manage.mapper.questionsubject.QuestionSubjectMapper;
import com.xinelu.manage.mapper.questionsubjectoption.QuestionSubjectOptionMapper;
import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper;
import com.xinelu.manage.service.patienttaskstatistics.IPatientTaskStatisticsService;
import com.xinelu.manage.service.propagandainfo.IPropagandaInfoService;
import com.xinelu.manage.vo.propagandainfo.PropagandaMaterialsVo;
import com.xinelu.manage.vo.questionInfo.QuestionVO;
@ -38,19 +44,18 @@ import com.xinelu.mobile.vo.homepage.MessageTabulationVO;
import com.xinelu.mobile.vo.homepage.NodeExecuteStatus;
import com.xinelu.mobile.vo.myfollowup.MyFollowUpVO;
import com.xinelu.mobile.vo.satisfactionquestionnaire.SatisfactionQuestionnaire;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
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.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 小程序首页ServiceImpl
@ -86,6 +91,8 @@ public class HomePageServiceImpl implements HomePageService {
private IPropagandaInfoService propagandaInfoService;
@Resource
private PatientTaskExecuteRecordMapper patientTaskExecuteRecordMapper;
@Resource
private IPatientTaskStatisticsService patientTaskStatisticsService;
/**
* 我的随访列表
@ -426,6 +433,8 @@ public class HomePageServiceImpl implements HomePageService {
signPatientManageRouteNode.setId(manageRouteNodeId);
signPatientManageRouteNode.setNodeFinishDate(LocalDateTime.now());
signPatientManageRouteNodeMapper.updateSignPatientManageRouteNode(signPatientManageRouteNode);
// 修改任务统计表
patientTaskStatisticsService.updateNumByManageRouteNodeId(manageRouteNodeId, TaskStatisticsTypeConstants.TASK_FINISH_NUM, 1);
return AjaxResult.success();
}
}

View File

@ -3,28 +3,34 @@ package com.xinelu.quartz.service.impl;
import com.aliyuncs.exceptions.ClientException;
import com.xinelu.common.config.AliYunSmsTwoConfig;
import com.xinelu.common.config.PushMessageRestrictions;
import com.xinelu.common.enums.*;
import com.xinelu.common.enums.ErrorStatusEnum;
import com.xinelu.common.enums.NodeExecuteResultStatusEnum;
import com.xinelu.common.enums.NodeExecuteStatusEnum;
import com.xinelu.common.enums.RouteNodeNameEnum;
import com.xinelu.common.enums.ShortMessageTypeEnum;
import com.xinelu.manage.domain.shortmessagesendrecord.ShortMessageSendRecord;
import com.xinelu.manage.dto.smssend.SmsInfoDTO;
import com.xinelu.manage.mapper.shortmessagesendrecord.ShortMessageSendRecordMapper;
import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper;
import com.xinelu.manage.service.patienttaskstatistics.IPatientTaskStatisticsService;
import com.xinelu.manage.vo.signpatientmanageroutenode.TextMessage;
import com.xinelu.manage.vo.subscribemessagesendrecord.RecordNum;
import com.xinelu.mobile.utils.SmsSendUtils;
import com.xinelu.quartz.service.SendTextMessageService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
* @Description 短信发送定时任务业务层
@ -45,6 +51,8 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
private PushMessageRestrictions pushMessageRestrictions;
@Resource
private ShortMessageSendRecordMapper shortMessageSendRecordMapper;
@Resource
private IPatientTaskStatisticsService patientTaskStatisticsService;
/**
* 签约患者管理任务路径节点短信发送定时任务
@ -140,6 +148,8 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
//发送
//发送失败ids
List<Long> failSignPatientManageRouteNodeIds = new ArrayList<>();
Set<Long> patientIdSet = new HashSet<>();
if (CollectionUtils.isNotEmpty(messages)) {
List<Long> ids = new ArrayList<>();
for (TextMessage message : messages) {
@ -163,6 +173,7 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
ids.add(message.getSignPatientManageRouteNodeId());
shortMessageSendRecord.setErrorCode(0L);
shortMessageSendRecord.setErrorStatus(ErrorStatusEnum.success.getValue());
} else {
//失败
shortMessageSendRecord.setErrorCode(1L);
@ -174,6 +185,9 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
}
shortMessageSendRecordMapper.insertShortMessageSendRecord(shortMessageSendRecord);
}
// 修改患者任务统计表
patientIdSet.add(message.getPatientId());
}
//修改节点状态
if (CollectionUtils.isNotEmpty(expiredManageRouteNodeIds)) {
@ -183,6 +197,11 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
if (CollectionUtils.isNotEmpty(expiredManageRouteNodeIds)) {
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(failSignPatientManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), null, NodeExecuteResultStatusEnum.FAILURE.getInfo(), null);
}
// 患者任务统计表修改
if (CollectionUtils.isNotEmpty(patientIdSet)) {
patientTaskStatisticsService.updateNum(new ArrayList<>(patientIdSet));
}
}
}
}

View File

@ -20,8 +20,10 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@ -162,6 +164,7 @@ public class subscribeTaskServiceImpl implements SubscribeTaskService {
List<Long> signPatientManageRouteNodeIds = new ArrayList<>();
//发送失败
List<Long> failSignPatientManageRouteNodeIds = new ArrayList<>();
Set<Long> patientIdSet = new HashSet<>();
for (PatientVO patientVO : patientVOList) {
// 开始推送消息
Integer integer = weChatOfficialAccountUtils.sendAppletTemplateMessage(patientVO);
@ -171,6 +174,8 @@ public class subscribeTaskServiceImpl implements SubscribeTaskService {
signPatientManageRouteNodeIds.add(patientVO.getSignPatientManageRouteNodeId());
subscribeMessageSendRecord.setErrorCode(0);
subscribeMessageSendRecord.setErrorStatus(ErrorStatusEnum.success.getValue());
// 修改患者任务统计表
patientIdSet.add(patientVO.getPatientId());
} else {
subscribeMessageSendRecord.setErrorCode(integer);
subscribeMessageSendRecord.setErrorStatus(ErrorStatusEnum.fail.getValue());
@ -196,5 +201,9 @@ public class subscribeTaskServiceImpl implements SubscribeTaskService {
if (CollectionUtils.isNotEmpty(failSignPatientManageRouteNodeIds)) {
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(failSignPatientManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), NodeExecuteResultStatusEnum.FAILURE.getInfo(), null, null);
}
// 患者任务统计表修改
if (CollectionUtils.isNotEmpty(patientIdSet)) {
patientTaskStatisticsService.updateNum(new ArrayList<>(patientIdSet));
}
}
}