From 1dae784118ec5279bbf98b7542a35684c94fce9f Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Thu, 16 Dec 2021 18:00:20 +0800 Subject: [PATCH] =?UTF-8?q?[manager]=20=E6=B6=88=E6=81=AF=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E9=85=8D=E7=BD=AEAPI-=E6=B6=88=E6=81=AF=E6=8E=A5?= =?UTF-8?q?=E6=94=B6=E4=BA=BA=E7=AE=A1=E7=90=86=EF=BC=8C=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E7=AD=96=E7=95=A5=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/alerter/DispatchAlarm.java | 2 + .../controller/NoticeConfigController.java | 127 ++++++++++++++++++ .../usthe/manager/dao/NoticeReceiverDao.java | 14 ++ .../com/usthe/manager/dao/NoticeRuleDao.java | 14 ++ .../manager/pojo/entity/NoticeReceiver.java | 85 ++++++++++++ .../usthe/manager/pojo/entity/NoticeRule.java | 77 +++++++++++ .../manager/service/NoticeConfigService.java | 65 +++++++++ .../service/NoticeDispatchService.java | 10 ++ .../service/impl/NoticeConfigServiceImpl.java | 71 ++++++++++ manager/src/main/resources/db/schema.sql | 39 ++++++ 10 files changed, 504 insertions(+) create mode 100644 manager/src/main/java/com/usthe/manager/controller/NoticeConfigController.java create mode 100644 manager/src/main/java/com/usthe/manager/dao/NoticeReceiverDao.java create mode 100644 manager/src/main/java/com/usthe/manager/dao/NoticeRuleDao.java create mode 100644 manager/src/main/java/com/usthe/manager/pojo/entity/NoticeReceiver.java create mode 100644 manager/src/main/java/com/usthe/manager/pojo/entity/NoticeRule.java create mode 100644 manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java create mode 100644 manager/src/main/java/com/usthe/manager/service/NoticeDispatchService.java create mode 100644 manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java diff --git a/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java b/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java index c57db47..764c9e9 100644 --- a/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java +++ b/manager/src/main/java/com/usthe/manager/component/alerter/DispatchAlarm.java @@ -86,6 +86,8 @@ public class DispatchAlarm { private void sendAlertDataListener(Alert alert) { // todo 转发配置的邮件 微信 webhook + + } diff --git a/manager/src/main/java/com/usthe/manager/controller/NoticeConfigController.java b/manager/src/main/java/com/usthe/manager/controller/NoticeConfigController.java new file mode 100644 index 0000000..fe676b0 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/controller/NoticeConfigController.java @@ -0,0 +1,127 @@ +package com.usthe.manager.controller; + +import com.usthe.common.entity.dto.Message; +import com.usthe.manager.pojo.entity.NoticeReceiver; +import com.usthe.manager.pojo.entity.NoticeRule; +import com.usthe.manager.service.NoticeConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.persistence.criteria.Predicate; +import javax.validation.Valid; + +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * 消息通知配置API + * @author tom + * @date 2021/12/16 16:18 + */ +@Api(tags = "消息通知配置API") +@RestController() +@RequestMapping(value = "/notice", produces = {APPLICATION_JSON_VALUE}) +public class NoticeConfigController { + + @Autowired + private NoticeConfigService noticeConfigService; + + @PostMapping(path = "/receiver") + @ApiOperation(value = "新增接收人", notes = "新增一个接收人") + public ResponseEntity> addNewNoticeReceiver(@Valid @RequestBody NoticeReceiver noticeReceiver) { + noticeConfigService.addReceiver(noticeReceiver); + return ResponseEntity.ok(new Message<>("Add success")); + } + + @PutMapping(path = "/receiver") + @ApiOperation(value = "修改接收人", notes = "修改已存在的接收人信息") + public ResponseEntity> editNoticeReceiver(@Valid @RequestBody NoticeReceiver noticeReceiver) { + noticeConfigService.editReceiver(noticeReceiver); + return ResponseEntity.ok(new Message<>("Edit success")); + } + + @DeleteMapping(path = "/receiver/{id}") + @ApiOperation(value = "删除指定接收人", notes = "删除已存在的接收人信息") + public ResponseEntity> deleteNoticeReceiver( + @ApiParam(value = "接收人ID", example = "6565463543") @PathVariable("id") Long receiverId) { + // 不存在或删除成功都返回成功 + noticeConfigService.deleteReceiver(receiverId); + return ResponseEntity.ok(new Message<>("Delete success")); + } + + @GetMapping(path = "/receivers") + @ApiOperation(value = "查询消息通知接收人", notes = "根据查询过滤项获取消息通知接收人列表") + public ResponseEntity>> getReceivers( + @ApiParam(value = "接收人名称,模糊查询", example = "tom") @RequestParam(required = false) String name) { + + Specification specification = (root, query, criteriaBuilder) -> { + Predicate predicate = criteriaBuilder.conjunction(); + if (name != null && !"".equals(name)) { + Predicate predicateName = criteriaBuilder.like(root.get("name"), "%" + name + "%"); + predicate = criteriaBuilder.and(predicateName); + } + return predicate; + }; + List receivers = noticeConfigService.getNoticeReceivers(specification); + Message> message = new Message<>(receivers); + return ResponseEntity.ok(message); + } + + + @PostMapping(path = "/rule") + @ApiOperation(value = "新增通知策略", notes = "新增一个通知策略") + public ResponseEntity> addNewNoticeRule(@Valid @RequestBody NoticeRule noticeRule) { + noticeConfigService.addNoticeRule(noticeRule); + return ResponseEntity.ok(new Message<>("Add success")); + } + + @PutMapping(path = "/rule") + @ApiOperation(value = "修改通知策略", notes = "修改已存在的通知策略信息") + public ResponseEntity> editNoticeRule(@Valid @RequestBody NoticeRule noticeRule) { + noticeConfigService.editNoticeRule(noticeRule); + return ResponseEntity.ok(new Message<>("Edit success")); + } + + @DeleteMapping(path = "/rule/{id}") + @ApiOperation(value = "删除指定通知策略", notes = "删除已存在的通知策略信息") + public ResponseEntity> deleteNoticeRule( + @ApiParam(value = "通知策略ID", example = "6565463543") @PathVariable("id") Long ruleId) { + // 不存在或删除成功都返回成功 + noticeConfigService.deleteNoticeRule(ruleId); + return ResponseEntity.ok(new Message<>("Delete success")); + } + + @GetMapping(path = "/rules") + @ApiOperation(value = "查询消息通知策略", notes = "根据查询过滤项获取消息通知策略列表") + public ResponseEntity>> getRules( + @ApiParam(value = "接收人名称,模糊查询", example = "rule1") @RequestParam(required = false) String name) { + + Specification specification = (root, query, criteriaBuilder) -> { + Predicate predicate = criteriaBuilder.conjunction(); + if (name != null && !"".equals(name)) { + Predicate predicateName = criteriaBuilder.like(root.get("name"), "%" + name + "%"); + predicate = criteriaBuilder.and(predicateName); + } + return predicate; + }; + + List receiverPage = noticeConfigService.getNoticeRules(specification); + Message> message = new Message<>(receiverPage); + return ResponseEntity.ok(message); + } + +} diff --git a/manager/src/main/java/com/usthe/manager/dao/NoticeReceiverDao.java b/manager/src/main/java/com/usthe/manager/dao/NoticeReceiverDao.java new file mode 100644 index 0000000..f918992 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/dao/NoticeReceiverDao.java @@ -0,0 +1,14 @@ +package com.usthe.manager.dao; + +import com.usthe.manager.pojo.entity.NoticeReceiver; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + * NoticeReceiver数据库操作 + * @author tom + * @date 2021/12/16 16:12 + */ +public interface NoticeReceiverDao extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/manager/src/main/java/com/usthe/manager/dao/NoticeRuleDao.java b/manager/src/main/java/com/usthe/manager/dao/NoticeRuleDao.java new file mode 100644 index 0000000..b1d5be3 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/dao/NoticeRuleDao.java @@ -0,0 +1,14 @@ +package com.usthe.manager.dao; + +import com.usthe.manager.pojo.entity.NoticeRule; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + * NoticeRule数据库操作 + * @author tom + * @date 2021/12/16 16:13 + */ +public interface NoticeRuleDao extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/manager/src/main/java/com/usthe/manager/pojo/entity/NoticeReceiver.java b/manager/src/main/java/com/usthe/manager/pojo/entity/NoticeReceiver.java new file mode 100644 index 0000000..0dfdc83 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/pojo/entity/NoticeReceiver.java @@ -0,0 +1,85 @@ +package com.usthe.manager.pojo.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY; +import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE; + +/** + * 消息通知接收人实体 + * @author tomsun28 + * @date 2021/11/13 22:19 + */ +@Entity +@Table(name = "notice_receiver") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "消息通知接收人实体") +public class NoticeReceiver { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @ApiModelProperty(value = "接收人实体主键索引ID", example = "87584674384", accessMode = READ_ONLY, position = 0) + private Long id; + + @ApiModelProperty(value = "接收人名称", example = "tom", accessMode = READ_WRITE, position = 1) + @Length(max = 100) + @NotNull + private String name; + + @ApiModelProperty(value = "通知信息方式: 0-手机短信 1-邮箱 2-webhook 3-微信公众号", accessMode = READ_WRITE, position = 2) + @Min(0) + @Max(3) + @NotNull + private Byte type; + + @ApiModelProperty(value = "手机号, 通知方式为手机短信时有效", example = "18923435643", accessMode = READ_WRITE, position = 3) + @Length(max = 100) + private String phone; + + @ApiModelProperty(value = "邮箱账号, 通知方式为邮箱时有效", example = "tom@qq.com", accessMode = READ_WRITE, position = 4) + @Length(max = 100) + private String email; + + @ApiModelProperty(value = "URL地址, 通知方式为webhook有效", example = "https://www.tancloud.cn", accessMode = READ_WRITE, position = 5) + @Length(max = 100) + private String hookUrl; + + @ApiModelProperty(value = "wechat用户openId, 通知方式为微信公众号有效", example = "343432", accessMode = READ_WRITE, position = 6) + @Length(max = 100) + private String wechatId; + + @ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 7) + private String creator; + + @ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 8) + private String modifier; + + @ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 9) + @Column(insertable = false, updatable = false) + private LocalDateTime gmtCreate; + + @ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 10) + @Column(insertable = false, updatable = false) + private LocalDateTime gmtUpdate; + +} diff --git a/manager/src/main/java/com/usthe/manager/pojo/entity/NoticeRule.java b/manager/src/main/java/com/usthe/manager/pojo/entity/NoticeRule.java new file mode 100644 index 0000000..a6a64d8 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/pojo/entity/NoticeRule.java @@ -0,0 +1,77 @@ +package com.usthe.manager.pojo.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY; +import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE; + +/** + * 通知策略 + * @author tomsun28 + * @date 2021/11/13 22:19 + */ +@Entity +@Table(name = "notice_rule") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "通知策略实体") +public class NoticeRule { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @ApiModelProperty(value = "通知策略实体主键索引ID", example = "87584674384", accessMode = READ_ONLY, position = 0) + private Long id; + + @ApiModelProperty(value = "策略名称", example = "dispatch-1", accessMode = READ_WRITE, position = 1) + @Length(max = 100) + @NotNull + private Long name; + + @ApiModelProperty(value = "接收人ID", example = "4324324", accessMode = READ_WRITE, position = 2) + @Length(max = 100) + @NotNull + private Long receiverId; + + @ApiModelProperty(value = "接收人标识", example = "tom", accessMode = READ_WRITE, position = 3) + @Length(max = 100) + @NotNull + private Long receiverName; + + @ApiModelProperty(value = "是否启用此策略", example = "true", accessMode = READ_WRITE, position = 4) + private boolean enable = true; + + @ApiModelProperty(value = "是否转发所有", example = "false", accessMode = READ_WRITE, position = 5) + private boolean filterAll = true; + + @ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 7) + private String creator; + + @ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 8) + private String modifier; + + @ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 9) + @Column(insertable = false, updatable = false) + private LocalDateTime gmtCreate; + + @ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 10) + @Column(insertable = false, updatable = false) + private LocalDateTime gmtUpdate; + +} diff --git a/manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java b/manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java new file mode 100644 index 0000000..838279d --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/service/NoticeConfigService.java @@ -0,0 +1,65 @@ +package com.usthe.manager.service; + +import com.usthe.manager.pojo.entity.NoticeReceiver; +import com.usthe.manager.pojo.entity.NoticeRule; +import org.springframework.data.jpa.domain.Specification; + +import java.util.List; + +/** + * 消息通知配置接口 + * @author tom + * @date 2021/12/16 16:14 + */ +public interface NoticeConfigService { + + /** + * 动态条件查询 + * @param specification 查询条件 + * @return 查询结果 + */ + List getNoticeReceivers(Specification specification); + + /** + * 动态条件查询 + * @param specification 查询条件 + * @return 查询结果 + */ + List getNoticeRules(Specification specification); + + /** + * 新增一个通知接收人 + * @param noticeReceiver 接收人信息 + */ + void addReceiver(NoticeReceiver noticeReceiver); + + /** + * 修改通知接收人 + * @param noticeReceiver 接收人信息 + */ + void editReceiver(NoticeReceiver noticeReceiver); + + /** + * 根据接收人ID删除接收人信息 + * @param receiverId 接收人ID + */ + void deleteReceiver(Long receiverId); + + /** + * 新增通知策略 + * @param noticeRule 通知策略 + */ + void addNoticeRule(NoticeRule noticeRule); + + /** + * 修改通知策略 + * @param noticeRule 通知策略 + */ + void editNoticeRule(NoticeRule noticeRule); + + /** + * 删除指定的通知策略 + * @param ruleId 通知策略ID + */ + void deleteNoticeRule(Long ruleId); +} diff --git a/manager/src/main/java/com/usthe/manager/service/NoticeDispatchService.java b/manager/src/main/java/com/usthe/manager/service/NoticeDispatchService.java new file mode 100644 index 0000000..0c73508 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/service/NoticeDispatchService.java @@ -0,0 +1,10 @@ +package com.usthe.manager.service; + +/** + * 消息通知转发接口 + * @author tom + * @date 2021/12/16 16:14 + */ +public interface NoticeDispatchService { + +} diff --git a/manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java b/manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java new file mode 100644 index 0000000..d66c0ae --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/service/impl/NoticeConfigServiceImpl.java @@ -0,0 +1,71 @@ +package com.usthe.manager.service.impl; + +import com.usthe.manager.dao.NoticeReceiverDao; +import com.usthe.manager.dao.NoticeRuleDao; +import com.usthe.manager.pojo.entity.NoticeReceiver; +import com.usthe.manager.pojo.entity.NoticeRule; +import com.usthe.manager.service.NoticeConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 消息通知配置实现 + * @author tom + * @date 2021/12/16 16:16 + */ +@Service +@Transactional(rollbackFor = Exception.class) +@Slf4j +public class NoticeConfigServiceImpl implements NoticeConfigService { + + @Autowired + private NoticeReceiverDao noticeReceiverDao; + + @Autowired + private NoticeRuleDao noticeRuleDao; + + @Override + public List getNoticeReceivers(Specification specification) { + return noticeReceiverDao.findAll(specification); + } + + @Override + public List getNoticeRules(Specification specification) { + return noticeRuleDao.findAll(specification); + } + + @Override + public void addReceiver(NoticeReceiver noticeReceiver) { + noticeReceiverDao.save(noticeReceiver); + } + + @Override + public void editReceiver(NoticeReceiver noticeReceiver) { + noticeReceiverDao.save(noticeReceiver); + } + + @Override + public void deleteReceiver(Long receiverId) { + noticeReceiverDao.deleteById(receiverId); + } + + @Override + public void addNoticeRule(NoticeRule noticeRule) { + noticeRuleDao.save(noticeRule); + } + + @Override + public void editNoticeRule(NoticeRule noticeRule) { + noticeRuleDao.save(noticeRule); + } + + @Override + public void deleteNoticeRule(Long ruleId) { + noticeRuleDao.deleteById(ruleId); + } +} diff --git a/manager/src/main/resources/db/schema.sql b/manager/src/main/resources/db/schema.sql index 10e5de5..0a596be 100644 --- a/manager/src/main/resources/db/schema.sql +++ b/manager/src/main/resources/db/schema.sql @@ -122,4 +122,43 @@ CREATE TABLE alert primary key (id) ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4; +-- ---------------------------- +-- Table structure for notice_rule +-- ---------------------------- +DROP TABLE IF EXISTS notice_rule ; +CREATE TABLE notice_rule +( + id bigint not null auto_increment comment '通知策略主键索引ID', + name varchar(100) not null comment '策略名称', + receiverId bigint not null comment '消息接收人ID', + receiverName varchar(100) not null comment '消息接收人标识', + enable boolean not null default true comment '是否启用此策略', + filter_all boolean not null default true comment '是否转发所有', + creator varchar(100) comment '创建者', + modifier varchar(100) comment '最新修改者', + gmt_create timestamp default current_timestamp comment 'create time', + gmt_update datetime default current_timestamp on update current_timestamp comment 'update time', + primary key (id) +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Table structure for notice_receiver +-- ---------------------------- +DROP TABLE IF EXISTS notice_receiver ; +CREATE TABLE notice_receiver +( + id bigint not null auto_increment comment '消息接收人ID', + name varchar(100) not null comment '消息接收人姓名', + type tinyint not null comment '通知信息方式: 0-手机短信 1-邮箱 2-webhook 3-微信公众号', + phone varchar(100) comment '手机号, 通知方式为手机短信时有效', + email varchar(100) comment '邮箱账号, 通知方式为邮箱时有效', + hook_url varchar(100) comment 'URL地址, 通知方式为webhook有效', + wechat_id varchar(100) comment 'wechat用户openId, 通知方式为微信公众号有效', + creator varchar(100) comment '创建者', + modifier varchar(100) comment '最新修改者', + gmt_create timestamp default current_timestamp comment 'create time', + gmt_update datetime default current_timestamp on update current_timestamp comment 'update time', + primary key (id) +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4; + COMMIT; \ No newline at end of file