短信推送修改

This commit is contained in:
zhangheng 2024-07-31 17:25:04 +08:00
parent 57a67a0509
commit 97140adfee
14 changed files with 153 additions and 68 deletions

View File

@ -81,8 +81,8 @@ public class PatientTaskExecuteRecordController extends BaseController {
* 根据患者信息查询就诊记录
*/
@GetMapping("/selectVisitRecord")
public AjaxResult selectVisitRecord(Long id) {
return patientTaskExecuteRecordService.selectVisitRecord(id);
public AjaxResult selectVisitRecord(Long id, Long patientId) {
return patientTaskExecuteRecordService.selectVisitRecord(id, patientId);
}
/**

View File

@ -2,6 +2,7 @@ package com.xinelu.manage.mapper.patienttaskexecuterecord;
import com.xinelu.manage.domain.patienttaskexecuterecord.PatientTaskExecuteRecord;
import com.xinelu.manage.vo.patienttaskexecuterecord.PatientTaskExecuteRecordVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -74,5 +75,5 @@ public interface PatientTaskExecuteRecordMapper {
* @param id id
* @return AjaxResult
*/
PatientTaskExecuteRecordVO selectVisitRecord(Long id);
PatientTaskExecuteRecordVO selectVisitRecord(@Param("id") Long id, @Param("patientId") Long patientId);
}

View File

@ -1,6 +1,8 @@
package com.xinelu.manage.mapper.shortmessagesendrecord;
import com.xinelu.manage.domain.shortmessagesendrecord.ShortMessageSendRecord;
import com.xinelu.manage.vo.subscribemessagesendrecord.RecordNum;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -58,4 +60,12 @@ public interface ShortMessageSendRecordMapper {
* @return 结果
*/
int deleteShortMessageSendRecordByIds(Long[] ids);
/**
* 节点推送数量
*
* @param manageRouteNodeIds 节点id
* @return RecordNum
*/
List<RecordNum> selectShortMessageRecordCountByManageRouteNodeIds(@Param("manageRouteNodeIds") List<Long> manageRouteNodeIds);
}

View File

@ -103,21 +103,23 @@ public interface SignPatientManageRouteNodeMapper {
*/
int updateMessageStatus(SignPatientManageRouteNode signPatientManageRouteNode);
List<SpecialDiseaseNodeAuditVo> selectByRouteId(Long manageRouteId);
List<SpecialDiseaseNodeAuditVo> selectByRouteId(Long manageRouteId);
/**
* 任务审核查询手动创建的任务节点详情
* @param manageRouteIds 路径主键列表
* @return 节点详细信息列表
*/
List<SignPatientManageNodeAuditVo> selectAuditNodeInfo(@Param("manageRouteIds") List<Long> manageRouteIds);
/**
* 任务审核查询手动创建的任务节点详情
*
* @param manageRouteIds 路径主键列表
* @return 节点详细信息列表
*/
List<SignPatientManageNodeAuditVo> selectAuditNodeInfo(@Param("manageRouteIds") List<Long> manageRouteIds);
/**
* 根据路径主键列表查询节点列表
* @param manageRouteIds 路径主键列表
* @return 节点列表
*/
List<SignPatientManageRouteNode> selectNodesByManageIds(@Param("manageRouteIds") List<Long> manageRouteIds);
/**
* 根据路径主键列表查询节点列表
*
* @param manageRouteIds 路径主键列表
* @return 节点列表
*/
List<SignPatientManageRouteNode> selectNodesByManageIds(@Param("manageRouteIds") List<Long> manageRouteIds);
/**
* 查询患者管理路径节点内容
@ -135,10 +137,14 @@ public interface SignPatientManageRouteNodeMapper {
List<TextMessage> selectMessagePushSign();
/**
* 根据节点id修改状态
* 修改执行状态
*
* @param ids 节点ids
* @param manageRouteNodeIds 节点id
* @param nodeExecuteStatus 执行状态
* @param appletStatus 小程序发送状态
* @param messageStatus 短信发送状态
* @param officialStatus 公众号发送状态
* @return int
*/
int updateMessageStatusByIds(@Param("ids") List<Long> ids);
int updateNodeExecuteStatusByIds(@Param("manageRouteNodeIds") List<Long> manageRouteNodeIds, @Param("nodeExecuteStatus") String nodeExecuteStatus, @Param("appletStatus") String appletStatus, @Param("messageStatus") String messageStatus, @Param("officialStatus") String officialStatus);
}

View File

@ -64,10 +64,11 @@ public interface IPatientTaskExecuteRecordService {
/**
* 根据患者信息查询就诊记录
*
* @param id 记录id
* @param id 记录id
* @param patientId 患者id
* @return AjaxResult
*/
AjaxResult selectVisitRecord(Long id);
AjaxResult selectVisitRecord(Long id, Long patientId);
/**
* 根据任务执行记录查询患者问卷信息

View File

@ -104,9 +104,9 @@ public class PatientTaskExecuteRecordServiceImpl implements IPatientTaskExecuteR
* @return AjaxResult
*/
@Override
public AjaxResult selectVisitRecord(Long id) {
PatientTaskExecuteRecordVO patientTaskExecuteRecordVO = patientTaskExecuteRecordMapper.selectVisitRecord(id);
if (Objects.nonNull(patientTaskExecuteRecordVO.getBirthDate())) {
public AjaxResult selectVisitRecord(Long id, Long patientId) {
PatientTaskExecuteRecordVO patientTaskExecuteRecordVO = patientTaskExecuteRecordMapper.selectVisitRecord(id, patientId);
if (Objects.nonNull(patientTaskExecuteRecordVO) && Objects.nonNull(patientTaskExecuteRecordVO.getBirthDate())) {
patientTaskExecuteRecordVO.setAge(AgeUtil.getAgeMonth(patientTaskExecuteRecordVO.getBirthDate().toString()));
}
return AjaxResult.success(patientTaskExecuteRecordVO);

View File

@ -303,20 +303,28 @@
<select id="selectVisitRecord"
resultType="com.xinelu.manage.vo.patienttaskexecuterecord.PatientTaskExecuteRecordVO">
select pvr.in_hospital_info,
pvr.out_hospital_info,
pvr.surgical_record,
ri.patient_name,
ri.patient_phone,
ri.family_member_phone,
ri.birth_date,
ri.card_no,
ri.sex,
ri.address
FROM patient_task_execute_record pter
LEFT JOIN patient_visit_record pvr ON pter.visit_record_id = pvr.id
LEFT JOIN patient_info pi ON pi.id = pter.patient_id
LEFT JOIN resident_info ri ON ri.id = pi.resident_id
where pter.id = #{id}
select
pvr.in_hospital_info,
pvr.out_hospital_info,
pvr.surgical_record,
ri.patient_name,
ri.patient_phone,
ri.family_member_phone,
ri.birth_date,
ri.card_no,
ri.sex,
ri.address
FROM patient_info pi
LEFT JOIN patient_task_execute_record pter ON pi.id = pter.patient_id
LEFT JOIN patient_visit_record pvr ON pter.visit_record_id = pvr.id
LEFT JOIN resident_info ri ON ri.id = pi.resident_id
<where>
<if test="id != null">
and pter.id = #{id}
</if>
<if test="patientId != null">
and pi.id = #{patientId}
</if>
</where>
</select>
</mapper>

View File

@ -198,4 +198,16 @@
#{id}
</foreach>
</delete>
<select id="selectShortMessageRecordCountByManageRouteNodeIds"
resultType="com.xinelu.manage.vo.subscribemessagesendrecord.RecordNum">
select
manage_route_node_id,
COUNT(1) num
from short_message_send_record
where manage_route_node_id IN
<foreach item="manageRouteNodeId" collection="manageRouteNodeId" open="(" separator="," close=")">
#{manageRouteNodeId}
</foreach>
</select>
</mapper>

View File

@ -872,14 +872,28 @@
where spmrn.message_push_sign = 1
and spmrn.del_flag = 0
and spmrn.node_execute_status = 'UNEXECUTED'
and (spmrn.message_node_execute_result_status is null or spmrn.message_node_execute_result_status = ' ')
</select>
<update id="updateMessageStatusByIds">
<update id="updateNodeExecuteStatusByIds">
update sign_patient_manage_route_node
set message_status = 'EXECUTED'
<trim prefix="SET" suffixOverrides=",">
<if test="nodeExecuteStatus != null">node_execute_status =
#{nodeExecuteStatus},
</if>
<if test="appletStatus != null">applet_node_execute_result_status =
#{appletStatus},
</if>
<if test="messageStatus != null">message_node_execute_result_status =
#{messageStatus},
</if>
<if test="officialStatus != null">official_node_execute_result_status =
#{officialStatus},
</if>
</trim>
where id in
<foreach item="ids" collection="ids" open="(" separator="," close=")">
#{ids}
<foreach item="manageRouteNodeIds" collection="manageRouteNodeIds" open="(" separator="," close=")">
#{manageRouteNodeIds}
</foreach>
</update>
</mapper>

View File

@ -242,6 +242,5 @@
<foreach item="manageRouteNodeId" collection="manageRouteNodeId" open="(" separator="," close=")">
#{manageRouteNodeId}
</foreach>
</select>
</mapper>

View File

@ -60,14 +60,6 @@ public interface HomePageMapper {
*/
List<PatientVO> selectSignPatientManageRouteNode(@Param("patientId") List<Long> patientId);
/**
* 修改执行状态
*
* @param signPatientManageRouteNodeIds 节点id
* @return int
*/
int updateNodeExecuteStatusByIds(@Param("signPatientManageRouteNodeIds") List<Long> signPatientManageRouteNodeIds, @Param("nodeExecuteStatus") String nodeExecuteStatus, @Param("appletNodeExecuteResultStatus") String appletNodeExecuteResultStatus);
/**
* 查询个人任务消息
*

View File

@ -147,17 +147,6 @@
</if>
</select>
<update id="updateNodeExecuteStatusByIds">
update sign_patient_manage_route_node
set node_execute_status = #{nodeExecuteStatus},
applet_node_execute_result_status = #{appletNodeExecuteResultStatus}
where id in
<foreach item="signPatientManageRouteNodeIds" collection="signPatientManageRouteNodeIds" open="(" separator=","
close=")">
#{signPatientManageRouteNodeIds}
</foreach>
</update>
<select id="selectManageRouteByResidentId"
resultType="com.xinelu.mobile.vo.homepage.MessageTabulationVO">
select spmrn.id manageRouteNodeId,

View File

@ -2,10 +2,17 @@ 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.ErrorStatusEnum;
import com.xinelu.common.enums.NodeExecuteResultStatusEnum;
import com.xinelu.common.enums.NodeExecuteStatusEnum;
import com.xinelu.common.enums.RouteNodeNameEnum;
import com.xinelu.manage.domain.subscribemessagesendrecord.SubscribeMessageSendRecord;
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.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;
@ -18,6 +25,7 @@ import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Description 短信发送定时任务业务层
@ -34,6 +42,10 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
private SmsSendUtils smsSendUtils;
@Resource
private AliYunSmsTwoConfig aliYunSmsTwoConfig;
@Resource
private PushMessageRestrictions pushMessageRestrictions;
@Resource
private ShortMessageSendRecordMapper shortMessageSendRecordMapper;
/**
* 签约患者管理任务路径节点短信发送定时任务
@ -44,7 +56,13 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
public void sendTextMessageSendTask() throws ClientException {
//查询短信发送数据
List<TextMessage> textMessages = signPatientManageRouteNodeMapper.selectMessagePushSign();
if (CollectionUtils.isEmpty(textMessages)) {
return;
}
//条件过滤后短信信息
List<TextMessage> messages = new ArrayList<>();
//超时短信ids
List<Long> expiredManageRouteNodeIds = new ArrayList<>();
for (TextMessage textMessage : textMessages) {
//判断推送状态
if (Objects.isNull(textMessage.getMessagePushSign()) || textMessage.getMessagePushSign() != 1) {
@ -70,10 +88,20 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
}
boolean before = localDate.isBefore(LocalDate.now()) || localDate.isEqual(LocalDate.now());
if (before) {
//超出7天更改状态
int i = LocalDate.now().compareTo(localDate);
if (i >= pushMessageRestrictions.getTime()) {
expiredManageRouteNodeIds.add(textMessage.getSignPatientManageRouteNodeId());
continue;
}
textMessage.setRouteNodeName(RouteNodeNameEnum.getNameByInfo(textMessage.getRouteNodeName()).getName());
messages.add(textMessage);
}
}
//更改过期执行状态
if (CollectionUtils.isNotEmpty(expiredManageRouteNodeIds)) {
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(expiredManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), null, NodeExecuteResultStatusEnum.EXPIRED.getInfo(), null);
}
//判断路径节点组装数据
// if (textMessage.getRouteNodeName().equals(RouteNodeNameEnum.AFTER_DISCHARGE.getInfo()) || textMessage.getRouteNodeName().equals(RouteNodeNameEnum.AFTER_VISIT_DISCHARGE.getInfo())) {
@ -107,7 +135,12 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
// }
// }
// }
//节点推送数量
List<Long> collect = messages.stream().filter(Objects::nonNull).map(TextMessage::getSignPatientManageRouteNodeId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
List<RecordNum> recordNums = shortMessageSendRecordMapper.selectShortMessageRecordCountByManageRouteNodeIds(collect);
//发送
//发送失败ids
List<Long> failSignPatientManageRouteNodeIds = new ArrayList<>();
if (CollectionUtils.isNotEmpty(messages)) {
List<Long> ids = new ArrayList<>();
for (TextMessage message : messages) {
@ -117,13 +150,30 @@ public class SendTextMessageServiceImpl implements SendTextMessageService {
// 根据模版id发送
smsInfoDTO.setTemplateCode(message.getTextMessageId());
Boolean aBoolean = smsSendUtils.sendTextMessage(smsInfoDTO);
SubscribeMessageSendRecord subscribeMessageSendRecord = new SubscribeMessageSendRecord();
//成功
if (aBoolean) {
ids.add(message.getSignPatientManageRouteNodeId());
subscribeMessageSendRecord.setErrorCode(0);
subscribeMessageSendRecord.setErrorStatus(ErrorStatusEnum.success.getValue());
} else {
//失败
subscribeMessageSendRecord.setErrorCode(1);
subscribeMessageSendRecord.setErrorStatus(ErrorStatusEnum.fail.getValue());
RecordNum recordNum = recordNums.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getManageRouteNodeId()) && item.getManageRouteNodeId().equals(message.getSignPatientManageRouteNodeId())).findFirst().orElse(new RecordNum());
//三次失败
if (Objects.nonNull(recordNum.getNum()) && recordNum.getNum() >= pushMessageRestrictions.getNumber()) {
failSignPatientManageRouteNodeIds.add(message.getSignPatientManageRouteNodeId());
}
}
}
//修改节点状态
if (CollectionUtils.isNotEmpty(ids)) {
signPatientManageRouteNodeMapper.updateMessageStatusByIds(ids);
if (CollectionUtils.isNotEmpty(expiredManageRouteNodeIds)) {
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(ids, NodeExecuteStatusEnum.EXECUTED.getInfo(), null, NodeExecuteResultStatusEnum.SUCCESS.getInfo(), null);
}
//修改节点状态
if (CollectionUtils.isNotEmpty(expiredManageRouteNodeIds)) {
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(failSignPatientManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), null, NodeExecuteResultStatusEnum.FAILURE.getInfo(), null);
}
}
}

View File

@ -6,6 +6,7 @@ import com.xinelu.common.config.WeChatAppletChatConfig;
import com.xinelu.common.enums.*;
import com.xinelu.common.utils.SecurityUtils;
import com.xinelu.manage.domain.subscribemessagesendrecord.SubscribeMessageSendRecord;
import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper;
import com.xinelu.manage.mapper.subscribemessagesendrecord.SubscribeMessageSendRecordMapper;
import com.xinelu.manage.vo.subscribemessagesendrecord.RecordNum;
import com.xinelu.mobile.domain.TemplateContent;
@ -44,6 +45,8 @@ public class subscribeTaskServiceImpl implements SubscribeTaskService {
private SubscribeMessageSendRecordMapper subscribeMessageSendRecordMapper;
@Resource
private PushMessageRestrictions pushMessageRestrictions;
@Resource
private SignPatientManageRouteNodeMapper signPatientManageRouteNodeMapper;
/**
* 推送任务组装数据
@ -96,7 +99,7 @@ public class subscribeTaskServiceImpl implements SubscribeTaskService {
}
//更改过期执行状态
if (CollectionUtils.isNotEmpty(expiredManageRouteNodeIds)) {
homePageMapper.updateNodeExecuteStatusByIds(expiredManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), NodeExecuteResultStatusEnum.EXPIRED.getInfo());
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(expiredManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), NodeExecuteResultStatusEnum.EXPIRED.getInfo(), null, null);
}
// //如果节点 适用范围是 出院后或就诊/出院后
@ -190,11 +193,11 @@ public class subscribeTaskServiceImpl implements SubscribeTaskService {
}
//更改成功执行状态
if (CollectionUtils.isNotEmpty(signPatientManageRouteNodeIds)) {
homePageMapper.updateNodeExecuteStatusByIds(signPatientManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), NodeExecuteResultStatusEnum.SUCCESS.getInfo());
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(signPatientManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), NodeExecuteResultStatusEnum.SUCCESS.getInfo(), null, null);
}
//更改失败执行状态
if (CollectionUtils.isNotEmpty(failSignPatientManageRouteNodeIds)) {
homePageMapper.updateNodeExecuteStatusByIds(failSignPatientManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), NodeExecuteResultStatusEnum.FAILURE.getInfo());
signPatientManageRouteNodeMapper.updateNodeExecuteStatusByIds(failSignPatientManageRouteNodeIds, NodeExecuteStatusEnum.EXECUTED.getInfo(), NodeExecuteResultStatusEnum.FAILURE.getInfo(), null, null);
}
}
}