diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/string/StrUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/string/StrUtils.java index 011aec48..6843da84 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/string/StrUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/string/StrUtils.java @@ -74,9 +74,12 @@ public class StrUtils { */ public static IdCardDO IdCardAnalysis(String idCard) { - IdCardDO idCardDO = new IdCardDO(); + if (idCard == null || idCard.isEmpty()) { + return idCardDO; + } + //通过身份证号码 获得出生日期 LocalDate date = LocalDate.parse(idCard.substring(6,14), DateTimeFormatter.ofPattern("yyyyMMdd")); //通过身份证号码 获得性别 diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java index 0509fb8b..75c1fe33 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApi.java @@ -22,4 +22,8 @@ public interface SubscribeMessageSendApi { @PostMapping(PREFIX + "/send-process-todo-reminder") @Operation(summary = "发送OA流程待办提醒") CommonResult sendProcessToDoReminder(@RequestBody SubscribeMessageReqDTO reqDTO); + + @PostMapping(PREFIX + "/send-company-notice") + @Operation(summary = "发送公司公告通知") + CommonResult sendCompanyNotice(@RequestBody SubscribeMessageReqDTO reqDTO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java index 91ec0ae4..950d5793 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/subscribe/SubscribeMessageSendApiImpl.java @@ -41,6 +41,13 @@ public class SubscribeMessageSendApiImpl implements SubscribeMessageSendApi { return success(1L); } + @SneakyThrows + @Override + public CommonResult sendCompanyNotice(SubscribeMessageReqDTO reqDTO) { + socialClientService.getWxMaService().getMsgService().sendSubscribeMsg(initWxMaSubscribeMessage(reqDTO)); + return success(1L); + } + private WxMaSubscribeMessage initWxMaSubscribeMessage(SubscribeMessageReqDTO reqDTO) { WxMaSubscribeMessage message = WxMaSubscribeMessage.builder() .toUser(reqDTO.getToUser()) 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 138f2d9a..33821c69 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 @@ -85,7 +85,10 @@ public class NoticeController { NoticeDO notice = noticeService.getNotice(id); Assert.notNull(notice, "公告不能为空"); // 通过 websocket 推送给在线的用户 - webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), "notice-push", notice); + //webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), "notice-push", notice); + //小程序发送公告订阅消息 + //获取改造方式, push 方法传入需要推送的用户ID集合【 将ID集合查询出用户集合, 只获取openId的用户,进行推送 】 + noticeService.sendNotice(notice); return success(true); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 6c5c9b09..0824c3f2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -183,7 +183,7 @@ public class UserController { postDO.sort(Comparator.comparing(PostDO::getSort)); // 输出 - ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, null, getDeptNameFun(deptDO), getPostNameFun(postDO)); + ExcelUtils.write(response, "用户导入模板.xlsx", "用户列表", UserImportExcelVO.class, null, getDeptNameFun(deptDO), getPostNameFun(postDO)); } @PostMapping("/import") 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 new file mode 100644 index 00000000..a4bfe192 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/notice/NoticeConvert.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.system.convert.notice; + +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; +import cn.iocoder.yudao.module.system.api.subscribe.dto.MsgData; +import cn.iocoder.yudao.module.system.api.subscribe.dto.SubscribeMessageReqDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.Date; +import java.util.Map; + +/** + * 功能描述 + * + * @author: yj + * @date: 2024年04月07日 19:44 + */ +@Mapper +public interface NoticeConvert { + + NoticeConvert INSTANCE = Mappers.getMapper(NoticeConvert.class); + + /** + * @param openId 微信小程序唯一id + * @param notice 公告对象 + * @param nickname 发布人姓名 + * @param miniProgramState 小程序的状态 + * @return + */ + default SubscribeMessageReqDTO convertCompanyNotice(String openId, NoticeDO notice, 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公告 + message.addData(noticeType); + + //公告标题 + MsgData title = new MsgData(); + title.setName("thing6"); + title.setValue(notice.getTitle()); + message.addData(title); + + //通知内容 + MsgData content = new MsgData(); + content.setName("thing2"); + content.setValue("具体内容请进入小程序查看"); + message.addData(content); + + //发布人 + MsgData publishMan = new MsgData(); + publishMan.setName("thing9"); + publishMan.setValue(nickname); + message.addData(publishMan); + + //通知时间 + MsgData createTime = new MsgData(); + createTime.setName("time3"); + createTime.setValue(DateUtils.dateFormat(new Date(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + message.addData(createTime); + + message.setMiniprogramState(miniProgramState); + message.setPage("pages/index"); + return message; + } +} 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 c935c49b..c714098f 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 @@ -48,4 +48,9 @@ public interface NoticeService { */ NoticeDO getNotice(Long id); + /** + * 小程序发送公告订阅消息 + * @param notice + */ + void sendNotice(NoticeDO notice) ; } 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 9b2ed587..d0617473 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 @@ -1,16 +1,25 @@ package cn.iocoder.yudao.module.system.service.notice; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +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.NoticeSaveReqVO; +import cn.iocoder.yudao.module.system.convert.notice.NoticeConvert; import cn.iocoder.yudao.module.system.dal.dataobject.notice.NoticeDO; +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.user.AdminUserService; import com.google.common.annotations.VisibleForTesting; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; @@ -70,4 +79,27 @@ public class NoticeServiceImpl implements NoticeService { } } + /** 添加小程序发送公告通知 add by yj 2024-04-07*/ + @Resource + private AdminUserService userService; + @Resource + private SubscribeMessageSendApi subscribeMessageSendApi; + + public void sendNotice(NoticeDO notice) { + //获取当前登陆用户的名称 + LoginUser user = SecurityFrameworkUtils.getLoginUser() ; + AdminUserDO currentUser = userService.getUser(user.getId()) ; + + //查询所有状态是开启的用户 + List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); + for(AdminUserDO adminUserDO : list) { + if( adminUserDO.getOpenId() != null && !adminUserDO.getOpenId().equals("") ) { + System.out.println("====" + adminUserDO.getNickname()); + //获取openId有值的用户 + subscribeMessageSendApi.sendCompanyNotice(NoticeConvert.INSTANCE.convertCompanyNotice( + adminUserDO.getOpenId(), notice , currentUser.getNickname(), + "formal")); + } + } + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 7e90180c..cdbc4a26 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -13,7 +13,6 @@ import cn.iocoder.yudao.framework.common.util.string.DTO.IdCardDO; import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.module.infra.api.file.FileApi; -import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO; @@ -21,7 +20,6 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRe import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; -import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper; @@ -424,8 +422,9 @@ public class AdminUserServiceImpl implements AdminUserService { importUsers.forEach(importUser -> { //校验,判断是否有不符合的原因 try { - validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), null, null); - + if (!isUpdateSupport) { + validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), null, null); + } } catch (ServiceException ex) { respVO.getFailureUsernames().put(importUser.getNickname(), ex.getMessage()); return;