ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
@@ -13,10 +13,7 @@ import com.ruoyi.common.enums.ServiceFromEnum; import com.ruoyi.common.enums.WxGZHEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.HttpUtil; import com.ruoyi.common.utils.OkHttpExample; import com.ruoyi.common.utils.RSAPublicKeyExample; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.*; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.sign.Md5Utils; import com.ruoyi.common.utils.sms.smsUtils; @@ -937,7 +934,8 @@ serviceSubtaskPreachform1.setRemark(remark); serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1); //如果当前的preachform已经是最后一个了,并且本次还是发送失败,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了) if (CollectionUtils.isNotEmpty(spSize) && serviceSubtaskPreachform1.getSort() == spSize.size()) { if (CollectionUtils.isNotEmpty(spSize) && serviceSubtaskPreachform1.getSort() == spSize.size() && isSubtaskDeadline(serviceSubtask, serviceSubtaskPreachforms)) { if (serviceSubtaskPreachform1.getSort() == spSize.size()) { if (failSendstate.equals("4") || failSendstate.equals("5")) { serviceSubtask.setCurrentPreachform(preachform); @@ -1089,4 +1087,28 @@ } return toHex(md5.digest()); } /** * 随访任务是否超时 * @param serviceSubtask * @param serviceSubtaskPreachforms * @return */ public boolean isSubtaskDeadline(ServiceSubtask serviceSubtask, List<ServiceSubtaskPreachform> serviceSubtaskPreachforms){ if (Objects.isNull(serviceSubtask) || CollectionUtils.isEmpty(serviceSubtaskPreachforms)) { return false; } // 基准时刻:出院时间 + 发送日(sendDay 缺省按 1),并兜底避免 NPE/脏数据 ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); int sendDay = serviceTask != null && serviceTask.getSendDay() != null ? serviceTask.getSendDay().intValue() : 1; Date deadline = DateUtils.addDays(serviceSubtask.getEndtime(), sendDay); int sumCompensateTime = CollectionUtils.isEmpty(serviceSubtaskPreachforms) ? 0 : serviceSubtaskPreachforms.stream() .mapToInt(x -> x.getCompensateTime() == null ? 0 : Integer.parseInt(x.getCompensateTime())) .sum(); sumCompensateTime = sumCompensateTime + 1; // 只补偿最后一步自身的补偿时间(天),脏值一律按 0 兜底 deadline = DateUtils.addDays(deadline, sumCompensateTime); // 出院(发送)时间 + 本步补偿时间 小于当前时间 -> 超时 return deadline.getTime() < new Date().getTime(); } } ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -847,7 +847,9 @@ //2判断一下,当前的sort是不是等于需要执行的总个数,如果等于的话,说明是最后一个,直接将servuce_subtask的状态改成5,执行失败就行了 Long cs = currentSort.get(); if (cs.equals(serviceSubtaskPreachforms.size())) { if (cs.equals(serviceSubtaskPreachforms.size()) && isSubtaskDeadline(serviceSubtask, serviceSubtaskPreachforms)) { serviceSubtask.setSendstate(7L); serviceSubtask.setRemark("处理补偿任务,当前处理最后补偿,全部执行失败(超时)"); @@ -1362,9 +1364,9 @@ serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); return "-1"; } // 当sort等于列表size时,并且所有sendstate都不等于9,则返回-1 if (currentSort.get().equals((long) serviceSubtaskPreachforms.size())) { if (currentSort.get().equals((long) serviceSubtaskPreachforms.size()) && isSubtaskDeadline(serviceSubtask, serviceSubtaskPreachforms)) { if (allSendStateNot1AndNot9) { //说明全发送失败了 serviceSubtask.setSendstate(7L); @@ -1561,7 +1563,8 @@ serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1); //如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成7就行了(全超时了) if (serviceSubtaskPreachform1.getSort() == sspCount.size()) { if (serviceSubtaskPreachform1.getSort() == sspCount.size() && isSubtaskDeadline(serviceSubtask, serviceSubtaskPreachforms)) { if (failSendstate.equals("4") || failSendstate.equals("5")) { serviceSubtask.setCurrentPreachform(preachform); serviceSubtask.setSendstate(7L); @@ -1678,4 +1681,28 @@ log.error("【rollTaskGroupCycle】滚动调度异常", e); } } /** * 随访任务是否超时 * @param serviceSubtask * @param serviceSubtaskPreachforms * @return */ public boolean isSubtaskDeadline(ServiceSubtask serviceSubtask, List<ServiceSubtaskPreachform> serviceSubtaskPreachforms){ if (Objects.isNull(serviceSubtask) || CollectionUtils.isEmpty(serviceSubtaskPreachforms)) { return false; } // 基准时刻:出院时间 + 发送日(sendDay 缺省按 1),并兜底避免 NPE/脏数据 ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); int sendDay = serviceTask != null && serviceTask.getSendDay() != null ? serviceTask.getSendDay().intValue() : 1; Date deadline = DateUtils.addDays(serviceSubtask.getEndtime(), sendDay); int sumCompensateTime = CollectionUtils.isEmpty(serviceSubtaskPreachforms) ? 0 : serviceSubtaskPreachforms.stream() .mapToInt(x -> x.getCompensateTime() == null ? 0 : Integer.parseInt(x.getCompensateTime())) .sum(); sumCompensateTime = sumCompensateTime + 1; // 只补偿最后一步自身的补偿时间(天),脏值一律按 0 兜底 deadline = DateUtils.addDays(deadline, sumCompensateTime); // 出院(发送)时间 + 本步补偿时间 小于当前时间 -> 超时 return deadline.getTime() < new Date().getTime(); } } smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -281,7 +281,6 @@ <include refid="selectServiceSubtaskVo"/> where 1=1 and del_flag = 0 and sendstate != 5 <if test="orgid != null and orgid != ''"> and orgid = #{orgid} </if> @@ -291,26 +290,6 @@ <if test="taskid != null ">and taskid = #{taskid}</if> <if test="visitTime != null"> AND date_format(visit_time,'%y%m%d') <= date_format(#{visitTime},'%y%m%d') </if> <if test="sendstate != null ">and sendstate = #{sendstate}</if> <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if> <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow,jdbcType=TIMESTAMP}</if> <if test="continueCount != null ">and continue_count = #{continueCount}</if> <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if> UNION ALL <include refid="selectServiceSubtaskVo"/> where 1=1 and del_flag = 0 and sendstate = 5 <if test="orgid != null and orgid != ''"> and orgid = #{orgid} </if> <if test="subId != null"> AND id = #{subId} </if> <if test="taskid != null ">and taskid = #{taskid}</if> <if test="visitTime != null"> AND date_format(visit_time,'%y%m%d') <= date_format(DATE_ADD(#{visitTime}, INTERVAL 1 DAY),'%y%m%d') </if> <if test="sendstate != null ">and sendstate = #{sendstate}</if> <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>