【notice】通知管理接口

pull/3/head
liuhanqing 2021-01-09 17:35:28 +08:00
parent 1056a41826
commit 0addfa1138
14 changed files with 668 additions and 0 deletions

View File

@ -23,6 +23,7 @@
<module>system-business-user</module>
<module>system-business-role</module>
<module>system-business-menu</module>
<module>system-business-notice</module>
<module>system-spring-boot-starter</module>
</modules>

View File

@ -58,6 +58,10 @@
<artifactId>spring-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
</dependencies>

View File

@ -0,0 +1,12 @@
package cn.stylefeng.roses.kernel.system;
/**
* api
*
* @author liuhanqing
* @date 2021/1/8 21:40
*/
public interface NoticeServiceApi {
}

View File

@ -0,0 +1,65 @@
/*
Copyright [2020] [https://www.stylefeng.cn]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
GunsAPACHE LICENSE 2.0使
1.LICENSE
2.Guns
3.
4. https://gitee.com/stylefeng/guns-separation
5. https://gitee.com/stylefeng/guns-separation
6.Guns https://www.stylefeng.cn
*/
package cn.stylefeng.roses.kernel.system.exception.enums;
import cn.stylefeng.roses.kernel.rule.abstracts.AbstractExceptionEnum;
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
import cn.stylefeng.roses.kernel.system.constants.SystemConstants;
import lombok.Getter;
/**
*
*
* @author liuhanqing
* @date 2021/1/9 16:11
*/
@Getter
public enum NoticeExceptionEnum implements AbstractExceptionEnum {
/**
*
*/
NOTICE_NOT_EXIST(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + SystemConstants.SYSTEM_EXCEPTION_STEP_CODE + "91", "通知不存在"),
/**
*
*/
NOTICE_SCOPE_NOT_EDIT(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + SystemConstants.SYSTEM_EXCEPTION_STEP_CODE + "92", "通知范围不允许修改");
/**
*
*/
private final String errorCode;
/**
*
*/
private final String userTip;
NoticeExceptionEnum(String errorCode, String userTip) {
this.errorCode = errorCode;
this.userTip = userTip;
}
}

View File

@ -0,0 +1,71 @@
package cn.stylefeng.roses.kernel.system.pojo.notice;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
*
*
* @author liuhanqing
* @date 2021/1/8 21:53
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SysNoticeRequest extends BaseRequest {
/**
* id
*/
@NotNull(message = "noticeId不能为空", groups = {edit.class, delete.class, detail.class})
private Long noticeId;
/**
*
*/
@NotBlank(message = "通知标题不能为空", groups = {add.class, edit.class})
private String noticeTitle;
/**
*
*/
private String noticeSummary;
/**
*
*/
@NotBlank(message = "通知优先级不能为空", groups = {add.class, edit.class})
private String priorityLevel;
/**
*
*/
@NotNull(message = "通知开始时间不能为空", groups = {add.class, edit.class})
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date noticeBeginTime;
/**
*
*/
@NotNull(message = "通知开始时间不能为空", groups = {add.class, edit.class})
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date noticeEndTime;
/**
*
*/
private String noticeContent;
/**
*
*/
private String noticeScope;
}

View File

@ -0,0 +1 @@
通知模块

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>kernel-s-system</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>system-business-notice</artifactId>
<packaging>jar</packaging>
<dependencies>
<!--系统管理api模块-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>system-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--通知api模块-->
<!--用在通知控制器,通知扫描上-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>scanner-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--参数校验模块-->
<!--用在控制器,参数校验-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>validator-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--数据库sdk-->
<!--数据库dao框架-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>db-sdk-mp</artifactId>
<version>1.0.0</version>
</dependency>
<!--web模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>message-api</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,98 @@
package cn.stylefeng.roses.kernel.notice.modular.controller;
import cn.stylefeng.roses.kernel.notice.modular.service.SysNoticeService;
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.PostResource;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import cn.stylefeng.roses.kernel.system.pojo.notice.SysNoticeRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
*
*
* @author liuhanqing
* @date 2021/1/8 19:47
*/
@RestController
@ApiResource(name = "通知管理")
public class NoticeController {
@Autowired
private SysNoticeService sysResourceService;
/**
*
*
* @author liuhanqing
* @date 2021/1/9 14:44
*/
@PostResource(name = "添加通知管理", path = "/sysNotice/add")
public ResponseData add(@RequestBody @Validated(SysNoticeRequest.add.class) SysNoticeRequest sysNoticeParam) {
sysResourceService.add(sysNoticeParam);
return new SuccessResponseData();
}
/**
*
*
* @author liuhanqing
* @date 2021/1/9 14:54
*/
@PostResource(name = "编辑通知管理", path = "/sysNotice/edit")
public ResponseData edit(@RequestBody @Validated(SysNoticeRequest.edit.class) SysNoticeRequest sysNoticeParam) {
sysResourceService.edit(sysNoticeParam);
return new SuccessResponseData();
}
/**
*
*
* @author liuhanqing
* @date 2021/1/9 14:54
*/
@PostResource(name = "删除通知管理", path = "/sysNotice/delete")
public ResponseData delete(@RequestBody @Validated(SysNoticeRequest.delete.class) SysNoticeRequest sysNoticeParam) {
sysResourceService.delete(sysNoticeParam);
return new SuccessResponseData();
}
/**
*
*
* @author liuhanqing
* @date 2021/1/9 9:49
*/
@GetResource(name = "查看通知管理", path = "/sysNotice/detail")
public ResponseData detail(@Validated(SysNoticeRequest.detail.class) SysNoticeRequest sysNoticeParam) {
return new SuccessResponseData(sysResourceService.detail(sysNoticeParam));
}
/**
*
*
* @author liuhanqing
* @date 2021/1/9 21:23
*/
@GetResource(name = "查询通知管理", path = "/sysNotice/page")
public ResponseData page(SysNoticeRequest sysNoticeParam) {
return new SuccessResponseData(sysResourceService.page(sysNoticeParam));
}
/**
*
*
* @author liuhanqing
* @date 2021/1/9 14:55
*/
@GetResource(name = "通知管理列表", path = "/sysNotice/list")
public ResponseData list(SysNoticeRequest sysNoticeParam) {
return new SuccessResponseData(sysResourceService.list(sysNoticeParam));
}
}

