飞龙工作流FlowLong:企业微信连接
概述
在企业数字化转型浪潮中,工作流引擎与即时通讯工具的深度集成已成为提升审批效率的关键。飞龙工作流FlowLong作为国产无代码工作流引擎,提供了完善的企业微信连接解决方案,让审批流程与即时通讯无缝衔接,实现真正的移动办公体验。
企业微信连接架构设计
FlowLong采用事件驱动架构实现企业微信集成,核心设计如下:
核心组件说明
| 组件名称 | 功能描述 | 技术实现 |
|---|---|---|
| TaskListener | 任务事件监听接口 | Java接口,监听任务创建、完成等事件 |
| EventTaskListener | Spring事件监听器 | 将工作流事件转换为Spring事件 |
| TaskEvent | 任务事件对象 | 包含任务信息、处理人、事件类型等 |
| WeChatEnterpriseHandler | 企业微信处理器 | 调用企业微信API发送消息 |
集成配置步骤
1. 添加依赖配置
在Spring Boot项目中添加FlowLong和企业微信SDK依赖:
<dependencies>
<!-- FlowLong Spring Boot Starter -->
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>flowlong-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- 企业微信Java SDK -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-cp</artifactId>
<version>4.5.0</version>
</dependency>
</dependencies>
2. 配置文件设置
# application.yml
flowlong:
enabled: true
db-type: mysql
# 企业微信配置
wechat:
cp:
corpId: 企业ID
corpSecret: 应用密钥
agentId: 应用ID
token: 回调Token
aesKey: 消息加密Key
3. 企业微信事件处理器实现
@Component
public class WeChatEnterpriseHandler {
@Autowired
private WxCpService wxCpService;
@EventListener
public void handleTaskEvent(TaskEvent event) {
switch (event.getEventType()) {
case CREATE:
sendTaskCreateMessage(event);
break;
case COMPLETE:
sendTaskCompleteMessage(event);
break;
case REMIND:
sendTaskRemindMessage(event);
break;
default:
// 其他事件处理
}
}
private void sendTaskCreateMessage(TaskEvent event) {
FlwTask task = event.getFlwTask();
List<FlwTaskActor> actors = event.getTaskActors();
for (FlwTaskActor actor : actors) {
String userId = getUserWeChatId(actor.getActorId());
if (userId != null) {
WxCpMessage message = WxCpMessage.TEXTCARD()
.agentId(agentId)
.toUser(userId)
.title("新的审批任务")
.description("您有一个新的审批任务需要处理")
.url("https://your-domain.com/task/" + task.getId())
.btntxt("立即处理")
.build();
wxCpService.getMessageService().send(message);
}
}
}
private String getUserWeChatId(String userId) {
// 实现用户ID到企业微信用户ID的映射
return userMappingService.getWeChatUserId(userId);
}
}
消息模板设计
审批任务通知模板
{
"msgtype": "textcard",
"textcard": {
"title": "审批任务通知",
"description": "流程名称:${processName}\n任务节点:${nodeName}\n发起人:${creator}\n发起时间:${createTime}",
"url": "${taskUrl}",
"btntxt": "立即审批"
}
}
审批结果通知模板
{
"msgtype": "markdown",
"markdown": {
"content": "### 审批结果通知\n> 流程名称:${processName}\n> 审批节点:${nodeName}\n> 审批人:${approver}\n> 审批结果:**${result}**\n> 审批时间:${approveTime}\n> 审批意见:${comment}"
}
}
回调接口实现
企业微信审批操作回调
@RestController
@RequestMapping("/wechat/callback")
public class WeChatCallbackController {
@PostMapping("/approval")
public String handleApprovalCallback(@RequestBody String requestBody,
@RequestParam("msg_signature") String signature,
@RequestParam("timestamp") String timestamp,
@RequestParam("nonce") String nonce) {
try {
// 解密消息
WxCpXmlMessage message = WxCpXmlMessage.fromEncryptedXml(
requestBody, wxCpService.getWxCpConfigStorage(),
timestamp, nonce, signature);
if ("event".equals(message.getMsgType())) {
handleEventMessage(message);
}
return "success";
} catch (Exception e) {
return "error";
}
}
private void handleEventMessage(WxCpXmlMessage message) {
if ("click".equals(message.getEvent())) {
String eventKey = message.getEventKey();
if ("approve_task".equals(eventKey)) {
handleApproveAction(message);
} else if ("reject_task".equals(eventKey)) {
handleRejectAction(message);
}
}
}
private void handleApproveAction(WxCpXmlMessage message) {
String taskId = extractTaskIdFromEventKey(message.getEventKey());
String approverId = message.getFromUserName();
// 调用FlowLong API完成审批
runtimeService.completeTask(taskId, approverId, "同意", null);
}
}
高级功能实现
1. 批量任务处理
@Component
public class BatchWeChatService {
@Scheduled(cron = "0 0 9 * * ?") // 每天9点发送
public void sendDailyTaskReminder() {
List<FlwTask> pendingTasks = queryService.findPendingTasks();
Map<String, List<FlwTask>> userTasks = pendingTasks.stream()
.collect(Collectors.groupingBy(task ->
userService.getWeChatUserId(task.getCurrentHandler())));
userTasks.forEach((wechatUserId, tasks) -> {
if (!tasks.isEmpty()) {
sendBatchReminder(wechatUserId, tasks);
}
});
}
private void sendBatchReminder(String wechatUserId, List<FlwTask> tasks) {
String content = buildBatchReminderContent(tasks);
WxCpMessage message = WxCpMessage.TEXT()
.agentId(agentId)
.toUser(wechatUserId)
.content(content)
.build();
wxCpService.getMessageService().send(message);
}
}
2. 审批状态同步
public class WeChatStatusSyncService {
public void syncApprovalStatus(String processInstanceId) {
ProcessInstance instance = queryService.getProcessInstance(processInstanceId);
List<FlwTask> tasks = queryService.findTasksByInstanceId(processInstanceId);
String statusSummary = buildStatusSummary(instance, tasks);
// 发送给流程发起人
String creatorWeChatId = userService.getWeChatUserId(instance.getCreator());
sendStatusUpdate(creatorWeChatId, statusSummary);
// 发送给相关审批人
Set<String> involvedUsers = getInvolvedUsers(tasks);
involvedUsers.forEach(userId -> {
String wechatId = userService.getWeChatUserId(userId);
sendStatusUpdate(wechatId, statusSummary);
});
}
}
性能优化策略
1. 消息队列异步处理
@Configuration
public class WeChatAsyncConfig {
@Bean
public TaskExecutor wechatTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("wechat-async-");
return executor;
}
@Async("wechatTaskExecutor")
public void asyncSendWeChatMessage(WxCpMessage message) {
wxCpService.getMessageService().send(message);
}
}
2. 消息发送频率控制
@Component
public class RateLimitService {
private final RateLimiter rateLimiter = RateLimiter.create(10.0); // 10条/秒
public boolean trySendMessage(WxCpMessage message) {
if (rateLimiter.tryAcquire()) {
wxCpService.getMessageService().send(message);
return true;
} else {
// 进入队列等待
messageQueue.offer(message);
return false;
}
}
}
安全考虑
1. 数据加密传输
public class SecurityService {
public String encryptSensitiveData(String data) {
try {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, aesKey, new GCMParameterSpec(128, iv));
byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception e) {
throw new RuntimeException("加密失败", e);
}
}
}
2. 访问权限控制
@Aspect
@Component
public class PermissionAspect {
@Around("@annotation(RequireWeChatPermission)")
public Object checkPermission(ProceedingJoinPoint joinPoint) throws Throwable {
String userId = SecurityContextHolder.getContext().getAuthentication().getName();
String methodName = joinPoint.getSignature().getName();
if (!weChatPermissionService.hasPermission(userId, methodName)) {
throw new AccessDeniedException("无权限访问");
}
return joinPoint.proceed();
}
}
监控与日志
1. 消息发送监控
@Slf4j
@Component
public class WeChatMonitor {
public void monitorMessageDelivery(WxCpMessage message, String result) {
log.info("企业微信消息发送监控 - 消息ID: {}, 接收人: {}, 结果: {}",
message.getMsgId(), message.getToUser(), result);
// 记录到数据库用于统计分析
messageLogService.logMessageDelivery(
message.getMsgId(),
message.getToUser(),
message.getMsgType(),
result
);
}
}
2. 性能指标收集
public class MetricsCollector {
private final MeterRegistry meterRegistry;
public void recordMessageLatency(long latencyMs, boolean success) {
meterRegistry.timer("wechat.message.latency")
.record(latencyMs, TimeUnit.MILLISECONDS);
meterRegistry.counter("wechat.message.total")
.increment();
if (!success) {
meterRegistry.counter("wechat.message.failed")
.increment();
}
}
}
总结
飞龙工作流FlowLong与企业微信的深度集成,为企业提供了完整的移动审批解决方案。通过事件驱动架构、异步处理机制、安全控制和性能优化,确保了系统的高可用性和稳定性。这种集成不仅提升了审批效率,还为企业的数字化转型提供了强有力的技术支持。
关键优势:
- 实时消息推送:审批任务即时到达企业微信
- 移动审批支持:随时随地处理审批任务
- 状态同步机制:审批进度实时更新
- 安全可靠:多重安全措施保障数据安全
- 高性能处理:支持高并发消息发送
通过FlowLong与企业微信的完美结合,企业可以构建高效、安全、便捷的移动办公环境,全面提升业务流程管理效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



