持久层
# 数据库表设计
CREATE TABLE `message_template`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '标题',
`audit_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '当前消息审核状态: 10.待审核 20.审核成功 30.被拒绝',
`flow_id` varchar(50) COLLATE utf8mb4_unicode_ci COMMENT '工单ID',
`msg_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '当前消息状态:10.新建 20.停用 30.启用 40.等待发送 50.发送中 60.发送成功 70.发送失败',
`cron_task_id` bigint(20) COMMENT '定时任务Id (xxl-job-admin返回)',
`cron_crowd_path` varchar(500) COMMENT '定时发送人群的文件路径',
`expect_push_time` varchar(100) COLLATE utf8mb4_unicode_ci COMMENT '期望发送时间:0:立即发送 定时任务以及周期任务:cron表达式',
`id_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '消息的发送ID类型:10. userId 20.did 30.手机号 40.openId 50.email 60.企业微信userId',
`send_channel` int(10) NOT NULL DEFAULT '0' COMMENT '消息发送渠道:10.IM 20.Push 30.短信 40.Email 50.公众号 60.小程序 70.企业微信 80.钉钉机器人 90.钉钉工作通知 100.企业微信机器人 110.飞书机器人 110. 飞书应用消息 ',
`template_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '10.运营类 20.技术类接口调用',
`msg_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '10.通知类消息 20.营销类消息 30.验证码类消息',
`shield_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '10.夜间不屏蔽 20.夜间屏蔽 30.夜间屏蔽(次日早上9点发送)',
`msg_content` varchar(4096) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '消息内容 占位符用{$var}表示',
`send_account` int(10) NOT NULL DEFAULT '0' COMMENT '发送账号 一个渠道下可存在多个账号',
`creator` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者',
`updator` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新者',
`auditor` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '审核人',
`team` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '业务方团队',
`proposer` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '业务方',
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除:0.不删除 1.删除',
`created` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_channel` (`send_channel`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='消息模板信息';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# MessageTemplate
public class MessageTemplate implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//......
/**
* 发送渠道
*/
private Integer sendChannel;
/**
* 模板类型
*/
private Integer templateType;
/**
* 屏蔽类型
*/
private Integer shieldType;
/**
* 消息类型,营销类型,通知类型
*/
private Integer msgType;
/**
* 推送消息的时间
* 0:立即发送
* else:crontab 表达式
*/
private String expectPushTime;
/**
* 消息内容 {$var} 为占位符
*/
private String msgContent;
/**
* 发送账号(邮件下可有多个发送账号、短信可有多个发送账号..)
*/
private Integer sendAccount;
//......
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# TaskInfo
public class TaskInfo implements Serializable, ProcessModel {
/**
* 业务消息发送Id, 用于链路追踪, 若不存在, 则使用 messageId
*/
private String bizId;
/**
* 消息唯一Id(数据追踪使用)
* 生成逻辑参考 TaskInfoUtils
*/
private String messageId;
/**
* 消息模板Id
*/
private Long messageTemplateId;
/**
* 业务Id(数据追踪使用)
* 生成逻辑参考 TaskInfoUtils
*/
private Long businessId;
/**
* 接收者
*/
private Set<String> receiver;
/**
* 发送的Id类型
*/
private Integer idType;
/**
* 发送渠道
*/
private Integer sendChannel;
/**
* 模板类型
*/
private Integer templateType;
/**
* 消息类型
*/
private Integer msgType;
/**
* 屏蔽类型
*/
private Integer shieldType;
/**
* 发送文案模型
* message_template表存储的content是JSON(所有内容都会塞进去)
* 不同的渠道要发送的内容不一样(比如发push会有img,而短信没有)
* 所以会有ContentModel
*/
private ContentModel contentModel;
/**
* 发送账号(邮件下可有多个发送账号、短信可有多个发送账号..)
*/
private Integer sendAccount;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# BusinessId
/**
* 生成BusinessId
* 模板类型+模板ID+当天日期
* (固定16位)
*/
public static Long generateBusinessId(Long templateId, Integer templateType) {
Integer today = Integer.valueOf(DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN));
return Long.valueOf(String.format("%d%s", templateType * TYPE_FLAG + templateId, today));
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
从businessId切割出日期;
public static Long getDateFromBusinessId(Long businessId) { return Long.valueOf(String.valueOf(businessId).substring(8)); }
1
2
3切割出模板ID:
public static Long getMessageTemplateIdFromBusinessId(Long businessId) { return Long.valueOf(String.valueOf(businessId).substring(1, 8)); }
1
2
3
# MessageId
public static String generateMessageId() {
return IdUtil.nanoId();
}
1
2
3
2
3