diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TemplateMessageEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TemplateMessageEnum.java index fc882a5f..2609b94c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TemplateMessageEnum.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TemplateMessageEnum.java @@ -6,7 +6,7 @@ package com.ruoyi.common.enums; * @author JiangYuQi */ public enum TemplateMessageEnum { - + SERVER_ERROR("_YCnCRtgbtFNNg_78koc8nbFl2gWjeaWFHXV7WV1if8","服务异常通知"), TROUBLE_SUBMIT("f3saBGJCnUAjXHw1KooxEQOOiKEHlQxLIK-sPDgoL_E", "隐患整改通知"), TROUBLE_HANDLE("6mGOWPXS3l5a5fzXd9GIV9_IkEfZmeJ_6G2P_SQkWnU", "隐患处理完成通知"), ROUBLE_EXPIRED_ZG("f3saBGJCnUAjXHw1KooxESpSdHMrh5liznpsbWZV8oA", "隐患整改超时通知"), diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index e4992e47..934349d9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -140,6 +140,17 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils return !isNull(object); } + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object object) + { + return !isNull(object) && !"".equals(object); + } + /** * * 判断一个对象是否是数组类型(Java基本型别的数组) * diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java index dcb276c3..4bd1af88 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/listener/GlobalEventListener.java @@ -1,5 +1,6 @@ package com.ruoyi.flowable.listener; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.config.WechatAccountConfig; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.domain.entity.SysDept; @@ -88,13 +89,18 @@ public class GlobalEventListener extends AbstractFlowableEngineEventListener { ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(event.getProcessInstanceId()).singleResult(); String startUserId = processInstance.getStartUserId(); SysUser sysUser = sysUserMapper.selectUserById(Convert.toLong(startUserId)); + Map map = flowBusinessKeyService.selectLastCommentByProcInsId(processInstance.getId()); + String nodeName = "工程审批"; + if(map!=null){ + nodeName += Convert.toStr(map.get("commentResult"),""); + } //模板数据 WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() .toUser(this.getMsgId(sysUser.getPhonenumber())) .templateId(TemplateMessageEnum.APPLY_DEFAULT.getId()).build(); templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing14", this.getMsgProName(Convert.toLong(processInstance.getBusinessKey())))); templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing1", processInstance.getProcessDefinitionName())); - templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing2", "申请审批通过")); + templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing2", nodeName)); templateMessage.addWxMpTemplateData(new WxMpTemplateData("time4", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,processInstance.getStartTime()))); templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing10", sysUser.getNickName()+"["+this.getMsgDepName(sysUser.getDeptId())+"]")); list.add(templateMessage); @@ -123,6 +129,11 @@ public class GlobalEventListener extends AbstractFlowableEngineEventListener { if(StringUtils.isNotEmpty(candidateUsers) || StringUtils.isNotEmpty(candidateGroups)){ ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(taskEntity.getProcessInstanceId()).singleResult(); List sysUserList = flowBusinessKeyService.findFlowTaskUsers(processInstance.getBusinessKey(),candidateUsers,candidateGroups); + Map map = flowBusinessKeyService.selectLastCommentByProcInsId(processInstance.getId()); + String nodeName = "待"+taskEntity.getName(); + if(map!=null && "驳回".equals(map.get("commentResult"))){ + nodeName += "工程审批驳回,请重新提交或审批"; + } if(StringUtils.isNotEmpty(sysUserList)){ String startUserId = processInstance.getStartUserId(); SysUser sysUser = sysUserMapper.selectUserById(Convert.toLong(startUserId)); @@ -134,7 +145,7 @@ public class GlobalEventListener extends AbstractFlowableEngineEventListener { .templateId(TemplateMessageEnum.APPLY_DEFAULT.getId()).build(); templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing14", this.getMsgProName(Convert.toLong(processInstance.getBusinessKey())))); templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing1", processInstance.getProcessDefinitionName())); - templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing2", Objects.equals(taskEntity.getName(),"提交申请")?"申请审批驳回":"待"+taskEntity.getName())); + templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing2", nodeName)); templateMessage.addWxMpTemplateData(new WxMpTemplateData("time4", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,processInstance.getStartTime()))); templateMessage.addWxMpTemplateData(new WxMpTemplateData("thing10", sysUser.getNickName()+"["+this.getMsgDepName(sysUser.getDeptId())+"]")); list.add(templateMessage); @@ -238,8 +249,13 @@ public class GlobalEventListener extends AbstractFlowableEngineEventListener { return openIds; }else{ List list = sysUserOpenidMapper.findSysUserOpenidsByUser(userName); - List strs = list.stream().map(SysUserOpenid :: getMsgOpenId).collect(Collectors.toList()); - openIds = String.join(",",strs); + if(StringUtils.isNotEmpty(list)){ + List ids = list.stream().filter(u -> StringUtils.isNotBlank(u.getMsgOpenId())).collect(Collectors.toList()); + if(StringUtils.isNotEmpty(ids)){ + List strs = ids.stream().map(SysUserOpenid :: getMsgOpenId).collect(Collectors.toList()); + openIds = String.join(",",strs); + } + } //设置30分钟有效期 redisCache.setCacheObject(CacheConstants.WX_MPMESSAGE_OPENID +userName,openIds,30, TimeUnit.MINUTES); return openIds; @@ -278,6 +294,21 @@ public class GlobalEventListener extends AbstractFlowableEngineEventListener { } }catch (Exception e){ log.info("出错了...{}",e.getMessage()); + try { + JSONObject jsonObject = JSONObject.parseObject(e.getMessage()); + if(Objects.equals(jsonObject.getString("errcode"),"40164")){ + String ip = jsonObject.getString("errmsg").split("ipv6")[0].split(" ")[2]; + WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() + .toUser("oM5rN6Wb8UyBLuTAFNGjnZCeQs1U") + .templateId(TemplateMessageEnum.SERVER_ERROR.getId()) + .build(); + templateMessage.addWxMpTemplateData(new WxMpTemplateData("character_string7", "IP>"+ip)); + templateMessage.addWxMpTemplateData(new WxMpTemplateData("time6", DateUtils.dateTimeNow())); + wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage); + } + }catch (Exception ex){ + ex.printStackTrace(); + } } } diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowBusinessKeyService.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowBusinessKeyService.java index ea9403be..7630498b 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowBusinessKeyService.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowBusinessKeyService.java @@ -47,6 +47,13 @@ public interface IFlowBusinessKeyService { */ public List> selectCommentByProcInsId(String procInsId); + /** + * 根据条件流程Id查询操作日志 + * @param procInsId + * @return + */ + public Map selectLastCommentByProcInsId(String procInsId); + /** * 根据流程Id查询表单数据 * @param procInsId diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowBusinessKeyServiceImpl.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowBusinessKeyServiceImpl.java index afd4efa3..f4d8c4c7 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowBusinessKeyServiceImpl.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowBusinessKeyServiceImpl.java @@ -81,6 +81,16 @@ public class FlowBusinessKeyServiceImpl implements IFlowBusinessKeyService { return flowBusinessKeyMapper.selectCommentByProcInsId(procInsId); } + /** + * 根据条件流程Id查询操作日志 + * @param procInsId + * @return + */ + @Override + public Map selectLastCommentByProcInsId(String procInsId){ + return flowBusinessKeyMapper.selectLastCommentByProcInsId(procInsId); + } + /** * 根据流程Id查询表单数据 * @param procInsId diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/FlowTaskExpiredTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/FlowTaskExpiredTask.java index 5ee70b77..0960e79c 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/FlowTaskExpiredTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/FlowTaskExpiredTask.java @@ -1,5 +1,6 @@ package com.ruoyi.quartz.task; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.config.WechatAccountConfig; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.domain.entity.SysUser; @@ -7,8 +8,10 @@ import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.enums.MessageTypeEnum; import com.ruoyi.common.enums.TemplateMessageEnum; +import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.quartz.service.ITaskService; +import com.ruoyi.system.domain.SysUserOpenid; import com.ruoyi.system.service.ISysConfigService; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.mp.api.WxMpService; @@ -17,9 +20,7 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -301,7 +302,7 @@ public class FlowTaskExpiredTask { String minNickTime = Convert.toStr(dataMap.get("minNickTime")); Integer infotype = Convert.toInt(dataMap.get("infotype")); String handlePath = infotype==0?"security":"quality"; - String infoTypeName = infotype==0?"安全隐患":"安全隐患"; + String infoTypeName = infotype==0?"安全隐患":"质量隐患"; String total = Convert.toStr(dataMap.get("total")); //模板数据 WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() @@ -350,7 +351,7 @@ public class FlowTaskExpiredTask { String minNickTime = Convert.toStr(dataMap.get("minNickTime")); Integer infotype = Convert.toInt(dataMap.get("infotype")); String handlePath = infotype==0?"security":"quality"; - String infoTypeName = infotype==0?"安全隐患":"安全隐患"; + String infoTypeName = infotype==0?"安全隐患":"质量隐患"; String total = Convert.toStr(dataMap.get("total")); //模板数据 WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() @@ -388,8 +389,13 @@ public class FlowTaskExpiredTask { return openIds; }else{ List> list = taskService.findSysUserOpenidsByUser(userName); - List strs = list.stream().map(Map -> Map.get("msgOpenId").toString()).collect(Collectors.toList()); - openIds = String.join(",",strs); + if(StringUtils.isNotEmpty(list)){ + List> ids = list.stream().filter(m -> StringUtils.isNotEmpty(m.get("msgOpenId"))).collect(Collectors.toList()); + if(StringUtils.isNotEmpty(ids)){ + List strs = ids.stream().map(Map -> Map.get("msgOpenId").toString()).collect(Collectors.toList()); + openIds = String.join(",",strs); + } + } //设置30分钟有效期 redisCache.setCacheObject(CacheConstants.WX_MPMESSAGE_OPENID +userName,openIds,30, TimeUnit.MINUTES); return openIds; @@ -428,6 +434,22 @@ public class FlowTaskExpiredTask { } }catch (Exception e){ log.info("出错了...{}",e.getMessage()); + try { + JSONObject jsonObject = JSONObject.parseObject(e.getMessage()); + if(Objects.equals(jsonObject.getString("errcode"),"40164")){ + String ip = jsonObject.getString("errmsg").split("ipv6")[0].split(" ")[2]; + WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() + .toUser("oM5rN6Wb8UyBLuTAFNGjnZCeQs1U") + .templateId(TemplateMessageEnum.SERVER_ERROR.getId()) + .build(); + templateMessage.addWxMpTemplateData(new WxMpTemplateData("character_string7", "IP>"+ip)); + templateMessage.addWxMpTemplateData(new WxMpTemplateData("time6", DateUtils.dateTimeNow())); + wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage); + } + }catch (Exception ex){ + ex.printStackTrace(); + } } } + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/FlowBusinessKeyMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/FlowBusinessKeyMapper.java index f7694429..0342e318 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/FlowBusinessKeyMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/FlowBusinessKeyMapper.java @@ -40,6 +40,13 @@ public interface FlowBusinessKeyMapper { */ public List> selectCommentByProcInsId(String procInsId); + /** + * 根据条件流程Id查询操作日志 + * @param procInsId + * @return + */ + public Map selectLastCommentByProcInsId(String procInsId); + /** * 根据流程Id查询表单数据 * @param procInsId diff --git a/ruoyi-system/src/main/resources/mapper/flowable/FlowBusinessKeyMapper.xml b/ruoyi-system/src/main/resources/mapper/flowable/FlowBusinessKeyMapper.xml index 61503efc..a19a4b75 100644 --- a/ruoyi-system/src/main/resources/mapper/flowable/FlowBusinessKeyMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/flowable/FlowBusinessKeyMapper.xml @@ -61,6 +61,10 @@ select * from vw_flow_comment where procInstId = #{procInstId} order by startTime DESC + + +