Compare commits
2 Commits
e221e66dfb
...
ff46d9065f
Author | SHA1 | Date | |
---|---|---|---|
ff46d9065f | |||
5481897076 |
@@ -157,7 +157,7 @@ public class WeChatUtil {
|
|||||||
String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
|
String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
|
||||||
|
|
||||||
JSONObject msg = new JSONObject();
|
JSONObject msg = new JSONObject();
|
||||||
msg.put("touser", "2023429229");
|
msg.put("touser", toUser);
|
||||||
msg.put("msgtype", "text");
|
msg.put("msgtype", "text");
|
||||||
msg.put("agentid", weChatConfig.getAgentId());
|
msg.put("agentid", weChatConfig.getAgentId());
|
||||||
|
|
||||||
|
@@ -0,0 +1,124 @@
|
|||||||
|
package com.srs.flowable.listener.disciplinary; // 您可以根据需要调整包路径
|
||||||
|
|
||||||
|
import com.srs.common.utils.SecurityUtils;
|
||||||
|
import com.srs.comprehensive.domain.CphMsg;
|
||||||
|
import com.srs.comprehensive.service.ICphMsgService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
|
import org.flowable.engine.delegate.ExecutionListener;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 【通用线上监听器】为即将到来的任务创建内部“我的消息”记录。
|
||||||
|
* <p>
|
||||||
|
* 该监听器被设计为在SequenceFlow的'take'事件上触发。
|
||||||
|
* 它会智能地从流程变量中读取单个接收人(变量名: approval)或多个接收人(变量名: userList),
|
||||||
|
* 然后为每一位接收人创建一条内部消息。
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
@Component("genericMessageListener") // 定义一个清晰、通用的Spring Bean名称
|
||||||
|
@Slf4j
|
||||||
|
public class GenericMessageListener implements ExecutionListener {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ICphMsgService cphMsgService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notify(DelegateExecution execution) {
|
||||||
|
log.info("流程实例 [{}]: 触发通用消息监听器 (GenericMessageListener)...", execution.getProcessInstanceId());
|
||||||
|
|
||||||
|
// 步骤 1: 智能地从流程变量中获取接收人ID列表
|
||||||
|
List<Long> receiverIdList = getReceiverIds(execution);
|
||||||
|
|
||||||
|
// 如果没有找到任何接收人,则记录日志并直接返回
|
||||||
|
if (receiverIdList.isEmpty()) {
|
||||||
|
log.warn("流程实例 [{}]: 未能从流程变量中找到任何有效的接收人 (未能解析 'approval' 或 'userList' 变量),已跳过创建内部消息。", execution.getProcessInstanceId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 步骤 2: 准备消息内容和发送人
|
||||||
|
// 您可以根据业务需求,让消息内容更具动态性,比如从流程变量中获取任务标题
|
||||||
|
String taskName = execution.getCurrentFlowElement() != null ? execution.getCurrentFlowElement().getName() : "新";
|
||||||
|
String messageContent = "您有一条新的【" + taskName + "】待办任务需要处理,<a href='http://zhxg.gxsdxy.cn/web/#/pages/Approval/index'>请点击前往处理</a>。";
|
||||||
|
Long senderId = getSenderId();
|
||||||
|
|
||||||
|
// 步骤 3: 遍历所有接收人,并为每位用户创建一条内部消息
|
||||||
|
for (Long receiverId : receiverIdList) {
|
||||||
|
try {
|
||||||
|
CphMsg cphMsg = new CphMsg();
|
||||||
|
cphMsg.setReceiver(receiverId);
|
||||||
|
cphMsg.setSender(senderId);
|
||||||
|
cphMsg.setContent(messageContent);
|
||||||
|
|
||||||
|
// 调用您已有的服务插入消息
|
||||||
|
cphMsgService.insertCphMsg(cphMsg);
|
||||||
|
log.info("已成功为用户 [{}] 创建关于任务 [{}] 的内部消息。", receiverId, taskName);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 捕获单个用户创建失败的异常,确保不影响其他人
|
||||||
|
log.error("为用户 [{}] 创建内部消息时发生异常: {}", receiverId, e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 智能地从流程变量中解析出接收人ID列表。
|
||||||
|
* 策略是:
|
||||||
|
* 1. 优先检查 'userList' 变量,这通常用于多实例任务。
|
||||||
|
* 2. 如果 'userList' 不存在或无效,则检查 'approval' 变量,这通常用于单实例任务。
|
||||||
|
*
|
||||||
|
* @param execution 当前的执行实例
|
||||||
|
* @return 包含一个或多个用户ID的列表,如果都找不到则返回空列表。
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private List<Long> getReceiverIds(DelegateExecution execution) {
|
||||||
|
// 优先检查 'userList' (用于多实例)
|
||||||
|
Object userListObj = execution.getVariable("userList");
|
||||||
|
if (userListObj instanceof List && !((List<?>) userListObj).isEmpty()) {
|
||||||
|
try {
|
||||||
|
// 确保列表内容是Long类型
|
||||||
|
return (List<Long>) userListObj;
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
log.error("流程变量 'userList' 不是 Long 类型的列表。", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 其次检查 'approval' (用于单实例)
|
||||||
|
Object approvalObj = execution.getVariable("approval");
|
||||||
|
if (approvalObj instanceof Number) {
|
||||||
|
return Collections.singletonList(((Number) approvalObj).longValue());
|
||||||
|
}
|
||||||
|
// 兼容字符串形式的ID
|
||||||
|
if (approvalObj instanceof String) {
|
||||||
|
try {
|
||||||
|
return Collections.singletonList(Long.parseLong((String) approvalObj));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("流程变量 'approval' 的值 '{}' 无法转换为Long类型。", approvalObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果都找不到,返回一个不可变的空列表
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 安全地获取当前操作的发送人ID。
|
||||||
|
* 在异步执行的监听器中,可能无法获取到安全上下文,因此提供了默认值。
|
||||||
|
*
|
||||||
|
* @return 发送人用户ID,默认为1L (系统管理员)。
|
||||||
|
*/
|
||||||
|
private Long getSenderId() {
|
||||||
|
try {
|
||||||
|
Long userId = SecurityUtils.getUserId();
|
||||||
|
// 如果SecurityUtils返回null,也使用默认值
|
||||||
|
return userId != null ? userId : 1L;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("在监听器中获取发送人ID时发生异常,将使用默认系统管理员ID(1L)。异常信息: {}", e.getMessage());
|
||||||
|
return 1L; // 默认为系统管理员
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -5,6 +5,7 @@ import com.srs.flowable.mapper.DisciplinaryMapper;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.flowable.engine.delegate.DelegateExecution;
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
import org.flowable.engine.delegate.ExecutionListener;
|
import org.flowable.engine.delegate.ExecutionListener;
|
||||||
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -14,6 +15,7 @@ import java.util.stream.Collectors;
|
|||||||
/**
|
/**
|
||||||
* 【线上监听器】为“学院违纪处理委员会”多实例任务准备数据并发送通知 知无涯
|
* 【线上监听器】为“学院违纪处理委员会”多实例任务准备数据并发送通知 知无涯
|
||||||
*/
|
*/
|
||||||
|
@MapperScan("com.srs.flowable.mapper")
|
||||||
@Component("xywjclwyhListener")
|
@Component("xywjclwyhListener")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class XYWJCLWYHListener implements ExecutionListener {
|
public class XYWJCLWYHListener implements ExecutionListener {
|
||||||
|
@@ -265,7 +265,7 @@ public class RtStuDisciplinaryApplicationServiceImpl extends ServiceImpl<RtStuDi
|
|||||||
|
|
||||||
// todo 企业微信推送消息
|
// todo 企业微信推送消息
|
||||||
|
|
||||||
AjaxResult ajaxResult = flowDefinitionService.startProcessInstanceById("flow_n27gxm4k:16:672598", variables);
|
AjaxResult ajaxResult = flowDefinitionService.startProcessInstanceById("flow_n27gxm4k:20:710023", variables);
|
||||||
String code = ajaxResult.get("code").toString();
|
String code = ajaxResult.get("code").toString();
|
||||||
if (code.equals("200")) {
|
if (code.equals("200")) {
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user