From e637234e7f96c5c0ac910ae196f0e8ede8fa01a5 Mon Sep 17 00:00:00 2001 From: bynt Date: Fri, 14 May 2021 16:04:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=A0=E9=99=A4tag?= =?UTF-8?q?=E8=A1=A8=E6=95=B0=E6=8D=AE=20=E4=BF=AE=E6=94=B9=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=B1=A0=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/thread/ThreadPoolConfig.java | 8 ++-- .../buildrecord/domain/BuildRecord.java | 4 +- .../repository/BuildRecordRepository.java | 20 +++++++++ .../service/BuildRecordService.java | 14 ++++++ .../service/impl/BuildRecordServiceImpl.java | 33 +++++++++++++- .../common/handler/BuildRecordScheduled.java | 45 ++++++++++++++----- .../modules/tag/service/TagService.java | 6 +++ .../tag/service/impl/TagServiceImpl.java | 25 ++++++++++- 8 files changed, 136 insertions(+), 19 deletions(-) diff --git a/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolConfig.java b/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolConfig.java index 95ddb3d..155b5fb 100644 --- a/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolConfig.java +++ b/eladmin-system/src/main/java/me/zhengjie/config/thread/ThreadPoolConfig.java @@ -217,9 +217,9 @@ public class ThreadPoolConfig { return new ThreadPoolExecutor( buildTaskDataCorePoolSize, buildTaskMaxPoolSize, - // 设置线程超时1分钟 + // 设置线程超时1小时 1, - TimeUnit.MINUTES, + TimeUnit.HOURS, new LinkedBlockingDeque<>(remoteTaskQueueCapacity), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() @@ -237,9 +237,9 @@ public class ThreadPoolConfig { return new ThreadPoolExecutor( buildTaskDataCorePoolSize, buildTaskMaxPoolSize, - // 设置线程超市1分钟 + // 设置线程超时1小时 1, - TimeUnit.MINUTES, + TimeUnit.HOURS, new LinkedBlockingDeque<>(remoteTaskQueueCapacity), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/domain/BuildRecord.java b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/domain/BuildRecord.java index a82ecb1..26abb6a 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/domain/BuildRecord.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/domain/BuildRecord.java @@ -115,7 +115,9 @@ public class BuildRecord implements Serializable { @ApiModelProperty(value = "是否定时任务") private Boolean isTimedTask; - + @Column(name = "is_deleted") + @ApiModelProperty(value = "数据是否删除") + private Boolean isDeleted; @Transient @ApiModelProperty(value = "子类集合") diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/repository/BuildRecordRepository.java b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/repository/BuildRecordRepository.java index e6c2884..c7eb87f 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/repository/BuildRecordRepository.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/repository/BuildRecordRepository.java @@ -15,6 +15,7 @@ */ package me.zhengjie.modules.buildrecord.repository; +import cn.hutool.core.date.DateTime; import me.zhengjie.modules.buildrecord.domain.BuildRecord; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; @@ -107,4 +108,23 @@ public interface BuildRecordRepository extends JpaRepository getBuildRecordByTime(DateTime oneMonthAhead); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/BuildRecordService.java b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/BuildRecordService.java index 4a230a3..4df442b 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/BuildRecordService.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/BuildRecordService.java @@ -15,6 +15,7 @@ */ package me.zhengjie.modules.buildrecord.service; +import cn.hutool.core.date.DateTime; import me.zhengjie.modules.buildrecord.domain.BuildRecord; import me.zhengjie.modules.buildrecord.service.dto.BuildRecordDto; import me.zhengjie.modules.buildrecord.service.dto.BuildRecordQueryCriteria; @@ -124,4 +125,17 @@ public interface BuildRecordService { * @param nonFinishSendStatus */ void updateIsSendByRecordId(Integer id, int nonFinishSendStatus); + + /** + * 时间查询记录 + * @param oneMonthAhead + * @return + */ + List getBuildRecordByTime(DateTime oneMonthAhead); + + /** + * 修改状态值 + * @param id + */ + void updateIsDeleteByBuildId(Integer id); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/impl/BuildRecordServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/impl/BuildRecordServiceImpl.java index 33d489b..058f4af 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/impl/BuildRecordServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/buildrecord/service/impl/BuildRecordServiceImpl.java @@ -15,6 +15,7 @@ */ package me.zhengjie.modules.buildrecord.service.impl; +import cn.hutool.core.date.DateTime; import lombok.RequiredArgsConstructor; import me.zhengjie.modules.buildrecord.domain.BuildRecord; import me.zhengjie.modules.buildrecord.repository.BuildRecordRepository; @@ -27,14 +28,19 @@ import me.zhengjie.utils.FileUtil; import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.QueryHelp; import me.zhengjie.utils.ValidationUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; /** @@ -49,9 +55,13 @@ public class BuildRecordServiceImpl implements BuildRecordService { + @Value("${tag.split-table.sum}") + private Integer tableSum; + @PersistenceContext + private EntityManager entityManager; - private final BuildRecordRepository buildRecordRepository; private final BuildRecordMapper buildRecordMapper; + private final BuildRecordRepository buildRecordRepository; @Override public Map queryAll(BuildRecordQueryCriteria criteria, Pageable pageable) { @@ -108,8 +118,18 @@ public class BuildRecordServiceImpl implements BuildRecordService { } @Override + @Transactional(rollbackFor = Exception.class) public void deleteAll(Integer[] ids) { for (Integer id : ids) { + // 获取分表下标 + int resultId = id % tableSum; + String deleteStr = "DELETE FROM dc_tag" + + resultId + + " WHERE task_id = :id"; + Query deleteQuery = entityManager.createNativeQuery(deleteStr); + deleteQuery.setParameter("id", id); + // 执行删除 + CompletableFuture.runAsync(deleteQuery::executeUpdate); buildRecordRepository.deleteById(id); } } @@ -170,6 +190,17 @@ public class BuildRecordServiceImpl implements BuildRecordService { buildRecordRepository.updateIsSendByRecordId(id, nonFinishSendStatus); } + @Override + public List getBuildRecordByTime(DateTime oneMonthAhead) { + return buildRecordRepository.getBuildRecordByTime(oneMonthAhead); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateIsDeleteByBuildId(Integer id) { + buildRecordRepository.updateIsDeleteByBuildId(id); + } + /** * 递归查找所有菜单的子菜单 */ diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/common/handler/BuildRecordScheduled.java b/eladmin-system/src/main/java/me/zhengjie/modules/common/handler/BuildRecordScheduled.java index ac1efd1..9efcf7b 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/common/handler/BuildRecordScheduled.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/common/handler/BuildRecordScheduled.java @@ -27,6 +27,8 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.sql.Timestamp; import java.time.LocalTime; +import java.util.Calendar; +import java.util.Date; import java.util.List; /** @@ -47,36 +49,32 @@ public class BuildRecordScheduled { private BuildRecordService buildRecordService; - @Scheduled(cron = "0 0 22 * * ?") + @Scheduled(cron = "0 0 22 * * ?") //@Scheduled(cron = "0 0/1 * * * ?") public void runBuildRecordTask() { log.info("scheduled runBuildRecordTask start time [{}]", LocalTime.now()); // 获取所有开启定时任务开关 List buildRecords = buildRecordService.getBuildRecordByIsTimedTask(Boolean.TRUE); if (!CollectionUtils.isEmpty(buildRecords)) { - for (BuildRecord record : buildRecords) { - /* 发送时间为空 状态不等于0设置发送状态 - BuildTask buildTask = buildTaskService.queryBuildTaskByBuildIdAndTime(record.getId(), LocalTime.now()); - if (buildTask == null) {*/ + for (BuildRecord buildRecord : buildRecords) { BuildTask buildTask = new BuildTask(); - buildTask.setBuildId(record.getId()); + buildTask.setBuildId(buildRecord.getId()); buildTask.setIsSend(DefaultConstant.ZERO_NUMBER); buildTask.setGmtCreate(new Timestamp(System.currentTimeMillis())); BuildTaskDto buildTaskDto = buildTaskService.create(buildTask); if (buildTaskDto != null) { - deleteBuildTaskAndSendBuildTask(record, buildTaskDto.getId()); + deleteBuildTaskAndSendBuildTask(buildRecord, buildTaskDto.getId()); } log.info(" ========================== insert buildTask id as [{}] ===========================", buildTaskDto != null ? buildTaskDto.getId() : null); - /*}*/ } log.info("scheduled runBuildRecordTask end time [{}] task size as [{}]", LocalTime.now(), buildRecords.size()); } } @Async(value = "buildTaskExecutor") - void deleteBuildTaskAndSendBuildTask(BuildRecord record, Integer buildTaskId) { + void deleteBuildTaskAndSendBuildTask(BuildRecord buildRecord, Integer buildTaskId) { // 解析数据 - BuildTaskQueryParamJsonConvert convert = getBuildTaskQueryParamJsonConvert(record.getParams()); + BuildTaskQueryParamJsonConvert convert = getBuildTaskQueryParamJsonConvert(buildRecord.getParams()); Rectangle rectangle = null; // 地图点进行计算,获取选点范围 Integer range = convert.getRange(); @@ -90,11 +88,11 @@ public class BuildRecordScheduled { } // 删除并新增任务 boolean deleteTagByParam = tagService.deleteAndInsertTagByParam - (record.getId(), buildTaskId, + (buildRecord.getId(), buildTaskId, convert.getCityCode(), convert.getStuGrade(), rectangle); - log.info("buildRecordTask taskName as [{}] result as [{}] result time as [{}]", record.getTaskName(), deleteTagByParam, LocalTime.now()); + log.info("buildRecordTask taskName as [{}] result as [{}] result time as [{}]", buildRecord.getTaskName(), deleteTagByParam, LocalTime.now()); } @@ -177,4 +175,27 @@ public class BuildRecordScheduled { } + /** + * 凌晨一点 查询定时任务 删除记录 + */ + @Scheduled(cron = "0 0 1 * * ?") + public void deleteBuildRecordTask() { + // 偏移一个月 + DateTime oneMonthAhead = DateUtil.offsetMonth(DateUtil.date(), -1); + List buildRecordList = buildRecordService.getBuildRecordByTime(oneMonthAhead); + if (!CollectionUtils.isEmpty(buildRecordList)) { + for (BuildRecord buildRecord : buildRecordList) { + if (buildRecord.getId() != null) { + boolean result = tagService.deleteByTaskId(buildRecord.getId()); + if (result) { + // 修改状态 + buildRecordService.updateIsDeleteByBuildId(buildRecord.getId()); + } + log.info("deleteBuildRecordTask buildRecord as [{}] result as [{}]", buildRecord.getTaskName(), result); + } + } + } + } + + } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/TagService.java b/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/TagService.java index 2f37b87..6285abc 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/TagService.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/TagService.java @@ -137,4 +137,10 @@ public interface TagService { */ boolean deleteAndInsertTagByParam(Integer id, Integer buildTaskId, List cityCode, List stuGrade, Rectangle rectangle); + /** + * taskId 删除任务 + * @param id + * @return + */ + boolean deleteByTaskId(Integer id); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/impl/TagServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/impl/TagServiceImpl.java index 757c57d..7258b55 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/impl/TagServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/tag/service/impl/TagServiceImpl.java @@ -23,7 +23,6 @@ import me.zhengjie.common.http.ResponseCode; import me.zhengjie.exception.BadRequestException; import me.zhengjie.modules.buildtask.service.BuildTaskService; import me.zhengjie.modules.common.consts.DefaultConstant; -import me.zhengjie.modules.school.repository.SchoolRepository; import me.zhengjie.modules.tag.domain.Tag; import me.zhengjie.modules.tag.repository.TagRepository; import me.zhengjie.modules.tag.service.TagService; @@ -34,6 +33,7 @@ import me.zhengjie.utils.FileUtil; import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.QueryHelp; import me.zhengjie.utils.ValidationUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -50,6 +50,7 @@ import javax.persistence.Query; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; +import java.util.concurrent.CompletableFuture; /** * @website https://el-admin.vip @@ -288,5 +289,27 @@ public class TagServiceImpl implements TagService { } return Boolean.FALSE; } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteByTaskId(Integer id) { + // 获取分表下标 + int resultId = id % tableSum; + String deleteStr = "DELETE FROM dc_tag" + + resultId + + " WHERE task_id = :id"; + Query deleteQuery = entityManager.createNativeQuery(deleteStr); + deleteQuery.setParameter("id", id); + // 执行删除任务 + boolean result = deleteQuery.executeUpdate() > 0; + if (result){ + // 删除之前记录 分表情况下,单次可能会有遗漏 多次并不影响 + String replaceStr = StringUtils.replace(deleteStr, " = ", " < "); + Query deleteTagByQuery = entityManager.createNativeQuery(replaceStr); + deleteTagByQuery.setParameter("id", id); + CompletableFuture.runAsync(deleteTagByQuery::executeUpdate); + } + return result; + } }