View File

@ -0,0 +1,80 @@
package cn.stylefeng.roses.kernel.notice.modular.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
*
*
* @author liuhanqing
* @date 2021/1/8 22:45
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_notice")
public class SysNotice extends BaseEntity {
/**
* id
*/
@TableId("notice_id")
private Long noticeId;
/**
*
*/
@TableField("notice_title")
private String noticeTitle;
/**
*
*/
@TableField("notice_summary")
private String noticeSummary;
/**
*
*/
@TableField(value = "priority_level")
private String priorityLevel;
/**
*
*/
@TableField(value = "notice_begin_time")
private Date noticeBeginTime;
/**
*
*/
@TableField(value = "notice_end_time")
private Date noticeEndTime;
/**
*
*/
@TableField("notice_content")
private String noticeContent;
/**
*
*/
@TableField("notice_scope")
private String noticeScope;
/**
* Y-N-
*/
@TableField(value = "del_flag", fill = FieldFill.INSERT)
private String delFlag;
}

View File

@ -0,0 +1,14 @@
package cn.stylefeng.roses.kernel.notice.modular.mapper;
import cn.stylefeng.roses.kernel.notice.modular.entity.SysNotice;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* Mapper
*
* @author liuhanqing
* @date 2021/1/8 22:45
*/
public interface SysNoticeMapper extends BaseMapper<SysNotice> {
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.stylefeng.roses.kernel.notice.modular.mapper.SysNoticeMapper">
</mapper>

View File

@ -0,0 +1,78 @@
package cn.stylefeng.roses.kernel.notice.modular.service;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.notice.modular.entity.SysNotice;
import cn.stylefeng.roses.kernel.system.NoticeServiceApi;
import cn.stylefeng.roses.kernel.system.pojo.notice.SysNoticeRequest;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
*
*
* @author liuhanqing
* @date 2021/1/8 19:56
*/
public interface SysNoticeService extends IService<SysNotice>, NoticeServiceApi {
/**
*
*
* @param SysNoticeParam
* @author liuhanqing
* @date 2021/1/9 14:57
*/
void add(SysNoticeRequest SysNoticeParam);
/**
*
*
* @param SysNoticeParam
* @author liuhanqing
* @date 2021/1/9 14:58
*/
void edit(SysNoticeRequest SysNoticeParam);
/**
*
*
* @param SysNoticeParam
* @author liuhanqing
* @date 2021/1/9 14:57
*/
void delete(SysNoticeRequest SysNoticeParam);
/**
*
*
* @param SysNoticeParam
* @return
* @author liuhanqing
* @date 2021/1/9 14:56
*/
SysNotice detail(SysNoticeRequest SysNoticeParam);
/**
*
*
* @param SysNoticeParam
* @return
* @author liuhanqing
* @date 2021/1/9 14:56
*/
PageResult<SysNotice> page(SysNoticeRequest SysNoticeParam);
/**
*
*
* @param SysNoticeParam
* @return
* @author liuhanqing
* @date 2021/1/9 14:56
*/
List<SysNotice> list(SysNoticeRequest SysNoticeParam);
}

View File

@ -0,0 +1,167 @@
package cn.stylefeng.roses.kernel.notice.modular.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.message.api.MessageApi;
import cn.stylefeng.roses.kernel.message.api.enums.MessageBusinessTypeEnum;
import cn.stylefeng.roses.kernel.message.api.pojo.MessageSendParam;
import cn.stylefeng.roses.kernel.notice.modular.entity.SysNotice;
import cn.stylefeng.roses.kernel.notice.modular.mapper.SysNoticeMapper;
import cn.stylefeng.roses.kernel.notice.modular.service.SysNoticeService;
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.system.exception.enums.NoticeExceptionEnum;
import cn.stylefeng.roses.kernel.system.pojo.notice.SysNoticeRequest;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
*
*
* @author liuhanqing
* @date 2021/1/8 22:45
*/
@Service
public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice> implements SysNoticeService {
private static String NOTICE_SCOPE_ALL = "all";
@Autowired
private SysNoticeMapper noticeMapper;
/**
* api
*/
@Autowired
private MessageApi messageApi;
private void sendMessage(SysNotice sysNotice){
MessageSendParam message = new MessageSendParam();
// 消息标题
message.setMessageTitle(sysNotice.getNoticeTitle());
// 消息内容
message.setMessageContent(sysNotice.getNoticeSummary());
// 消息优先级
message.setPriorityLevel(sysNotice.getPriorityLevel());
// 消息发送范围
message.setReceiveUserIds(sysNotice.getNoticeScope());
// 消息业务类型
message.setBusinessType(MessageBusinessTypeEnum.SYS_NOTICE.getCode());
message.setBusinessId(sysNotice.getNoticeId());
messageApi.sendMessage(message);
}
@Override
public void add(SysNoticeRequest sysNoticeRequest) {
SysNotice sysNotice = new SysNotice();
BeanUtil.copyProperties(sysNoticeRequest, sysNotice);
if(StrUtil.isBlank(sysNotice.getNoticeScope())){
sysNotice.setNoticeScope(NOTICE_SCOPE_ALL);
}
// 如果保存成功调用发送消息
if(this.save(sysNotice)){
sendMessage(sysNotice);
}
}
@Override
public void edit(SysNoticeRequest sysNoticeRequest) {
SysNotice sysNotice = this.querySysNotice(sysNoticeRequest);
String noticeScope = sysNotice.getNoticeScope();
if(StrUtil.isBlank(sysNoticeRequest.getNoticeScope())){
sysNoticeRequest.setNoticeScope(NOTICE_SCOPE_ALL);
}
if(sysNoticeRequest.equals(sysNotice.getNoticeScope())){
throw new ServiceException(NoticeExceptionEnum.NOTICE_SCOPE_NOT_EDIT);
}
BeanUtil.copyProperties(sysNoticeRequest, sysNotice);
// 通知范围不允许修改
sysNotice.setNoticeScope(noticeScope);
if(this.updateById(sysNotice)){
sendMessage(sysNotice);
}
}
@Override
public void delete(SysNoticeRequest sysNoticeRequest) {
SysNotice sysNotice = this.querySysNotice(sysNoticeRequest);
// 逻辑删除
sysNotice.setDelFlag(YesOrNotEnum.Y.getCode());
this.updateById(sysNotice);
}
@Override
public SysNotice detail(SysNoticeRequest sysNoticeRequest) {
return this.querySysNotice(sysNoticeRequest);
}
@Override
public PageResult<SysNotice> page(SysNoticeRequest sysNoticeRequest) {
LambdaQueryWrapper<SysNotice> wrapper = createWrapper(sysNoticeRequest);
Page<SysNotice> page = this.page(PageFactory.defaultPage(), wrapper);
return PageResultFactory.createPageResult(page);
}
@Override
public List<SysNotice> list(SysNoticeRequest sysNoticeRequest) {
LambdaQueryWrapper<SysNotice> wrapper = createWrapper(sysNoticeRequest);
return this.list(wrapper);
}
/**
*
*
* @author liuhanqing
* @date 2021/1/9 16:56
*/
private SysNotice querySysNotice(SysNoticeRequest sysNoticeRequest) {
SysNotice sysNotice = this.getById(sysNoticeRequest.getNoticeId());
if (ObjectUtil.isNull(sysNotice)) {
throw new ServiceException(NoticeExceptionEnum.NOTICE_NOT_EXIST);
}
return sysNotice;
}
/**
* wrapper
*
* @author liuhanqing
* @date 2020/1/9 16:16
*/
private LambdaQueryWrapper<SysNotice> createWrapper(SysNoticeRequest sysNoticeRequest) {
LambdaQueryWrapper<SysNotice> queryWrapper = new LambdaQueryWrapper<>();
if (ObjectUtil.isNotNull(sysNoticeRequest)) {
// 根据id查询
if (ObjectUtil.isNotEmpty(sysNoticeRequest.getNoticeId())) {
queryWrapper.eq(SysNotice::getNoticeId, sysNoticeRequest.getNoticeId());
}
// 根据消息标题模糊查询
if (ObjectUtil.isNotEmpty(sysNoticeRequest.getNoticeTitle())) {
queryWrapper.like(SysNotice::getNoticeTitle, sysNoticeRequest.getNoticeTitle()).or().like(SysNotice::getNoticeSummary, sysNoticeRequest.getNoticeTitle()).or().like(SysNotice::getNoticeContent, sysNoticeRequest.getNoticeTitle());
}
}
// 查询未删除状态的
queryWrapper.eq(SysNotice::getDelFlag, YesOrNotEnum.N.getCode());
return queryWrapper;
}
}

View File

@ -59,6 +59,13 @@
<version>1.0.0</version>
</dependency>
<!--通知管理的业务-->
<dependency>
<groupId>cn.stylefeng.roses</groupId>
<artifactId>system-business-notice</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>