feat(databus): 完成阶段四-DataBus Server完整功能

- 补充缺失的 API 类(DatabusMessage、DatabusBatchMessage、DatabusEventType)
- 新增变更消息消费者(3个:部门、用户、岗位)
- 新增数据提供者(3个:部门、用户、岗位)
- 确认分发器服务(核心定向推送逻辑)
- 确认全量同步与消息推送组件
- 确认管理后台 API(5个 Controller)
- 确认 Service ��(4个核心服务)
- 确认 DAL 层(7个 DO + Mapper)
- 添加 databus-server starter 依赖到 pom.xml
- 编译验证通过

Ref: docs/databus/implementation-checklist.md 任务 39-70
This commit is contained in:
hewencai
2025-12-01 23:44:32 +08:00
parent f5ba493f95
commit db13036cea
109 changed files with 7673 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
package com.zt.plat.module.databus.api.message;
import com.zt.plat.module.databus.enums.DatabusEventType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* Databus 全量同步批量消息
* <p>
* 用于全量同步场景,支持分批传输
*
* @author ZT
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DatabusBatchMessage<T> implements Serializable {
/**
* 消息ID用于幂等
*/
private String messageId;
/**
* 全量同步任务ID
*/
private String taskId;
/**
* 事件类型
*/
private DatabusEventType eventType;
/**
* 当前批次号从1开始
*/
private Integer batchNo;
/**
* 总批次数
*/
private Integer totalBatch;
/**
* 当前批次数据条数
*/
private Integer count;
/**
* 总数据条数
*/
private Integer totalCount;
/**
* 是否最后一批
*/
private Boolean isLastBatch;
/**
* 数据列<E68DAE><E58897>
*/
private List<T> dataList;
/**
* 消息产生时间
*/
private LocalDateTime timestamp;
/**
* 来源系统
*/
private String source;
/**
* 租户ID
*/
private Long tenantId;
/**
* 创建批量消息
*/
public static <T> DatabusBatchMessage<T> of(DatabusEventType eventType, String taskId,
int batchNo, int totalBatch,
List<T> dataList, int totalCount) {
DatabusBatchMessage<T> msg = new DatabusBatchMessage<>();
msg.setMessageId(java.util.UUID.randomUUID().toString());
msg.setTaskId(taskId);
msg.setEventType(eventType);
msg.setBatchNo(batchNo);
msg.setTotalBatch(totalBatch);
msg.setCount(dataList != null ? dataList.size() : 0);
msg.setTotalCount(totalCount);
msg.setIsLastBatch(batchNo >= totalBatch);
msg.setDataList(dataList);
msg.setTimestamp(LocalDateTime.now());
return msg;
}
}

View File

@@ -0,0 +1,73 @@
package com.zt.plat.module.databus.api.message;
import com.zt.plat.module.databus.enums.DatabusEventType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* Databus 增量同步消息
* <p>
* 业务推送、服务端消费、服务端转发、客户端消费统一使用此消息体
*
* @author ZT
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DatabusMessage<T> implements Serializable {
/**
* 消息ID用于幂等
*/
private String messageId;
/**
* 事件类型
*/
private DatabusEventType eventType;
/**
* 业务数据ID
*/
private Long dataId;
/**
* 业务数据(强类型)
*/
private T data;
/**
* 消息产生时间
*/
private LocalDateTime timestamp;
/**
* 来源系统
*/
private String source;
/**
* 租户ID
*/
private Long tenantId;
/**
* 创建简单消息
*/
public static <T> DatabusMessage<T> of(DatabusEventType eventType, Long dataId, T data) {
DatabusMessage<T> msg = new DatabusMessage<>();
msg.setMessageId(java.util.UUID.randomUUID().toString());
msg.setEventType(eventType);
msg.setDataId(dataId);
msg.setData(data);
msg.setTimestamp(LocalDateTime.now());
return msg;
}
}

View File

