【JAVA】定时任务之借阅到期自动催还

news2024/12/24 2:07:01

该篇主要以定时任务为主,通知略为记录

一. 定时任务逻辑代码

  1. 定时任务文件
    在这里插入图片描述
  2. TaskScheduling.java
package org.springblade.modules.task;

import lombok.extern.slf4j.Slf4j;
import org.springblade.modules.archiveAdvantage.service.IArchiveBorrowService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@EnableAsync
@Slf4j
public class TaskScheduling {

    @Autowired
    private IArchiveBorrowService borrowService;

    /**
     * 档案借阅自动催还处理,每天凌晨1点执行一次
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public synchronized void automaticReminder(){
        log.info(new Date() + "...>>cron....档案借阅自动催还处理");
        borrowService.automaticReminderNotice();
        log.info(new Date() + "...>>cron....档案借阅自动催还处理...完成!!!");
    }
}

  1. ArchiveBorrowService.java
void automaticReminderNotice();
  1. ArchiveBorrowServiceImpl.java
    (1)方法一
// 引入通知
import org.springblade.common.utils.NoticeUtil;

@Service
public class ArchiveBorrowServiceImpl extends BaseServiceImpl<ArchiveBorrowMapper, ArchiveBorrowEntity> implements IArchiveBorrowService {
	private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	@Override
	public void automaticReminderNotice() {
		try{
			// 查询已借阅未归还的实体档案
			LambdaQueryWrapper<ArchiveBorrowEntity> wrapper = new LambdaQueryWrapper<>();
			wrapper.eq(ArchiveBorrowEntity::getBorrowType, "0").eq(ArchiveBorrowEntity::getBorrowState, "23");
			List<ArchiveBorrowEntity> archiveBorrowList = this.list(wrapper);
			if(archiveBorrowList.size() > 0 ){
				for(ArchiveBorrowEntity archiveBorrow:archiveBorrowList){
					// 计算归还日期:借阅时间 + 借阅天数
					Calendar calenDar = Calendar.getInstance();
					calenDar.setTime(archiveBorrow.getBorrowTime());
					calenDar.add(calenDar.DATE,archiveBorrow.getBorrowDays());
					// 间隔差:归还时间-当前时间
					Calendar cal = Calendar.getInstance();
                    cal.setTime(returnDateFomat.parse(sdf.format(new Date())));
					long currentTime = cal.getTimeInMillis();
					cal.setTime(returnDateFomat.parse(sdf.format(calenDar.getTime())));
					long returnTime = cal.getTimeInMillis();
					long days = (returnTime - currentTime) / (1000 * 3600 * 24);
					int endDays = Integer.parseInt(String.valueOf(days));
					// 到期归还通知提醒
					if(endDays == 1){
						NoticeUtil.NoticeReturnMsg(archiveBorrow.getBorrowerUser(),"借阅待归还提醒","您于" + sdf.format(new Date()) + "接收到来自管理员的催还通知,请尽快到[我的借阅]画面确认。",1);
					}
				}
			}
		} catch (Exception e){
			e.printStackTrace();
			System.out.println("档案借阅催还失败");
		}
	}
}

(2)方法二

	@Override
	public R automaticReminderNotice() {
		// 查询已借阅未归还的档案
		LambdaQueryWrapper<ArchiveBorrowEntity> wrapper = new LambdaQueryWrapper<>();
		// 0 代表实体档案
		wrapper.eq(ArchiveBorrowEntity::getBorrowType, "0").eq(ArchiveBorrowEntity::getBorrowState, "23");
		List<ArchiveBorrowEntity> archiveBorrowList = this.list(wrapper);
		if(archiveBorrowList.size() > 0 ){
			for(ArchiveBorrowEntity archiveBorrow:archiveBorrowList){
				// 计算归还日期(1)获取借阅时间并转为毫秒数(2)将借阅天数转为毫秒数(3)归还时间 = 系统时间 + 借阅天数
				long borrowTime = archiveBorrow.getBorrowTime().getTime();
				int borrowDays = archiveBorrow.getBorrowDays() * 24 * 60 * 60 * 1000;
				// String returnTime = sdf.format(borrowTime + borrowDays);
				long returnTime = borrowTime + borrowDays;
				// 归还时间和当前时间相隔的天数(1)获取当前时间(2)当前时间和归还时间像个天数
				long currentTime = new Date().getTime();
				long compare = (currentTime - returnTime) / (24 * 60 * 60 * 1000);
				if(compare == 7){
					// 给用户发通知
					NoticeUtil.notifyMsg(archiveBorrow.getBorrowerUser(),"档案借阅催还提醒","请尽快归还档案",1);
				}
			}
		}
	}

二. 参考资料

在这里插入图片描述

三. 站内通知(简单了解)

  1. NoticeUtil.java
  public static void NoticeReturnMsg(Long userId, String title, String content,Integer type) {
        try {
            IMessageService messageClient = SpringUtil.getBean("messageService");
            MessageParams message = MessageParams.builder().title(title)
                    .content(content)
                    .receiveUser((userId))
                    .type(type)
                    .build();

            messageClient.sendMessage(message);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("通知发送失败:" + title);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch基本使用—激活函数

✨1 介绍 ⛄ 1.1 概念 激活函数是神经网络中的一种数学函数&#xff0c;它被应用于神经元的输出&#xff0c;以决定神经元是否应该被激活并传递信号给下一层。常见的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等。 &#x1f384; 1.2 性质 激活函数是神经网络中的一种重…

Markdown基本用法

目录 1 字体倾斜 1.1 加* 1.2 加_ 2 字体加粗 2.1 加** 2.2 加__ 3 字体上带删除线 4 文字变标题 5 超链接 5.1 直接输入地址 5.2 将超链接改成文字 5.2.1 同行写法 5.2.2 不同行写法 6 文字前加 6.1 号 6.2 *号 6.3 -号 7 有序列表 8 …

【微信小程序创作之路】- 小程序常用页面样式

【微信小程序创作之路】- 小程序常用页面样式 第四章 微信小程序用页面样式 文章目录 【微信小程序创作之路】- 小程序常用页面样式前言一、总体样式--全局样式and局部样式1.全局样式2.局部样式 二、Flex布局&#x1f349;&#x1f349;&#x1f349;rpx单位 三、样式导入四、…

HEGERLS四向穿梭车的调度算法如何解决同层多车时车辆路径规划和避让的问题?

纵观全球&#xff0c;消费需求正在发生转变&#xff0c;无论是个体消费还是企业消费&#xff0c;呈现出个性化、定制化、网络化的趋势。因此生产企业面临着产品多样化、订单碎片化、服务定制化的新挑战&#xff0c;仓储密集存储、超大拆零作业量需求愈加明显&#xff0c;且竞争…

苹果平板用不用买原装笔?ipad平替电容笔排行榜

我们应该都知道&#xff0c;第一款ipad早诞生于十年前&#xff0c;如今已是家喻户晓的平板电脑产品。ipad版本系列的更新非常迅速&#xff0c;销售也非常火爆。其中&#xff0c;iPad的配件起到了很大的作用&#xff0c;比如我们今天要介绍的这款电容笔&#xff0c;这款ipad的配…

vue3+ts中常用的两个按钮选择事件写法

1. 效果演示 2.vue3单页面代码演示 <template><div class"btns"><divv-for"(item, index) in nams"click"btnCol(index)":class"current index ? active : btn">{{ item }}</div></div><div clas…

【MySQL】从零开始的JDBC编程

1、JDBC的认识 学了这么久的 MySQL&#xff0c;我们一直采用的都是 MySQL 软件自带的客户端&#xff08;黑框框&#xff09;&#xff0c;来进行跟MySQL服务器进行交互。但是在实际开发中我们很少在黑框框中手动输入SQL&#xff0c;大多数都是通过代码自动执行SQL的。既然大多数…

单片机第一季:零基础4——LED点阵

1&#xff0c;第八章-LED点阵 如何驱动LED点阵&#xff1a; (1)单片机端口直接驱动。要驱动8*8的点阵需要2个IO端口&#xff08;16个IO口&#xff09;、要驱动16*16的点阵需要4个IO端口&#xff08;32个IO口&#xff09;。 (2)使用串转并移位锁存器驱动。要驱动16*16点阵只需要…

7.3Java EE——Bean的实例化

一、构造方法实例化 下面通过一个案例演示Spring容器如何通过构造方法实例化Bean。 &#xff08;1&#xff09;、在IDEA中创建一个名为chapter07的Maven项目&#xff0c;然后在项目的pom.xml文件中配置需使用到的Spring四个基础包和Spring的依赖包。 <dependencies>&…

让白嫖来的阿里云服务器来跑jupyter

文章目录 概要第一步 注册账号并创建实例第二步 连接实例并安装相关软件和依赖包安装python3更新pip安装jupyter生成jupyter配置文件配置之后访问云服务器jupyter的密码修改jupyter配置文件在后台启动jupyter 第三步 访问云服务器上的jupyter结语 概要 按照一般情况&#xff0…

【云原生|Docker系列第2篇】Docker的安装和配置

欢迎来到Docker入门系列的第二篇博客&#xff01;在上一篇博客中&#xff0c;我们已经介绍了Docker的基本概念和作用&#xff0c;以及为什么它成为现代应用开发和部署的关键技术。本篇博客将着重讨论Docker的安装和配置&#xff0c;帮助您开始使用Docker并为您的应用程序提供一…

对于加密数据(数据库字段级别加密)存储和并搜索的一些调查

一、简述 如果您认为不良行为者不可避免地会进入您的网络&#xff0c;那么在将敏感数据放入数据库或文档存储之前对其进行加密是保护数据的最佳方法。对于敏感数据应该这么做。这种在存储之前进行加密的方法称为应用层加密&#xff0c;有相当数量的公司使用它来保护其敏感数据。…

MATLAB 迭代最近点ICP配准 (23)

MATLAB 迭代最近点ICP配准 (23) 一、算法介绍二、具体代码1.流程2.代码3.函数详解4.结果展示一、算法介绍 ICP 迭代最近点配准方法,基本是一种固定的点云精配准方法,其变种很多,这里是点到点的传统点云ICP配准方法,具体的过程如上图所示:需要提供红色和蓝色两组点云,其…

echarts 字符串模板和formatter的使用(鼠标悬浮显示的气泡自定义)

需求&#xff1a;在鼠标悬浮中加一个总数字段&#xff0c;图1为默认&#xff0c;图2为需要实现的效果 有两种方式&#xff0c;第一种&#xff1a;在图表添加一条新的图形&#xff0c;默认会自动添加 需要在整个数据列表中计算出来成为新的数组 methods: {// 根据自己的业务情…

SpringBoot源码分析(4)--Environment(下)/配置文件加载原理

SpringBoot源码分析 SpringBoot源码分析(1)–SpringBootApplication注解使用和原理/SpringBoot的自动配置原理详解SpringBoot源码分析(2)–SpringBoot启动源码(万字图文源码debug讲解springboot启动原理)SpringBoot源码分析(3)–Environment简介/prepareEnvironment准备环境&a…

UNet训练自己的数据集

pycharm中python环境设置&#xff1a; 打开左上角File ---> Settings ---> 如下图 ---> Add 选择合适的python版本&#xff0c;进行环境设置 UNet训练自己的数据集&#xff1a; 一、训练自己的数据集 1、本文使用VOC格式进行训练。 2、训练前将标签文件放在VOCde…

谈 Dojo 应用的 UI 自动化测试

目录 前言&#xff1a; Dojo 是什么&#xff1f; Dojo 应用 UI 自动化测试面临的挑战 A. 异步请求的处理 B. 元素定位 图 1. Dojo 按钮小部件 C. Dojo 复杂性 D. 产品复杂性 E. 频繁的 UI 更改 F. Dojo 升级 Dojo 应用 UI 自动化测试框架挑选&#xff08;设计&#…

IIS WebApi: 文件上传,大小限制,提示413 (Request Entity Too Large)

问题&#xff1a;IIS WebApi文件上传&#xff0c;大小限制&#xff0c;提示413 (Request Entity Too Large) 一&#xff1a;在web.config上配置,按照以下格式&#xff0c;将下列标红加粗的地方&#xff0c;按照对应位置复制到web.config中&#xff0c;即可解决。 注&#xff…

本质安全设备标准(IEC60079-11)的理解(五)绝对可靠器件infallible components

在前面的章节中我们简单提及到绝对可靠器件&#xff0c; 这里重新摘抄如下&#xff1a; “这里顺便说一下可靠元器件&#xff08;infallible component&#xff09;的理解。它在标准里面占有不少的章节&#xff0c;而且开始理解他也有一些费劲。本人从两个方面理解它 &#x…

工艺流程图绘制流程?试试这样绘制

工艺流程图绘制流程&#xff1f;绘制工艺流程图可以帮助我们更好地理解工艺流程&#xff0c;确定生产流程&#xff0c;优化生产效率&#xff0c;并帮助人们更好地进行生产管理和质量控制。通过工艺流程图&#xff0c;我们可以清晰地了解每一步骤所需的设备和材料&#xff0c;以…