From aaad74eb29aca26a228db9bd9937a3f494d4fc8c Mon Sep 17 00:00:00 2001 From: wanggeng <450292408@qq.com> Date: Fri, 22 Oct 2021 18:16:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=80=9A=E7=9F=A5=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=88=97=E8=A1=A8=EF=BC=8C=E5=9C=A8=E7=BA=BF=E5=8F=91?= =?UTF-8?q?=E9=80=81=E9=80=9A=E7=9F=A5=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=9A=E7=9F=A5=E5=8F=91=E9=80=81=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=8F=91=E9=80=81=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/WebSocketMessageController.java | 13 +- .../api/WebSocketNoticeController.java | 73 +++++ .../route/WebSocketNoticeRouteController.java | 33 +++ .../module/instantmessage/dao/INoticeDao.java | 18 ++ .../instantmessage/pojo/dtos/NoticeDTO.java | 166 +++++++++++ .../instantmessage/pojo/pos/NoticePO.java | 71 ++--- .../instantmessage/pojo/vos/NoticeSendVO.java | 50 ++++ .../service/IMessageService.java | 9 + .../service/INoticeService.java | 44 ++- .../service/impl/MessageServiceImpl.java | 60 +++- .../service/impl/NoticeServiceImpl.java | 81 +++++- .../mybatis/mapper/notice-mapper.xml | 175 +++++++++-- .../main/resources/templates/notice/list.html | 273 ++++++++++++++++++ .../main/resources/templates/notice/send.html | 129 +++++++++ 14 files changed, 1105 insertions(+), 90 deletions(-) create mode 100644 module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketNoticeController.java create mode 100644 module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/route/WebSocketNoticeRouteController.java create mode 100644 module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/dtos/NoticeDTO.java create mode 100644 module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/vos/NoticeSendVO.java create mode 100644 module-instant-message/src/main/resources/templates/notice/list.html create mode 100644 module-instant-message/src/main/resources/templates/notice/send.html diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketMessageController.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketMessageController.java index 1a29c6ee..1c3526c5 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketMessageController.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketMessageController.java @@ -1,10 +1,12 @@ package ink.wgink.module.instantmessage.controller.api; import ink.wgink.annotation.CheckRequestBodyAnnotation; +import ink.wgink.common.base.DefaultBaseController; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.module.instantmessage.pojo.bos.NoticeBO; import ink.wgink.module.instantmessage.pojo.bos.NoticeTargetBO; import ink.wgink.module.instantmessage.pojo.vos.MessageVO; +import ink.wgink.module.instantmessage.pojo.vos.NoticeSendVO; import ink.wgink.module.instantmessage.service.IMessageService; import ink.wgink.pojo.result.ErrorResult; import ink.wgink.pojo.result.SuccessResult; @@ -27,11 +29,20 @@ import java.util.Arrays; @Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "消息接口") @RestController @RequestMapping(ISystemConstant.API_PREFIX + "/websocket/message") -public class WebSocketMessageController { +public class WebSocketMessageController extends DefaultBaseController { @Autowired private IMessageService messageService; + @ApiOperation(value = "通知消息", notes = "通知消息接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("notice") + @CheckRequestBodyAnnotation + public SuccessResult notice(@RequestBody NoticeSendVO noticeSendVO) throws Exception { + messageService.notice(noticeSendVO); + return new SuccessResult(); + } + @ApiOperation(value = "通知消息", notes = "通知消息接口") @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PostMapping("notice/{clientName}") diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketNoticeController.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketNoticeController.java new file mode 100644 index 00000000..52f3cda0 --- /dev/null +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/api/WebSocketNoticeController.java @@ -0,0 +1,73 @@ +package ink.wgink.module.instantmessage.controller.api; + +import ink.wgink.annotation.CheckRequestBodyAnnotation; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.module.instantmessage.pojo.dtos.NoticeDTO; +import ink.wgink.module.instantmessage.pojo.vos.NoticeSendVO; +import ink.wgink.module.instantmessage.service.INoticeService; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultList; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: MessageController + * @Description: 消息 + * @Author: wanggeng + * @Date: 2021/1/14 3:25 下午 + * @Version: 1.0 + */ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "消息接口") +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/websocket/notice") +public class WebSocketNoticeController extends DefaultBaseController { + + @Autowired + private INoticeService noticeService; + + @ApiOperation(value = "删除通知", notes = "删除通知接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "noticeIds", value = "通知ID列表", paramType = "path"), + }) + @DeleteMapping("remove/{noticeIds}") + public SuccessResult delete(@PathVariable("noticeIds") String noticeIds) { + noticeService.remove(Arrays.asList(noticeIds.split("\\_"))); + return new SuccessResult(); + } + + @ApiOperation(value = "通知列表", notes = "通知列表接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List list() { + Map params = requestParams(); + return noticeService.list(params); + } + + @ApiOperation(value = "通知分页列表", notes = "通知分页列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"), + @ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"), + @ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("listpage") + public SuccessResultList> listPage(ListPage page) { + Map params = requestParams(); + page.setParams(params); + return noticeService.listPage(page); + } + +} diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/route/WebSocketNoticeRouteController.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/route/WebSocketNoticeRouteController.java new file mode 100644 index 00000000..3fcb007d --- /dev/null +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/controller/route/WebSocketNoticeRouteController.java @@ -0,0 +1,33 @@ +package ink.wgink.module.instantmessage.controller.route; + +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +/** + * @ClassName: NoticeController + * @Description: 即使消息通知路由 + * @Author: CodeFactory + * @Date: 2021-10-22 11:04:57 + * @Version: 3.0 + **/ +@Api(tags = ISystemConstant.ROUTE_TAGS_PREFIX + "即使消息通知路由") +@RestController +@RequestMapping(ISystemConstant.ROUTE_PREFIX + "/websocket/notice") +public class WebSocketNoticeRouteController extends DefaultBaseController { + + @GetMapping("send") + public ModelAndView send() { + return new ModelAndView("notice/send"); + } + + @GetMapping("list") + public ModelAndView list() { + return new ModelAndView("notice/list"); + } + +} \ No newline at end of file diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/dao/INoticeDao.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/dao/INoticeDao.java index e12bdaa0..c41ad48b 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/dao/INoticeDao.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/dao/INoticeDao.java @@ -5,6 +5,7 @@ import ink.wgink.exceptions.SaveException; import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.UpdateException; import ink.wgink.interfaces.init.IInitBaseTable; +import ink.wgink.module.instantmessage.pojo.dtos.NoticeDTO; import ink.wgink.module.instantmessage.pojo.pos.NoticePO; import org.springframework.stereotype.Repository; @@ -101,4 +102,21 @@ public interface INoticeDao extends IInitBaseTable { * @throws RemoveException */ void delete(Map params) throws RemoveException; + + /** + * 删除 + * + * @param params + * @throws RemoveException + */ + void remove(Map params) throws RemoveException; + + /** + * 通知列表 + * + * @param params + * @return + * @throws SearchException + */ + List list(Map params) throws SearchException; } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/dtos/NoticeDTO.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/dtos/NoticeDTO.java new file mode 100644 index 00000000..ec91dd90 --- /dev/null +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/dtos/NoticeDTO.java @@ -0,0 +1,166 @@ +package ink.wgink.module.instantmessage.pojo.dtos; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: NoticeDTO + * @Description: 通知 + * @Author: wanggeng + * @Date: 2021/10/22 11:18 上午 + * @Version: 1.0 + */ +@ApiModel +public class NoticeDTO { + + @ApiModelProperty(name = "noticeId", value = "通知标题") + private String noticeId; + @ApiModelProperty(name = "noticeTitle", value = "通知内容") + private String noticeTitle; + @ApiModelProperty(name = "noticeMsg", value = "通知内容") + private String noticeMsg; + @ApiModelProperty(name = "noticeTarget", value = "通知触发目标") + private String noticeTarget; + @ApiModelProperty(name = "noticeSystem", value = "通知业务系统") + private String noticeSystem; + @ApiModelProperty(name = "noticeModule", value = "通知业务模块") + private String noticeModule; + @ApiModelProperty(name = "noticeMenu", value = "通知业务菜单") + private String noticeMenu; + @ApiModelProperty(name = "noticeServiceId", value = "通知业务ID") + private String noticeServiceId; + @ApiModelProperty(name = "userId", value = "通知人") + private String userId; + @ApiModelProperty(name = "userName", value = "通知人昵称") + private String userName; + @ApiModelProperty(name = "userUsername", value = "通知人用户名") + private String userUsername; + @ApiModelProperty(name = "isSend", value = "是否发送") + private Integer isSend; + @ApiModelProperty(name = "isHandle", value = "是否处理") + private Integer isHandle; + @ApiModelProperty(name = "gmtCreate", value = "创建时间") + private String gmtCreate; + @ApiModelProperty(name = "gmtModified", value = "修改时间") + private String gmtModified; + + public String getNoticeId() { + return noticeId == null ? "" : noticeId.trim(); + } + + public void setNoticeId(String noticeId) { + this.noticeId = noticeId; + } + + public String getNoticeTitle() { + return noticeTitle == null ? "" : noticeTitle.trim(); + } + + public void setNoticeTitle(String noticeTitle) { + this.noticeTitle = noticeTitle; + } + + public String getNoticeMsg() { + return noticeMsg == null ? "" : noticeMsg.trim(); + } + + public void setNoticeMsg(String noticeMsg) { + this.noticeMsg = noticeMsg; + } + + public String getNoticeTarget() { + return noticeTarget == null ? "" : noticeTarget.trim(); + } + + public void setNoticeTarget(String noticeTarget) { + this.noticeTarget = noticeTarget; + } + + public String getNoticeSystem() { + return noticeSystem == null ? "" : noticeSystem.trim(); + } + + public void setNoticeSystem(String noticeSystem) { + this.noticeSystem = noticeSystem; + } + + public String getNoticeModule() { + return noticeModule == null ? "" : noticeModule.trim(); + } + + public void setNoticeModule(String noticeModule) { + this.noticeModule = noticeModule; + } + + public String getNoticeMenu() { + return noticeMenu == null ? "" : noticeMenu.trim(); + } + + public void setNoticeMenu(String noticeMenu) { + this.noticeMenu = noticeMenu; + } + + public String getNoticeServiceId() { + return noticeServiceId == null ? "" : noticeServiceId.trim(); + } + + public void setNoticeServiceId(String noticeServiceId) { + this.noticeServiceId = noticeServiceId; + } + + public String getUserId() { + return userId == null ? "" : userId.trim(); + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName == null ? "" : userName.trim(); + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserUsername() { + return userUsername == null ? "" : userUsername.trim(); + } + + public void setUserUsername(String userUsername) { + this.userUsername = userUsername; + } + + public Integer getIsSend() { + return isSend == null ? 0 : isSend; + } + + public void setIsSend(Integer isSend) { + this.isSend = isSend; + } + + public Integer getIsHandle() { + return isHandle == null ? 0 : isHandle; + } + + public void setIsHandle(Integer isHandle) { + this.isHandle = isHandle; + } + + public String getGmtCreate() { + return gmtCreate == null ? "" : gmtCreate.trim(); + } + + public void setGmtCreate(String gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public String getGmtModified() { + return gmtModified == null ? "" : gmtModified.trim(); + } + + public void setGmtModified(String gmtModified) { + this.gmtModified = gmtModified; + } +} diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/pos/NoticePO.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/pos/NoticePO.java index f8fa9f27..b7d714bd 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/pos/NoticePO.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/pos/NoticePO.java @@ -1,5 +1,7 @@ package ink.wgink.module.instantmessage.pojo.pos; +import java.io.Serializable; + /** * When you feel like quitting. Think about why you started * 当你想要放弃的时候,想想当初你为何开始 @@ -10,8 +12,9 @@ package ink.wgink.module.instantmessage.pojo.pos; * @Date: 2021/3/29 4:39 下午 * @Version: 1.0 */ -public class NoticePO { +public class NoticePO implements Serializable { + private static final long serialVersionUID = -7182904168489429255L; private Long id; private String noticeId; private String noticeTitle; @@ -22,6 +25,9 @@ public class NoticePO { private String noticeMenu; private String noticeServiceId; private String userId; + private String userName; + private String userUsername; + private Integer isSend; private Integer isHandle; private String gmtCreate; private String creator; @@ -109,6 +115,30 @@ public class NoticePO { this.userId = userId; } + public String getUserName() { + return userName == null ? "" : userName.trim(); + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserUsername() { + return userUsername == null ? "" : userUsername.trim(); + } + + public void setUserUsername(String userUsername) { + this.userUsername = userUsername; + } + + public Integer getIsSend() { + return isSend == null ? 0 : isSend; + } + + public void setIsSend(Integer isSend) { + this.isSend = isSend; + } + public Integer getIsHandle() { return isHandle == null ? 0 : isHandle; } @@ -157,42 +187,5 @@ public class NoticePO { this.isDelete = isDelete; } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("{"); - sb.append("\"id\":") - .append(id); - sb.append(",\"noticeId\":\"") - .append(noticeId).append('\"'); - sb.append(",\"noticeTitle\":\"") - .append(noticeTitle).append('\"'); - sb.append(",\"noticeMsg\":\"") - .append(noticeMsg).append('\"'); - sb.append(",\"noticeTarget\":\"") - .append(noticeTarget).append('\"'); - sb.append(",\"noticeSystem\":\"") - .append(noticeSystem).append('\"'); - sb.append(",\"noticeModule\":\"") - .append(noticeModule).append('\"'); - sb.append(",\"noticeMenu\":\"") - .append(noticeMenu).append('\"'); - sb.append(",\"noticeServiceId\":\"") - .append(noticeServiceId).append('\"'); - sb.append(",\"userId\":\"") - .append(userId).append('\"'); - sb.append(",\"isHandle\":") - .append(isHandle); - sb.append(",\"gmtCreate\":\"") - .append(gmtCreate).append('\"'); - sb.append(",\"creator\":\"") - .append(creator).append('\"'); - sb.append(",\"gmtModified\":\"") - .append(gmtModified).append('\"'); - sb.append(",\"modifier\":\"") - .append(modifier).append('\"'); - sb.append(",\"isDelete\":") - .append(isDelete); - sb.append('}'); - return sb.toString(); - } + } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/vos/NoticeSendVO.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/vos/NoticeSendVO.java new file mode 100644 index 00000000..765f02f1 --- /dev/null +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/pojo/vos/NoticeSendVO.java @@ -0,0 +1,50 @@ +package ink.wgink.module.instantmessage.pojo.vos; + +import ink.wgink.annotation.CheckEmptyAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: NoticeSendVO + * @Description: 通知发送 + * @Author: wanggeng + * @Date: 2021/10/22 12:43 下午 + * @Version: 1.0 + */ +@ApiModel +public class NoticeSendVO { + + @ApiModelProperty(name = "noticeTitle", value = "通知标题") + @CheckEmptyAnnotation(name = "通知标题") + private String noticeTitle; + @ApiModelProperty(name = "noticeMsg", value = "通知内容") + @CheckEmptyAnnotation(name = "通知内容") + private String noticeMsg; + @ApiModelProperty(name = "noticeUserIds", value = "通知用户ID列表") + @CheckEmptyAnnotation(name = "通知用户ID列表") + private String noticeUserIds; + + public String getNoticeTitle() { + return noticeTitle == null ? "" : noticeTitle.trim(); + } + + public void setNoticeTitle(String noticeTitle) { + this.noticeTitle = noticeTitle; + } + + public String getNoticeMsg() { + return noticeMsg == null ? "" : noticeMsg.trim(); + } + + public void setNoticeMsg(String noticeMsg) { + this.noticeMsg = noticeMsg; + } + + public String getNoticeUserIds() { + return noticeUserIds == null ? "" : noticeUserIds.trim(); + } + + public void setNoticeUserIds(String noticeUserIds) { + this.noticeUserIds = noticeUserIds; + } +} diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/IMessageService.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/IMessageService.java index 871e4624..d0a7a307 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/IMessageService.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/IMessageService.java @@ -2,6 +2,7 @@ package ink.wgink.module.instantmessage.service; import ink.wgink.module.instantmessage.pojo.bos.NoticeBO; import ink.wgink.module.instantmessage.pojo.bos.NoticeTargetBO; +import ink.wgink.module.instantmessage.pojo.vos.NoticeSendVO; import ink.wgink.module.instantmessage.pojo.vos.NoticeVO; import java.util.List; @@ -18,6 +19,13 @@ import java.util.List; */ public interface IMessageService { + /** + * 通知 + * + * @param noticeSendVO + */ + void notice(NoticeSendVO noticeSendVO) throws Exception; + /** * 通知 * @@ -61,4 +69,5 @@ public interface IMessageService { * @param serviceIds */ void delete(List serviceIds); + } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/INoticeService.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/INoticeService.java index e91ebe9b..82ed2b78 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/INoticeService.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/INoticeService.java @@ -1,10 +1,13 @@ package ink.wgink.module.instantmessage.service; -import ink.wgink.module.instantmessage.pojo.bos.NoticeBO; -import ink.wgink.module.instantmessage.pojo.bos.NoticeTargetBO; +import ink.wgink.module.instantmessage.pojo.dtos.NoticeDTO; import ink.wgink.module.instantmessage.pojo.pos.NoticePO; +import ink.wgink.module.instantmessage.pojo.vos.NoticeSendVO; import ink.wgink.module.instantmessage.pojo.vos.NoticeVO; import ink.wgink.module.instantmessage.websocket.pojo.body.CountNeedToDealWithBody; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.dtos.user.UserDTO; +import ink.wgink.pojo.result.SuccessResultList; import java.util.List; import java.util.Map; @@ -24,10 +27,11 @@ public interface INoticeService { /** * 保存 * - * @param userId - * @param notice + * @param userDTO + * @param notice 通知内容 + * @param isSend 是否发送 */ - void save(String userId, NoticeVO.Notice notice) throws Exception; + void save(UserDTO userDTO, NoticeVO.Notice notice, boolean isSend) throws Exception; /** * 更新已办状态 @@ -161,6 +165,13 @@ public interface INoticeService { */ void deleteByServiceIds(List serviceIds); + /** + * 删除通知 + * + * @param noticeIds + */ + void remove(List noticeIds); + /** * 通知列表 * @@ -169,4 +180,27 @@ public interface INoticeService { */ List listPO(List serviceIds); + /** + * 通知列表 + * + * @param params + * @return + */ + List list(Map params); + + /** + * 通知分页列表 + * + * @param page + * @return + */ + SuccessResultList> listPage(ListPage page); + + /** + * 发送通知 + * + * @param noticeSendVO + * @throws Exception + */ + void notice(NoticeSendVO noticeSendVO) throws Exception; } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/MessageServiceImpl.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/MessageServiceImpl.java index be90a2ab..3b7ab979 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/MessageServiceImpl.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/MessageServiceImpl.java @@ -4,9 +4,11 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.exceptions.SearchException; +import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.module.instantmessage.pojo.bos.NoticeBO; import ink.wgink.module.instantmessage.pojo.bos.NoticeTargetBO; import ink.wgink.module.instantmessage.pojo.pos.NoticePO; +import ink.wgink.module.instantmessage.pojo.vos.NoticeSendVO; import ink.wgink.module.instantmessage.pojo.vos.NoticeVO; import ink.wgink.module.instantmessage.service.IMessageService; import ink.wgink.module.instantmessage.service.INoticeService; @@ -16,17 +18,16 @@ import ink.wgink.module.instantmessage.websocket.pojo.WebSocketClientMessage; import ink.wgink.module.instantmessage.websocket.pojo.WebSocketSession; import ink.wgink.module.instantmessage.websocket.pojo.body.CountNeedToDealWithBody; import ink.wgink.module.instantmessage.websocket.pojo.body.NoticeBody; +import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.util.BeanPropertyCheckUtil; +import ink.wgink.util.UUIDUtil; import io.netty.channel.Channel; import org.apache.commons.compress.utils.Sets; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -46,8 +47,27 @@ public class MessageServiceImpl extends DefaultBaseService implements IMessageSe @Autowired private INoticeService noticeService; + @Autowired + private IUserBaseService userBaseService; private ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(2); + @Override + public void notice(NoticeSendVO noticeSendVO) throws Exception { + NoticeVO.Notice notice = new NoticeVO.Notice(); + notice.setTitle(noticeSendVO.getNoticeTitle()); + notice.setMsg(noticeSendVO.getNoticeMsg()); + notice.setServiceId("IM_NOTICE:" + UUIDUtil.getUUID()); + notice.setSystem("IM"); + notice.setUserIds(Arrays.asList(noticeSendVO.getNoticeUserIds().split("\\_"))); + + List notices = new ArrayList<>(); + notices.add(notice); + NoticeVO noticeVO = new NoticeVO(); + noticeVO.setNotices(notices); + // 发送消息 + saveNotice(noticeVO, true); + } + @Override public void notice(NoticeBO noticeBO) { notice(null, noticeBO); @@ -99,7 +119,7 @@ public class MessageServiceImpl extends DefaultBaseService implements IMessageSe scheduledExecutorService.schedule(() -> { for (WebSocketSession webSocketSession : webSocketSessions) { NoticeBody noticeBody = new NoticeBody(notice.getTitle(), notice.getMsg(), notice.getTarget()); - WebSocketClientMessage webSocketClientMessage = new WebSocketClientMessage(MessageTypeEnum.NOTICE_TARGET_MESSAGE.getValue(), + WebSocketClientMessage webSocketClientMessage = new WebSocketClientMessage(MessageTypeEnum.NOTICE.getValue(), true, WebSocketChannelManager.FORM_SYSTEM, webSocketSession.getUserId(), @@ -107,14 +127,30 @@ public class MessageServiceImpl extends DefaultBaseService implements IMessageSe // 发送通知 WebSocketChannelManager.getInstance().sendText(webSocketSession.getChannel(), webSocketClientMessage); } - }, 3, TimeUnit.SECONDS); - if (isSave) { - // 保存通知记录 - List userIds = notice.getUserIds(); - for (String userId : userIds) { - noticeService.save(userId, notice); + if (isSave) { + try { + // 保存发送记录 + List userIds = notice.getUserIds(); + List userDTOs = userBaseService.listByUserIds(userIds); + for (UserDTO userDTO : userDTOs) { + boolean isOnline = false; + for (WebSocketSession webSocketSession : webSocketSessions) { + if (StringUtils.equals(userDTO.getUserId(), webSocketSession.getUserId())) { + isOnline = true; + break; + } + } + if (isOnline) { + noticeService.save(userDTO, notice, true); + } else { + noticeService.save(userDTO, notice, false); + } + } + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } } - } + }, 2, TimeUnit.SECONDS); } } diff --git a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/NoticeServiceImpl.java b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/NoticeServiceImpl.java index 29a80d0a..3151303c 100644 --- a/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/NoticeServiceImpl.java +++ b/module-instant-message/src/main/java/ink/wgink/module/instantmessage/service/impl/NoticeServiceImpl.java @@ -1,20 +1,26 @@ package ink.wgink.module.instantmessage.service.impl; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.module.instantmessage.dao.INoticeDao; +import ink.wgink.module.instantmessage.pojo.dtos.NoticeDTO; import ink.wgink.module.instantmessage.pojo.pos.NoticePO; +import ink.wgink.module.instantmessage.pojo.vos.NoticeSendVO; import ink.wgink.module.instantmessage.pojo.vos.NoticeVO; import ink.wgink.module.instantmessage.service.INoticeService; import ink.wgink.module.instantmessage.websocket.pojo.body.CountNeedToDealWithBody; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.dtos.user.UserDTO; +import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.util.UUIDUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; /** * When you feel like quitting. Think about why you started @@ -31,10 +37,12 @@ public class NoticeServiceImpl extends DefaultBaseService implements INoticeServ @Autowired private INoticeDao noticeDao; + @Autowired + private IUserBaseService userBaseService; @Override - public void save(String userId, NoticeVO.Notice notice) throws Exception { - if (StringUtils.isBlank(userId)) { + public void save(UserDTO userDTO, NoticeVO.Notice notice, boolean isSend) throws Exception { + if (userDTO == null) { return; } if (StringUtils.isBlank(notice.getSystem())) { @@ -43,14 +51,16 @@ public class NoticeServiceImpl extends DefaultBaseService implements INoticeServ if (StringUtils.isBlank(notice.getServiceId())) { return; } - List noticePOs = listPO(notice.getSystem(), notice.getModule(), notice.getMenu(), notice.getServiceId(), userId); + List noticePOs = listPO(notice.getSystem(), notice.getModule(), notice.getMenu(), notice.getServiceId(), userDTO.getUserId()); if (!noticePOs.isEmpty()) { LOG.debug("通知已经存在"); return; } Map params = getHashMap(16); params.put("noticeId", UUIDUtil.getUUID()); - params.put("userId", userId); + params.put("userId", userDTO.getUserId()); + params.put("userName", userDTO.getUserName()); + params.put("userUsername", userDTO.getUserUsername()); params.put("noticeTitle", notice.getTitle()); params.put("noticeMsg", notice.getMsg()); params.put("noticeTarget", notice.getTarget()); @@ -58,6 +68,7 @@ public class NoticeServiceImpl extends DefaultBaseService implements INoticeServ params.put("noticeModule", notice.getModule()); params.put("noticeMenu", notice.getMenu()); params.put("noticeServiceId", notice.getServiceId()); + params.put("isSend", isSend ? 1 : 0); params.put("isHandle", 0); setSaveInfoByUserId(params, "1"); noticeDao.save(params); @@ -236,6 +247,14 @@ public class NoticeServiceImpl extends DefaultBaseService implements INoticeServ noticeDao.delete(params); } + @Override + public void remove(List noticeIds) { + Map params = getHashMap(2); + params.put("noticeIds", noticeIds); + setUpdateInfo(params); + noticeDao.remove(params); + } + @Override public List listPO(List serviceIds) { Map params = getHashMap(2); @@ -243,6 +262,27 @@ public class NoticeServiceImpl extends DefaultBaseService implements INoticeServ return listPO(params); } + @Override + public List list(Map params) { + return noticeDao.list(params); + } + + @Override + public SuccessResultList> listPage(ListPage page) { + PageHelper.startPage(page.getPage(), page.getRows()); + List noticeDTOs = list(page.getParams()); + PageInfo pageInfo = new PageInfo<>(noticeDTOs); + return new SuccessResultList<>(noticeDTOs, pageInfo.getPageNum(), pageInfo.getTotal()); + } + + @Override + public void notice(NoticeSendVO noticeSendVO) throws Exception { + String noticeUserIdsString = noticeSendVO.getNoticeUserIds(); + List noticeUserIds = Arrays.asList(noticeUserIdsString.split("\\_")); + NoticeVO.Notice notice = new NoticeVO.Notice(); + notice.setUserIds(noticeUserIds); + } + /** * 系统列表 * @@ -282,4 +322,31 @@ public class NoticeServiceImpl extends DefaultBaseService implements INoticeServ return noticeDao.listMenus(params); } + /** + * 设置用户 + * + * @param noticeDTOs + */ + private void setUser(List noticeDTOs) { + if (noticeDTOs.isEmpty()) { + return; + } + Set userIdSet = new HashSet<>(); + for (NoticeDTO noticeDTO : noticeDTOs) { + userIdSet.add(noticeDTO.getUserId()); + } + List userDTOs = userBaseService.listByUserIds(new ArrayList<>(userIdSet)); + if (userDTOs.isEmpty()) { + return; + } + for (NoticeDTO noticeDTO : noticeDTOs) { + for (UserDTO userDTO : userDTOs) { + if (StringUtils.equals(noticeDTO.getUserId(), userDTO.getUserId())) { + noticeDTO.setUserName(userDTO.getUserName()); + break; + } + } + } + } + } diff --git a/module-instant-message/src/main/resources/mybatis/mapper/notice-mapper.xml b/module-instant-message/src/main/resources/mybatis/mapper/notice-mapper.xml index 56df1d03..65fd1217 100644 --- a/module-instant-message/src/main/resources/mybatis/mapper/notice-mapper.xml +++ b/module-instant-message/src/main/resources/mybatis/mapper/notice-mapper.xml @@ -15,6 +15,9 @@ + + + @@ -23,23 +26,46 @@ + + + + + + + + + + + + + + + + + + + - CREATE TABLE IF NOT EXISTS `socket_notice` ( + CREATE TABLE IF NOT EXISTS `im_notice` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `notice_id` char(36) DEFAULT NULL COMMENT '主键', `notice_title` varchar(255) DEFAULT NULL COMMENT '通知标题', - `notice_msg` varchar(255) DEFAULT NULL COMMENT '通知内容', + `notice_msg` varchar(500) DEFAULT NULL COMMENT '通知内容', `notice_target` varchar(255) DEFAULT NULL COMMENT '通知触发目标', `notice_system` varchar(255) DEFAULT NULL COMMENT '通知业务系统', `notice_module` varchar(255) DEFAULT NULL COMMENT '通知业务模块', + `notice_menu` varchar(255) DEFAULT NULL COMMENT '通知业务菜单', `notice_service_id` varchar(255) DEFAULT NULL COMMENT '通知业务ID', `user_id` char(36) DEFAULT NULL COMMENT '通知人', + `user_username` varchar(255) DEFAULT NULL COMMENT '用户名', + `user_name` varchar(255) DEFAULT NULL COMMENT '用户昵称', + `is_send` int(1) DEFAULT '0' COMMENT '是否发送', `is_handle` int(1) DEFAULT '0' COMMENT '是否处理', - `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', - `creator` char(36) DEFAULT NULL COMMENT '创建人', - `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', - `modifier` char(36) DEFAULT NULL COMMENT '修改人', + `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', + `creator` char(36) DEFAULT NULL COMMENT '创建人', + `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', + `modifier` char(36) DEFAULT NULL COMMENT '修改人', `is_delete` int(1) DEFAULT '0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `notice_id` (`notice_id`) USING BTREE, @@ -50,12 +76,12 @@ KEY `notice_service_id` (`notice_service_id`) USING BTREE, KEY `user_id` (`user_id`) USING BTREE, KEY `is_handle` (`is_handle`) USING BTREE - ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='小程序用户'; + ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='小程序用户'; - - INSERT INTO socket_notice ( + + INSERT INTO im_notice ( notice_id, notice_title, notice_msg, @@ -65,6 +91,9 @@ notice_menu, notice_service_id, user_id, + user_name, + user_username, + is_send, is_handle, gmt_create, creator, @@ -81,6 +110,9 @@ #{noticeMenu}, #{noticeServiceId}, #{userId}, + #{userName}, + #{userUsername}, + #{isSend}, #{isHandle}, #{gmtCreate}, #{creator}, @@ -91,9 +123,9 @@ - + UPDATE - socket_notice + im_notice SET is_handle = #{isHandle}, gmt_modified = #{gmtModified}, @@ -105,9 +137,9 @@ - + DELETE FROM - socket_notice + im_notice WHERE notice_service_id IN @@ -117,8 +149,23 @@ + + + UPDATE + im_notice + SET + is_delete = 1, + gmt_modified = #{gmtModified}, + modifier = #{modifier} + WHERE + notice_id IN + + #{noticeIds[${index}]} + + + - SELECT notice_id, notice_title, @@ -129,6 +176,9 @@ notice_menu, notice_service_id, user_id, + user_name, + user_username, + is_send, is_handle, gmt_create, creator, @@ -136,7 +186,7 @@ modifier, is_delete FROM - socket_notice + im_notice WHERE is_delete = 0 @@ -166,7 +216,7 @@ - SELECT notice_id, notice_title, @@ -177,6 +227,9 @@ notice_menu, notice_service_id, user_id, + user_name, + user_username, + is_send, is_handle, gmt_create, creator, @@ -184,7 +237,7 @@ modifier, is_delete FROM - socket_notice + im_notice WHERE is_delete = 0 @@ -224,12 +277,82 @@ + + + - SELECT notice_system FROM - socket_notice + im_notice WHERE is_delete = 0 @@ -241,16 +364,16 @@ - SELECT notice_module FROM - socket_notice + im_notice WHERE is_delete = 0 AND - user_id = #{userId} + user_id = #{userId}`` AND @@ -261,11 +384,11 @@ - SELECT notice_menu FROM - socket_notice + im_notice WHERE is_delete = 0 @@ -285,11 +408,11 @@ - SELECT COUNT(*) FROM - socket_notice + im_notice WHERE is_delete = 0 diff --git a/module-instant-message/src/main/resources/templates/notice/list.html b/module-instant-message/src/main/resources/templates/notice/list.html new file mode 100644 index 00000000..40fee420 --- /dev/null +++ b/module-instant-message/src/main/resources/templates/notice/list.html @@ -0,0 +1,273 @@ + + + + + + + + + + + + + +
+
+
+
+
+
+
+ +
+ 创建时间 +
+ +
+
+ +
+ +
+
+ + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/module-instant-message/src/main/resources/templates/notice/send.html b/module-instant-message/src/main/resources/templates/notice/send.html new file mode 100644 index 00000000..0e00ef1a --- /dev/null +++ b/module-instant-message/src/main/resources/templates/notice/send.html @@ -0,0 +1,129 @@ + + + + + + + + + + + + + +
+
+
用户客户端在线的情况下会直接通知,不在线时只保存记录
+
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file