java定时+发送通知服务接口

我做的是每天早上八点,查询数据库过期的任务,然后在页面内向用户发送通知(类似钉钉的企业办公软件)
两个表:
1.通知目标表。
在这里插入图片描述
2.消息通知表
在这里插入图片描述
数据库通知模板
在这里插入图片描述

1.Controller类

import org.springframework.scheduling.annotation.Scheduled;
    //过期任务通知:每天早上八点定时发送
//    @RequestMapping(value = "/pushWorkNotification", method = RequestMethod.POST)--测试用
    @Scheduled(cron = "0 0 8 * * ?")
    public void pushWorkNotification(){
        this.service.pushWorkNotification();
    }

2.service类

 public void pushWorkNotification() {
        //先查询要过期的工作任务,以及去掉已经发送过的任务,然后遍历发送通知

        ArrayList<WorkTaskEntity> a = service.workTaskMybatisDao.findPushWorkNotificationList();
        //存发送目标的id
        ArrayList<MessageAimEntity> sendEmpIds = new ArrayList<>();
        for (WorkTaskEntity b : a) {
            List<Integer> workMembers = service.workTaskMybatisDao.findWorkMembers(b.getId());
            b.setMemberId(workMembers);
            List<Integer> prjMembers = service.workTaskMybatisDao.findPrjMembers(b.getSourceProjectId());
            b.setPrjSourceEmp(prjMembers);
            List<Integer> prjMembers1 = service.workTaskMybatisDao.findPrjMembers(b.getTargetProjectId());
            b.setPrjTargetEmp(prjMembers1);
        }


        for (WorkTaskEntity b : a) {
            if (b.getCreateEmpId() != null) {
                MessageAimEntity messageAimEntity = new MessageAimEntity();
                messageAimEntity.setEmpId(b.getCreateEmpId());
                messageAimEntity.setTitle(b.getTitle());
                messageAimEntity.setWorkId(b.getId());
                sendEmpIds.add(messageAimEntity);
            }

            if (b.getPrjSourceCreateEmp() != null) {
                MessageAimEntity messageAimEntity = new MessageAimEntity();
                messageAimEntity.setEmpId(b.getPrjSourceCreateEmp());
                messageAimEntity.setTitle(b.getTitle());
                messageAimEntity.setWorkId(b.getId());
                sendEmpIds.add(messageAimEntity);
            }
            if (b.getPrjTargetCreateEmp() != null) {
                MessageAimEntity messageAimEntity = new MessageAimEntity();
                messageAimEntity.setEmpId(b.getPrjTargetCreateEmp());
                messageAimEntity.setTitle(b.getTitle());
                messageAimEntity.setWorkId(b.getId());
                sendEmpIds.add(messageAimEntity);
            }

            if (b.getMemberId().size() != 0) {
                for (int i = 0; i < b.getMemberId().size(); i++) {
                    MessageAimEntity messageAimEntity = new MessageAimEntity();
                    messageAimEntity.setEmpId(b.getMemberId().get(i));
                    messageAimEntity.setTitle(b.getTitle());
                    messageAimEntity.setWorkId(b.getId());
                    sendEmpIds.add(messageAimEntity);
                }

            }
            if (b.getPrjSourceEmp().size() != 0) {
                for (int i = 0; i < b.getPrjSourceEmp().size(); i++) {
                    MessageAimEntity messageAimEntity = new MessageAimEntity();
                    messageAimEntity.setEmpId(b.getPrjSourceEmp().get(i));
                    messageAimEntity.setTitle(b.getTitle());
                    messageAimEntity.setWorkId(b.getId());
                    sendEmpIds.add(messageAimEntity);
                }
            }
            if (b.getPrjTargetEmp().size() != 0) {
                for (int i = 0; i < b.getPrjTargetEmp().size(); i++) {
                    MessageAimEntity messageAimEntity = new MessageAimEntity();
                    messageAimEntity.setEmpId(b.getPrjTargetEmp().get(i));
                    messageAimEntity.setTitle(b.getTitle());
                    messageAimEntity.setWorkId(b.getId());
                    sendEmpIds.add(messageAimEntity);
                }

            }
        }
        System.out.println();
        for (MessageAimEntity c :
                sendEmpIds) {
            HashMap<String, Object> map = new HashMap<>();
            ArrayList<MessageAimEntity> messageAimEntities = new ArrayList<>();
            messageAimEntities.add(c);
            map.put("title", c.getTitle());
            map.put("id", c.getWorkId());

            //自动通知
            PushTemplateService.pushAutoMessage(service, JSON.parseObject(JSON.toJSONString(map), HashMap.class),
                    "任务过期", null, null, messageAimEntities);
        }

    }

