From 3e5a0117a1ca104019bc5cdca1ad195288f361dc Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Tue, 7 May 2024 17:22:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E7=94=A8=E6=88=B7=E7=BB=84=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9=20=E5=85=AC=E5=91=8A=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E7=94=A8=E6=88=B7=EF=BC=8C=20=E4=BB=8E=E5=85=A8=E5=91=98?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E4=B8=BA=E9=80=89=E6=8B=A9=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=8E=A8=E9=80=81=20=E4=BF=AE=E6=94=B9=20=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E4=BF=A1=E6=81=AF=E6=A8=A1=E6=9D=BF=EF=BC=8C?= =?UTF-8?q?=20=E9=80=9A=E7=9F=A5=E7=B1=BB=E5=9E=8B=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 3 + .../admin/notice/NoticeController.java | 18 ++- .../admin/notice/NoticeGroupController.java | 110 +++++++++++++++++ .../admin/notice/vo/NoticePushReqVO.java | 28 +++++ .../notice/vo/group/NoticeGroupBaseVO.java | 32 +++++ .../vo/group/NoticeGroupCreateReqVO.java | 14 +++ .../notice/vo/group/NoticeGroupPageReqVO.java | 29 +++++ .../notice/vo/group/NoticeGroupRespVO.java | 33 ++++++ .../vo/group/NoticeGroupUpdateReqVO.java | 20 ++++ .../system/convert/notice/NoticeConvert.java | 10 +- .../convert/notice/NoticeGroupConvert.java | 38 ++++++ .../dal/dataobject/notice/NoticeGroupDO.java | 49 ++++++++ .../dal/mysql/notice/NoticeGroupMapper.java | 30 +++++ .../service/notice/NoticeGroupService.java | 84 +++++++++++++ .../notice/NoticeGroupServiceImpl.java | 112 ++++++++++++++++++ .../system/service/notice/NoticeService.java | 5 +- .../service/notice/NoticeServiceImpl.java | 56 +++++++-- 17 files changed, 647 insertions(+), 24 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeGroupController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePushReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupBaseVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupCreateReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupUpdateReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeGroupConvert.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/NoticeGroupDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/NoticeGroupMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupServiceImpl.java diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index f4796b19..a7733bc5 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -74,6 +74,9 @@ public interface ErrorCodeConstants { // ========== 通知公告 1-002-008-000 ========== ErrorCode NOTICE_NOT_FOUND = new ErrorCode(1_002_008_001, "当前通知公告不存在"); + ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1_002_008_002, "用户组不存在"); + ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1_002_008_003, "名字为【{}】的用户组已被禁用"); + // ========== 短信渠道 1-002-011-000 ========== ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1_002_011_000, "短信渠道不存在"); ErrorCode SMS_CHANNEL_DISABLE = new ErrorCode(1_002_011_001, "短信渠道不处于开启状态,不允许选择"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeController.java index 793250ab..14dd1952 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeController.java @@ -1,14 +1,14 @@ package cn.iocoder.yudao.module.system.controller.admin.notice; -import cn.hutool.core.lang.Assert; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePushReqVO; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeRespVO; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; +import cn.iocoder.yudao.module.system.service.notice.NoticeGroupService; import cn.iocoder.yudao.module.system.service.notice.NoticeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -32,7 +32,7 @@ public class NoticeController { private NoticeService noticeService; @Resource - private WebSocketSenderApi webSocketSenderApi; + private NoticeGroupService groupService; @PostMapping("/create") @Operation(summary = "创建通知公告") @@ -77,18 +77,16 @@ public class NoticeController { } @PostMapping("/push") - @Operation(summary = "推送通知公告", description = "只发送给 websocket 连接在线的用户") - @Parameter(name = "id", description = "编号", required = true, example = "1024") + @Operation(summary = "推送通知公告") @PreAuthorize("@ss.hasPermission('system:notice:update')") - public CommonResult push(@RequestParam("id") Long id) { - NoticeDO notice = noticeService.getNotice(id); - Assert.notNull(notice, "公告不能为空"); + public CommonResult push(@Valid @RequestBody NoticePushReqVO pushReqVO) { + // 通过 websocket 推送给在线的用户 //webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), "notice-push", notice); + //小程序发送公告订阅消息 //获取改造方式, push 方法传入需要推送的用户ID集合【 将ID集合查询出用户集合, 只获取openId的用户,进行推送 】 - noticeService.sendNotice(notice); + noticeService.sendNotice(pushReqVO); return success(true); } - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeGroupController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeGroupController.java new file mode 100644 index 00000000..325b1db6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/NoticeGroupController.java @@ -0,0 +1,110 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupRespVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupUpdateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; +import cn.iocoder.yudao.module.system.convert.notice.NoticeGroupConvert; +import cn.iocoder.yudao.module.system.convert.user.UserConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeGroupDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.notice.NoticeGroupService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +@Tag(name = "管理后台 - 用户组") +@RestController +@RequestMapping("/system/notice/user-group") +@Validated +public class NoticeGroupController { + + @Resource + private NoticeGroupService userGroupService; + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + + @PostMapping("/create") + @Operation(summary = "创建用户组") + @PreAuthorize("@ss.hasPermission('system:notice-gropu:create')") + public CommonResult createUserGroup(@Valid @RequestBody NoticeGroupCreateReqVO createReqVO) { + return success(userGroupService.createUserGroup(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新用户组") + @PreAuthorize("@ss.hasPermission('system:notice-gropu:update')") + public CommonResult updateUserGroup(@Valid @RequestBody NoticeGroupUpdateReqVO updateReqVO) { + userGroupService.updateUserGroup(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户组") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:notice-gropu:delete')") + public CommonResult deleteUserGroup(@RequestParam("id") Long id) { + userGroupService.deleteUserGroup(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得用户组") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notice-gropu:query')") + public CommonResult getUserGroup(@RequestParam("id") Long id) { + + NoticeGroupDO userGroup = userGroupService.getUserGroup(id); + + //获得用户信息 + List userDOS = userService.getUserList(userGroup.getMemberUserIds()); + //获得部门信息 map + Map deptMap = deptService.getDeptMap(convertList(userDOS, AdminUserDO::getDeptId)); + + List userRespVOS = convertList(userDOS, user -> UserConvert.INSTANCE.convert(user, deptMap.get(user.getDeptId()))); + + NoticeGroupRespVO noticeGroupRespVO = NoticeGroupConvert.INSTANCE.convert(userGroup); + noticeGroupRespVO.setUserInfo(userRespVOS); + noticeGroupRespVO.setMemberDeptIds(deptMap.keySet()); + + return success(noticeGroupRespVO); + } + + @GetMapping("/page") + @Operation(summary = "获得用户组分页") + @PreAuthorize("@ss.hasPermission('system:notice-gropu:query')") + public CommonResult> getUserGroupPage(@Valid NoticeGroupPageReqVO pageVO) { + PageResult pageResult = userGroupService.getUserGroupPage(pageVO); + return success(NoticeGroupConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获取用户组精简信息列表", description = "只包含被开启的用户组,主要用于前端的下拉选项") + public CommonResult> getSimpleUserGroups() { + // 获用户门列表,只要开启状态的 + List list = userGroupService.getUserGroupListByStatus(CommonStatusEnum.ENABLE.getStatus()); + // 排序后,返回给前端 + return success(NoticeGroupConvert.INSTANCE.convertList2(list)); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePushReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePushReqVO.java new file mode 100644 index 00000000..f9320089 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/NoticePushReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Set; + +@Schema(description = "公告推送信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NoticePushReqVO { + + @Schema(description = "公告编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11") + private Long id; + + @Schema(description = "推送类型 | 0:全员 1:部门 2:用户组", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer type; + + @Schema(description = "推送部门编号") + private List deptIds; + + @Schema(description = "推送用户组编号") + private Set groupId; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupBaseVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupBaseVO.java new file mode 100644 index 00000000..5efc634a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupBaseVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice.vo.group; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Set; + +/** +* 用户组 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class NoticeGroupBaseVO { + + @Schema(description = "组名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + @NotNull(message = "组名不能为空") + private String name; + + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码") + @NotNull(message = "描述不能为空") + private String description; + + @Schema(description = "成员编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") + @NotNull(message = "成员编号数组不能为空") + private Set memberUserIds; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupCreateReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupCreateReqVO.java new file mode 100644 index 00000000..26140419 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice.vo.group; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 用户组创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NoticeGroupCreateReqVO extends NoticeGroupBaseVO { + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupPageReqVO.java new file mode 100644 index 00000000..3f20bf33 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupPageReqVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice.vo.group; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 用户组分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NoticeGroupPageReqVO extends PageParam { + + @Schema(description = "组名", example = "芋道") + private String name; + + @Schema(description = "状态", example = "1") + private Integer status; + + @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupRespVO.java new file mode 100644 index 00000000..6231bb15 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupRespVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice.vo.group; + +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Set; + +@Schema(description = "管理后台 - 用户组 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NoticeGroupRespVO extends NoticeGroupBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "成员部门编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[126][128]") + @NotNull(message = "成员部门编号数组不能为空") + private Set memberDeptIds; + + @Schema(description = "成员信息") + private List userInfo; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupUpdateReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupUpdateReqVO.java new file mode 100644 index 00000000..8a1e9e08 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notice/vo/group/NoticeGroupUpdateReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.system.controller.admin.notice.vo.group; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 用户组更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NoticeGroupUpdateReqVO extends NoticeGroupBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java index 2be40ca5..ab53efc6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java @@ -12,8 +12,8 @@ import java.util.Date; /** * 功能描述 * - * @author: yj - * @date: 2024年04月07日 19:44 + * @author yj + * date 2024年04月07日 19:44 */ @Mapper public interface NoticeConvert { @@ -27,14 +27,14 @@ public interface NoticeConvert { * @param miniProgramState 小程序的状态 * @return */ - default SubscribeMessageReqDTO convertCompanyNotice(String openId, NoticeDO notice, String nickname, String miniProgramState) { + default SubscribeMessageReqDTO convertCompanyNotice(String openId, NoticeDO notice, String noticeLabel, String nickname, String miniProgramState) { SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); message.setToUser(openId); message.setTemplateId("OF4-948Vz9rtE_VA55rmDxo4azOwmrjjk33jDpOiPiY"); //通知类型 MsgData noticeType = new MsgData(); noticeType.setName("thing1"); - noticeType.setValue(notice.getType()+""); //这里根据业务需求填写具体的公告类型 如全员公告, xxx公告 + noticeType.setValue(noticeLabel); //这里根据业务需求填写具体的公告类型 如全员公告, xxx公告 message.addData(noticeType); //公告标题 @@ -67,7 +67,7 @@ public interface NoticeConvert { message.addData(createTime); message.setMiniprogramState(miniProgramState); - message.setPage("pages/index"); + message.setPage("/subPages/notice/detail?id=" + notice.getId()); return message; } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeGroupConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeGroupConvert.java new file mode 100644 index 00000000..ab5249b6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeGroupConvert.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.system.convert.notice; + + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupRespVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeGroupDO; +import org.mapstruct.Mapper; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 用户组 Convert + * + + */ +@Mapper +public interface NoticeGroupConvert { + + NoticeGroupConvert INSTANCE = Mappers.getMapper(NoticeGroupConvert.class); + + NoticeGroupDO convert(NoticeGroupCreateReqVO bean); + + NoticeGroupDO convert(NoticeGroupUpdateReqVO bean); + + NoticeGroupRespVO convert(NoticeGroupDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + @Named("convertList2") + List convertList2(List list); + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/NoticeGroupDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/NoticeGroupDO.java new file mode 100644 index 00000000..c285f194 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/notice/NoticeGroupDO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.notice; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Set; + +/** + * 公告推送 用户组 + */ +@TableName(value = "system_notice_group", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NoticeGroupDO extends BaseDO { + + /** + * 编号,自增 + */ + @TableId + private Long id; + /** + * 组名 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 成员用户编号数组 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set memberUserIds; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/NoticeGroupMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/NoticeGroupMapper.java new file mode 100644 index 00000000..0d9ad145 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notice/NoticeGroupMapper.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.dal.mysql.notice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeGroupDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 公告推送用户组 Mapper + */ +@Mapper +public interface NoticeGroupMapper extends BaseMapperX { + + default PageResult selectPage(NoticeGroupPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(NoticeGroupDO::getName, reqVO.getName()) + .eqIfPresent(NoticeGroupDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(NoticeGroupDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(NoticeGroupDO::getId)); + } + + default List selectListByStatus(Integer status) { + return selectList(NoticeGroupDO::getStatus, status); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupService.java new file mode 100644 index 00000000..6ab3713d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupService.java @@ -0,0 +1,84 @@ +package cn.iocoder.yudao.module.system.service.notice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupUpdateReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeGroupDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 用户组 Service 接口 + * + + */ +public interface NoticeGroupService { + + /** + * 创建用户组 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserGroup(@Valid NoticeGroupCreateReqVO createReqVO); + + /** + * 更新用户组 + * + * @param updateReqVO 更新信息 + */ + void updateUserGroup(@Valid NoticeGroupUpdateReqVO updateReqVO); + + /** + * 删除用户组 + * + * @param id 编号 + */ + void deleteUserGroup(Long id); + + /** + * 获得用户组 + * + * @param id 编号 + * @return 用户组 + */ + NoticeGroupDO getUserGroup(Long id); + + /** + * 获得用户组列表 + * + * @param ids 编号 + * @return 用户组列表 + */ + List getUserGroupList(Collection ids); + + /** + * 获得指定状态的用户组列表 + * + * @param status 状态 + * @return 用户组列表 + */ + List getUserGroupListByStatus(Integer status); + + /** + * 获得用户组分页 + * + * @param pageReqVO 分页查询 + * @return 用户组分页 + */ + PageResult getUserGroupPage(NoticeGroupPageReqVO pageReqVO); + + /** + * 校验用户组们是否有效。如下情况,视为无效: + * 1. 用户组编号不存在 + * 2. 用户组被禁用 + * + * @param ids 用户组编号数组 + */ + void validUserGroups(Set ids); + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupServiceImpl.java new file mode 100644 index 00000000..1d06282a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeGroupServiceImpl.java @@ -0,0 +1,112 @@ +package cn.iocoder.yudao.module.system.service.notice; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupCreateReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.group.NoticeGroupUpdateReqVO; +import cn.iocoder.yudao.module.system.convert.notice.NoticeGroupConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeGroupDO; +import cn.iocoder.yudao.module.system.dal.mysql.notice.NoticeGroupMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_GROUP_IS_DISABLE; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; + + +/** + * 用户组 Service 实现类 + * + + */ +@Service +@Validated +public class NoticeGroupServiceImpl implements NoticeGroupService { + + @Resource + private NoticeGroupMapper userGroupMapper; + + @Override + public Long createUserGroup(NoticeGroupCreateReqVO createReqVO) { + // 插入 + NoticeGroupDO userGroup = NoticeGroupConvert.INSTANCE.convert(createReqVO); + userGroupMapper.insert(userGroup); + // 返回 + return userGroup.getId(); + } + + @Override + public void updateUserGroup(NoticeGroupUpdateReqVO updateReqVO) { + // 校验存在 + this.validateUserGroupExists(updateReqVO.getId()); + // 更新 + NoticeGroupDO updateObj = NoticeGroupConvert.INSTANCE.convert(updateReqVO); + userGroupMapper.updateById(updateObj); + } + + @Override + public void deleteUserGroup(Long id) { + // 校验存在 + this.validateUserGroupExists(id); + // 删除 + userGroupMapper.deleteById(id); + } + + private void validateUserGroupExists(Long id) { + if (userGroupMapper.selectById(id) == null) { + throw exception(USER_GROUP_NOT_EXISTS); + } + } + + @Override + public NoticeGroupDO getUserGroup(Long id) { + return userGroupMapper.selectById(id); + } + + @Override + public List getUserGroupList(Collection ids) { + return userGroupMapper.selectBatchIds(ids); + } + + + @Override + public List getUserGroupListByStatus(Integer status) { + return userGroupMapper.selectListByStatus(status); + } + + @Override + public PageResult getUserGroupPage(NoticeGroupPageReqVO pageReqVO) { + return userGroupMapper.selectPage(pageReqVO); + } + + @Override + public void validUserGroups(Set ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得用户组信息 + List userGroups = userGroupMapper.selectBatchIds(ids); + Map userGroupMap = CollectionUtils.convertMap(userGroups, NoticeGroupDO::getId); + // 校验 + ids.forEach(id -> { + NoticeGroupDO userGroup = userGroupMap.get(id); + if (userGroup == null) { + throw exception(USER_GROUP_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { + throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); + } + }); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeService.java index c714098f..1894f715 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeService.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.notice; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePushReqVO; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; @@ -50,7 +51,7 @@ public interface NoticeService { /** * 小程序发送公告订阅消息 - * @param notice + * @param pushReqVO 推送信息 */ - void sendNotice(NoticeDO notice) ; + void sendNotice(NoticePushReqVO pushReqVO) ; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java index a05d609f..94bf3885 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notice/NoticeServiceImpl.java @@ -7,18 +7,24 @@ import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticePushReqVO; import cn.iocoder.yudao.module.system.controller.admin.notice.vo.NoticeSaveReqVO; import cn.iocoder.yudao.module.system.convert.notice.NoticeConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeGroupDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.notice.NoticeMapper; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.google.common.annotations.VisibleForTesting; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; @@ -35,9 +41,15 @@ public class NoticeServiceImpl implements NoticeService { @Resource private NoticeMapper noticeMapper; + @Resource + private NoticeGroupService noticeGroupService; + @Resource(name = NOTIFY_THREAD_POOL_TASK_EXECUTOR) private ThreadPoolTaskExecutor threadPoolTaskExecutor; + @Resource + private DictDataService dictDataService; + @Override public Long createNotice(NoticeSaveReqVO createReqVO) { NoticeDO notice = BeanUtils.toBean(createReqVO, NoticeDO.class); @@ -90,25 +102,55 @@ public class NoticeServiceImpl implements NoticeService { private SubscribeMessageSendApi subscribeMessageSendApi; @Override - public void sendNotice(NoticeDO notice) { + public void sendNotice(NoticePushReqVO pushReqVO) { + + //获得公告信息 + NoticeDO notice = getNotice(pushReqVO.getId()); + if (notice == null) { + throw exception(NOTICE_NOT_FOUND); + } + + // 获得公告类型 字典label + DictDataDO dictDataDO = dictDataService.getDictData("system_notice_type", String.valueOf(notice.getType())); + //获取当前登陆用户的名称 LoginUser user = SecurityFrameworkUtils.getLoginUser() ; AdminUserDO currentUser = userService.getUser(user.getId()) ; - //查询所有状态是开启的用户 - List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); - for(AdminUserDO adminUserDO : list) { + List userDOs = new ArrayList<>(); + switch (pushReqVO.getType()) { + + //全员推送 + case 0: + //获得用户信息 + userDOs = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); + break; + //部门推送 + case 1: + //获得用户信息 + userDOs = userService.getUserListByDeptIds(pushReqVO.getDeptIds()); + break; + //用户组推送 + case 2: + //获得用户组信息 + List groupDOs = noticeGroupService.getUserGroupList(pushReqVO.getGroupId()); + + //获得用户组中 用户信息 + userDOs = userService.getUserList(groupDOs.stream().flatMap(group -> group.getMemberUserIds().stream()).collect(Collectors.toSet())); + break; + } + + for(AdminUserDO adminUserDO : userDOs) { if( adminUserDO.getOpenId() != null && !adminUserDO.getOpenId().isEmpty()) { -// System.out.println("====" + adminUserDO.getNickname()); threadPoolTaskExecutor.execute(() -> { //获取openId有值的用户 subscribeMessageSendApi.sendCompanyNotice(NoticeConvert.INSTANCE.convertCompanyNotice( - adminUserDO.getOpenId(), notice , currentUser.getNickname(), + adminUserDO.getOpenId(), notice, dictDataDO.getLabel(), currentUser.getNickname(), "formal")); }); } } } -} +} \ No newline at end of file