文件:jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/../.docs/sql/建表语句/消息通知记录表.sql
-- 主表
CREATE TABLE notification_record (
ID VARCHAR(36) NOT NULL,
MODULE_TYPE VARCHAR(50) COMMENT '来源模块',
SUBJECT VARCHAR(200) NOT NULL COMMENT '消息主题',
CONTENT VARCHAR(2000) COMMENT '消息内容',
SENDER_ID VARCHAR(36) COMMENT '推送人用户ID(关联sys_user)',
SENDER VARCHAR(50) NOT NULL COMMENT '推送人姓名',
SEND_TIME TIMESTAMP NOT NULL COMMENT '推送时间',
CREATE_BY VARCHAR(50),
CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
SYS_ORG_CODE VARCHAR(50),
PRIMARY KEY (ID)
);
COMMENT ON TABLE notification_record IS '消息通知记录表';
-- 后增字段
ALTER TABLE notification_record ADD EXPIRE_TIME TIMESTAMP;
COMMENT ON COLUMN notification_record.EXPIRE_TIME IS '过期时间';
ALTER TABLE notification_record ADD STATUS VARCHAR(20) DEFAULT '0';
COMMENT ON COLUMN notification_record.STATUS IS '状态: 0未读 1已读';
-- 接收人关联表
CREATE TABLE notification_target (
NOTIFICATION_ID VARCHAR(36) NOT NULL COMMENT '消息ID',
TARGET_TYPE VARCHAR(20) NOT NULL COMMENT '类型: personal/enterprise',
TARGET_ID VARCHAR(36) NOT NULL COMMENT '目标ID'
);
COMMENT ON TABLE notification_target IS '消息接收人关联表';
CREATE INDEX idx_nt_target ON notification_target(TARGET_TYPE, TARGET_ID);
CREATE INDEX idx_nt_notify ON notification_target(NOTIFICATION_ID);
ALTER TABLE notification_target ADD STATUS VARCHAR(20) DEFAULT '0';
COMMENT ON COLUMN notification_target.STATUS IS '状态: 0未读 1已读';
文件:jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/../.docs/sql/建表语句/待办记录表.sql
-- 主表
CREATE TABLE todo_record (
ID VARCHAR(36) NOT NULL,
MODULE_TYPE VARCHAR(50) COMMENT '来源模块',
SUBJECT VARCHAR(200) NOT NULL COMMENT '待办标题',
CONTENT VARCHAR(2000) COMMENT '待办内容',
CREATOR_ID VARCHAR(36) COMMENT '发起人用户ID(关联sys_user)',
CREATOR VARCHAR(50) NOT NULL COMMENT '发起人姓名',
CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
STATUS VARCHAR(20) DEFAULT '0' NOT NULL COMMENT '状态: 0待处理 1已完成 2已取消',
COMPLETE_TIME TIMESTAMP COMMENT '完成时间',
EXPIRE_TIME TIMESTAMP COMMENT '过期时间',
TARGET_PAGE VARCHAR(500) COMMENT '目标页面路径',
DATA_ID VARCHAR(36) COMMENT '数据ID',
PATH_PARAMS VARCHAR(500) COMMENT '路径参数',
SYS_ORG_CODE VARCHAR(50),
PRIMARY KEY (ID)
);
COMMENT ON TABLE todo_record IS '待办记录表';
-- 接收人关联表
CREATE TABLE todo_target (
TODO_ID VARCHAR(36) NOT NULL COMMENT '待办ID',
TARGET_TYPE VARCHAR(20) NOT NULL COMMENT '类型: personal/enterprise',
TARGET_ID VARCHAR(36) NOT NULL COMMENT '目标ID'
);
COMMENT ON TABLE todo_target IS '待办接收人关联表';
CREATE INDEX idx_tt_target ON todo_target(TARGET_TYPE, TARGET_ID);
CREATE INDEX idx_tt_todo ON todo_target(TODO_ID);
ALTER TABLE todo_target ADD STATUS VARCHAR(20) DEFAULT '0';
COMMENT ON COLUMN todo_target.STATUS IS '状态: 0待处理 1已完成 2已取消';
@Autowired
private INotificationRecordService notificationRecordService;
NotificationRecord sendMessage(
String moduleType, // 来源模块(如 "interview", "offer")
String subject, // 消息主题
String content, // 消息内容
String senderId, // 推送人用户ID(系统发起可传空字符串)
String sender, // 推送人姓名
Date expireTime, // 过期时间(不传则传 null)
List<NotificationTarget> targets // 接收人列表
);
// 构建接收人
NotificationTarget target = new NotificationTarget();
target.setTargetType("enterprise"); // personal / enterprise
target.setTargetId(enterprise.getId());
// 计算过期时间:当前时间 + 1天
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 1);
Date expireTime = cal.getTime();
// 发送通知
notificationRecordService.sendMessage(
"interview", // moduleType
"面试反馈通知", // subject
String.format("求职者【%s】已确认参加面试【%s】",
personalName, postName), // content
"", // senderId(系统发起)
personalName, // sender
expireTime, // expireTime
Collections.singletonList(target) // targets
);
@Autowired
private ITodoRecordService todoRecordService;
TodoRecord createTodo(
String moduleType, // 来源模块(如 "offer")
String subject, // 待办标题
String content, // 待办内容
String creatorId, // 发起人用户ID(系统发起可传空字符串)
String creator, // 发起人姓名
String targetPage, // 前端路由路径
String dataId, // 关联的业务数据主键ID
String pathParams, // 路径参数
List<TodoTarget> targets // 接收人列表
);
// 构建接收人
TodoTarget target = new TodoTarget();
target.setTargetType("personal"); // personal / enterprise
target.setTargetId(personal.getId());
// 生成待办
todoRecordService.createTodo(
"offer", // moduleType
"录用通知", // subject
String.format("您已被【%s】的【%s】岗位录用,请前往查看并确认签约",
enterpriseName, postName), // content
"", // creatorId(系统发起)
enterpriseName, // creator
"pages/personal/my-jobs/index", // targetPage
offerId, // dataId
"fromTab=2", // pathParams
Collections.singletonList(target) // targets
);
两个模块都支持批量发送,targets 参数可以传入多个接收人:
List<TodoTarget> targets = Arrays.asList(
new TodoTarget().setTargetType("personal").setTargetId(id1),
new TodoTarget().setTargetType("enterprise").setTargetId(id2)
);
| 场景 | 过期时间计算 |
|---|---|
| 面试通知(求职者反馈给企业) | 面试时间 + 1天 |
| 面试结果通知(企业回传给求职者) | 面试时间 + 1天 |
| 录用待办 | 无过期(null) |
| 录用反馈通知 | 无过期(null) |
| moduleType 值 | 说明 |
|---|---|
interview |
面试相关通知/待办 |
offer |
录用相关通知/待办 |