3.自定义通知工具类

/**
     * 发送自动通知
     *
     * @param service    数据持久层
     * @param map        发送内容
     * @param type       模板类型
     * @param empId      发送人
     * @param depId      发送部门或公司
     * @param sendEmpIds 发送目标
     */
    public static void pushAutoMessage(ServiceDao service, HashMap<String, Object> map, String type, Integer empId,
                                       Integer depId, ArrayList<MessageAimEntity> sendEmpIds) {
        LoggerUtils.infoData("/pushMessage", type);
        var pushTemplateEntity = service.pushTemplateJpaDao.findFirstByTitle(type);
        if (pushTemplateEntity != null) {
            var time = new Timestamp(System.currentTimeMillis());
            LoggerUtils.infoData("发送通知:", type);
            //生成内容
            var p = compile("\\$\\{(.*?)\\}");
            var content = pushTemplateEntity.getTemplate();
            var m = p.matcher(content);
            while (m.find()) {
                content = content.replace("${" + m.group(1) + "}", map.get(m.group(1)) + "");
            }
            var messagesEntity = new MessagesEntity();
            messagesEntity.setTitle(type + "通知");
            messagesEntity.setContent(content);
            messagesEntity.setSendEmpId(empId);
            messagesEntity.setSendDepId(depId);
            messagesEntity.setSendTime(time);
            messagesEntity.setCategory("系统通知");
            messagesEntity.setPriority(1L);
            messagesEntity.setApproveState("已审核");
            if(map.containsKey("id")){
                messagesEntity.setRelateId(Long.parseLong(map.get("id").toString()));
                messagesEntity.setRelateType(type);
                messagesEntity.setRelateTitle(map.get("title") + "");
            }
            messagesEntity = service.messageJpaDao.save(messagesEntity);
            for (var e : sendEmpIds) {
                e.setMsgId(messagesEntity.getId());
            }
            service.messageAimJapDao.saveAll(sendEmpIds);
        }
    }