@@ -0,0 +1,306 @@
package com.zt.plat.module.databus.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* Databus 事件类型枚举
* <p>
* 三级结构: 模块_数据类型_操作
* <p>
* Topic 命名规则:
* - 业务推送到服务端: {topicBase}-{module}-{entity}-{action}
* - 服务端转发到客户端: {topicBase}-{module}-{entity}-{action}-{clientCode}
*
* @author ZT
*/
@Getter
@AllArgsConstructor
public enum DatabusEventType {
// ==================== SYSTEM 系统模块 ====================
/**
* 用户-创建
*/
SYSTEM_USER_CREATE("system", "user", "create", "用户创建"),
/**
* 用户-更新
*/
SYSTEM_USER_UPDATE("system", "user", "update", "用户更新"),
/**
* 用户-删除
*/
SYSTEM_USER_DELETE("system", "user", "delete", "用户删除"),
/**
* 用户-全量同步
*/
SYSTEM_USER_FULL("system", "user", "full", "用户全量同步"),
/**
* 部门-创建
*/
SYSTEM_DEPT_CREATE("system", "dept", "create", "部门创建"),
/**
* 部门-更新
*/
SYSTEM_DEPT_UPDATE("system", "dept", "update", "部门更新"),
/**
* 部门-删除
*/
SYSTEM_DEPT_DELETE("system", "dept", "delete", "部门删除"),
/**
* 部门-全量同步
*/
SYSTEM_DEPT_FULL("system", "dept", "full", "部门全量同步"),
/**
* 组织机构-创建(兼容老代码,保留但不推荐使用)
*/
@Deprecated
SYSTEM_ORG_CREATE("system", "org", "create", "组织机构创建"),
/**
* 组织机构-更新(兼容老代码,保留但不推荐使用)
*/
@Deprecated
SYSTEM_ORG_UPDATE("system", "org", "update", "组织机构更新"),
/**
* 组织机构-删除(兼容老代码,保留但不推荐使用)
*/
@Deprecated
SYSTEM_ORG_DELETE("system", "org", "delete", "组织机构删除"),
/**
* 组织机构-全量同步(兼容老代码,保留但不推荐使用)
*/
@Deprecated
SYSTEM_ORG_FULL("system", "org", "full", "组织机构全量同步"),
/**
* 岗位-创建
*/
SYSTEM_POST_CREATE("system", "post", "create", "岗位创建"),
/**
* 岗位-更新
*/
SYSTEM_POST_UPDATE("system", "post", "update", "岗位更新"),
/**
* 岗位-删除
*/
SYSTEM_POST_DELETE("system", "post", "delete", "岗位删除"),
/**
* 岗位-全量同步
*/
SYSTEM_POST_FULL("system", "post", "full", "岗位全量同步"),
/**
* 角色-创建
*/
SYSTEM_ROLE_CREATE("system", "role", "create", "角色创建"),
/**
* 角色-更新
*/
SYSTEM_ROLE_UPDATE("system", "role", "update", "角色更新"),
/**
* 角色-删除
*/
SYSTEM_ROLE_DELETE("system", "role", "delete", "角色删除"),
/**
* 角色-全量同步
*/
SYSTEM_ROLE_FULL("system", "role", "full", "角色全量同步"),
/**
* 字典-创建
*/
SYSTEM_DICT_CREATE("system", "dict", "create", "字典创建"),
/**
* 字典-更新
*/
SYSTEM_DICT_UPDATE("system", "dict", "update", "字典更新"),
/**
* 字典-删除
*/
SYSTEM_DICT_DELETE("system", "dict", "delete", "字典删除"),
/**
* 字典-全量同步
*/
SYSTEM_DICT_FULL("system", "dict", "full", "字典全量同步"),
// ==================== BASE 基础模块 ====================
/**
* 物料-创建
*/
BASE_MATERIAL_CREATE("base", "material", "create", "物料创建"),
/**
* 物料-更新
*/
BASE_MATERIAL_UPDATE("base", "material", "update", "物料更新"),
/**
* 物料-删除
*/
BASE_MATERIAL_DELETE("base", "material", "delete", "物料删除"),
/**
* 物料-全量同步
*/
BASE_MATERIAL_FULL("base", "material", "full", "物料全量同步"),
/**
* 供应<E4BE9B><E5BA94>-创建
*/
BASE_SUPPLIER_CREATE("base", "supplier", "create", "供应商创建"),
/**
* 供应商-更新
*/
BASE_SUPPLIER_UPDATE("base", "supplier", "update", "供应商更新"),
/**
* 供应商-删除
*/
BASE_SUPPLIER_DELETE("base", "supplier", "delete", "供应商删除"),
/**
* 供应商-全量同步
*/
BASE_SUPPLIER_FULL("base", "supplier", "full", "供应商全量同步"),
/**
* 客户-创建
*/
BASE_CUSTOMER_CREATE("base", "customer", "create", "客户创建"),
/**
* 客户-更新
*/
BASE_CUSTOMER_UPDATE("base", "customer", "update", "客户更新"),
/**
* 客户-删除
*/
BASE_CUSTOMER_DELETE("base", "customer", "delete", "客户删除"),
/**
* 客户-全量同步
*/
BASE_CUSTOMER_FULL("base", "customer", "full", "客户全量同步"),
;
/**
* 模块编码
*/
private final String module;
/**
* 实体编码
*/
private final String entity;
/**
* 操作编码
*/
private final String action;
/**
* 事件名称
*/
private final String name;
/**
* 获取Topic后缀不含topicBase和clientCode
* 格式: {module}-{entity}-{action}
*/
public String getTopicSuffix() {
return String.format("%s-%s-%s", module, entity, action);
}
/**
* 获取完整Topic名称服务端转发用
* 格式: {topicBase}-{module}-{entity}-{action}-{clientCode}
*/
public String getTopic(String topicBase, String clientCode) {
return String.format("%s-%s-%s-%s-%s", topicBase, module, entity, action, clientCode);
}
/**
* 获取完整Topic名称业务推送用不带clientCode
* 格式: {topicBase}-{module}-{entity}-{action}
*/
public String getTopic(String topicBase) {
return String.format("%s-%s-%s-%s", topicBase, module, entity, action);
}
/**
* 根据Topic后缀获取枚举
*
* @param topicSuffix Topic后缀格式: module-entity-action
* @return 枚举值未找到返回null
*/
public static DatabusEventType getByTopicSuffix(String topicSuffix) {
if (topicSuffix == null) {
return null;
}
for (DatabusEventType type : values()) {
if (type.getTopicSuffix().equalsIgnoreCase(topicSuffix)) {
return type;
}
}
return null;
}
/**
* 根据模块、实体、操作获取枚举
*
* @param module 模块编码
* @param entity 实体编码
* @param action 操作编码
* @return 枚举值未找到返回null
*/
public static DatabusEventType getByModuleEntityAction(String module, String entity, String action) {
for (DatabusEventType type : values()) {
if (type.getModule().equalsIgnoreCase(module)
&& type.getEntity().equalsIgnoreCase(entity)
&& type.getAction().equalsIgnoreCase(action)) {
return type;
}
}
return null;
}
/**
* 判断是否为全量同步事件
*/
public boolean isFullSync() {
return "full".equalsIgnoreCase(this.action);
}
/**
* 判断是否为增量同步事件
*/
public boolean isIncrementalSync() {
return !isFullSync();
}
}