效果
在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Guns-Separation是Guns后台管理系统的前后端分离版本,项目采用前后端分离架构,代码简洁,功能丰富,开箱即用,开创快速开发平台新趋势。 Guns-Separation功能介绍: 1、主控面板:控制台页面,可进行工作台,分析页,统计等功能的展示。 2、用户管理:对企业用户和系统管理员用户的维护,可绑定用户职务,机构,角色,数据权限等。 3、应用管理:通过应用来控制不同维度的菜单展示。 4、机构管理:公司组织架构维护,支持多层级结构的树形结构。 5、职位管理:用户职务管理,职务可作为用户的一个标签,职务目前没有和权限等其他功能挂钩。 6、菜单管理:菜单目录,菜单,和按钮的维护是权限控制的基本单位。 7、角色管理:角色绑定菜单后,可限制相关角色的人员登录系统的功能范围。角色也可以绑定数据授权范围。 8、字典管理:系统内各种枚举类型的维护。 9、访问日志:用户的登录和退出日志的查看和管理。 10、操作日志:用户的操作业务的日志的查看和管理。 11、服务监控:服务器的运行状态,Java虚拟机信息,jvm等数据的查看。 12、在线用户:当前系统在线用户的查看。 13、数据监控:druid控制台功能,可查看sql的运行信息。 14、公告管理:系统的公告的管理。 15、文件管理:文件的上传下载查看等操作,文件可使用本地存储,阿里云oss,腾讯cos接入,支持拓展。 16、定时任务:定时任务的维护,通过cron表达式控制任务的执行频率。 17、系统配置:系统运行的参数的维护,参数的配置与系统运行机制息息相关。 18、邮件发送发送邮件功能。 19、短信发送:短信发送功能,可使用阿里云sms,腾讯云sms,支持拓展。 Guns-Separation快速开始 准备以下环境: 1、npm,jdk1.8,maven 3.6或以上版本。 2、需要准备一个mysql 5.7数据库。 3、您的IDE需要安装lombok插件。 前端运行: 1、cd _web/ 2、npm install 3、npm run serve 后端运行: 1、将数据库文件_sql/guns-separation.sql导入到数据库 2、修改guns-main/src/main/resources/application-local.yml文件,修改为您的数据库ip,账号和密码 3、运行guns-main/src/main/java/cn/stylefeng/guns/GunsApplication类,即可启动后端程序 框架优势: 1、模块化架构设计,层次清晰,业务层推荐写到单独模块,方便升级。 2、前后端分离架构,分离开发,分离部署,前后端互不影响。 3、前端技术采用vue + antdv + axios。 4、后端采用spring boot + mybatis-plus + hutool等,开源可靠。 5、基于spring security(jwt) + 用户UUID双重认证。 6、基于AOP实现的接口粒度的鉴权,最细粒度过滤权限资源。 7、基于hibernate validator实现的校验框架,支持自定义校验注解。 8、提供Request-No的响应header快速定位线上异常问题。 9、在线用户可查,可在线踢人,同账号登录可同时在线,可单独在线(通过系统参数配置)。 10、支持前端 + 后端在线代码生成(后续开放)。 11、支持jenkins一键部署,另自带docker maven插件,支持docker部署。 12、文件,短信,缓存,邮件等,利用接口封装,方便拓展。 13、文件默认使用本地文件,短信默认使用阿里云sms,缓存默认使用内存缓存。 14、文档齐全,持续更新,视频教程将发布到Bilibili(后续开放)。 演示账号密码:superAdmin/123456 Guns-Separation v1.1更新内容: 1、增加上传图片的预览功能 2、完善数据范围分配时候的判断逻辑 3、授权数据取消父级子级关联 4、【前端】工作台界面使用静态数据、环境显示抽屉默认设置为全显示 5、统一日志打印格式 6、修复邮件发送异常的问题 7、修复菜单遍历没有修改子应用的问题 8、默认去掉oss,cos,短信的依赖包,减少了默认打包体积 9、【pr合并】修改密码加密方式为bcrypt 10、修复定位bug
# Goku.Web## 技术栈 - 后端采用Spring Boot、Spring Security、Redis & Jwt。 - 权限认证使用Jwt,支持多终端认证系统。 - 支持加载动态权限菜单,多方式轻松权限控制。 - 高效率开发,使用代码生成器可以一键生成前后端代码。 ## 功能 - 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 - 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 - 岗位管理:配置系统用户所属担任职务。 - 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 - 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 - 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 - 参数管理:对系统动态配置常用参数。 - 通知公告:系统通知公告信息发布维护。 - 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 - 登录日志:系统登录日志记录查询包含登录异常。 - 在线用户:当前系统中活跃用户状态监控。 - 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 - 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 - 系统接口:根据业务代码自动生成相关的api接口文档。 - 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 - 缓存监控:对系统的缓存信息查询,命令统计等。 - 在线构建器:拖动表单元素生成相应的HTML代码。 - 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值