QrTaskService.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package com.example.demo.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.example.demo.domain.dto.QrtzTaskAddNewDTO;
  8. import com.example.demo.domain.dto.QrtzTaskUpdateDTO;
  9. import com.example.demo.domain.dto.QueryPageDTO;
  10. import com.example.demo.domain.dto.QueryTaskDetailsDTO;
  11. import com.example.demo.domain.entity.QrtzTask;
  12. import com.example.demo.domain.entity.QrtzTaskDetail;
  13. import com.example.demo.domain.entity.WebLoginConfig;
  14. import com.example.demo.mapper.QrtzTaskMapper;
  15. import com.example.demo.model.vo.PersonnelVO;
  16. import com.example.demo.util.LoginUtils;
  17. import com.example.demo.util.Response;
  18. import lombok.RequiredArgsConstructor;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.quartz.SchedulerException;
  21. import org.springframework.beans.BeanUtils;
  22. import org.springframework.context.annotation.Lazy;
  23. import org.springframework.stereotype.Service;
  24. import java.util.ArrayList;
  25. import java.util.Arrays;
  26. import java.util.List;
  27. import java.util.Stack;
  28. import java.util.regex.Matcher;
  29. import java.util.regex.Pattern;
  30. /**
  31. * @author admin
  32. * @description 针对表【qrtz_task(定时任务表)】的数据库操作Service实现
  33. * @createDate 2023-03-15 13:40:32
  34. */
  35. @Slf4j
  36. @Service
  37. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  38. public class QrTaskService extends ServiceImpl<QrtzTaskMapper, QrtzTask> {
  39. private final JobService jobService;
  40. private final QrTaskDetailService qrTaskDetailService;
  41. private final LoginUtils loginUtils;
  42. private final WebLoginConfigService webLoginConfigService;
  43. /**
  44. * 新增任务
  45. *
  46. * @param qrtzTaskAddNewDTO 新增条件任务DTO对象
  47. */
  48. public QrtzTask addQuartzTask(QrtzTaskAddNewDTO qrtzTaskAddNewDTO) {
  49. log.info("开始处理【新增任务条件】的业务,参数为:{}", qrtzTaskAddNewDTO);
  50. Integer webId = qrtzTaskAddNewDTO.getConfigId();
  51. //根据网站id获得配置
  52. WebLoginConfig webLoginConfig = webLoginConfigService.getLoginConfig(webId);
  53. if(webLoginConfig==null){
  54. return null;
  55. }
  56. //DTO数据赋值给任务条件实体类
  57. QrtzTask qrtzTask = new QrtzTask();
  58. BeanUtils.copyProperties(qrtzTaskAddNewDTO, qrtzTask);
  59. qrtzTask.setCreatePersonId(loginUtils.getId());
  60. List<String> cells = qrtzTaskAddNewDTO.getConfigCells();
  61. if (cells == null) {
  62. qrtzTask.setConfigCells("");
  63. } else {
  64. qrtzTask.setConfigCells(String.join(",", cells));
  65. }
  66. qrtzTask.setTaskState(0);
  67. log.info("数据入任务条件表");
  68. qrtzTask.insert();
  69. //若是普通任务则新增一条任务执行情况
  70. if (qrtzTask.getTaskType() != 1) {
  71. QrtzTaskDetail qrtzTaskDetail = new QrtzTaskDetail()
  72. .setTaskId(qrtzTask.getId())
  73. .setTaskDetailState(0);
  74. log.info("新增一条普通任务入任务执行情况表");
  75. qrtzTaskDetail.insert();
  76. }
  77. return qrtzTask;
  78. }
  79. public QrtzTask updateQuartzTask(QrtzTaskUpdateDTO qrtzTaskUpdateDTO) {
  80. log.info("开始处理【更新任务条件】的业务,参数为:{}", qrtzTaskUpdateDTO);
  81. //DTO数据赋值给实体类
  82. QrtzTask qrtzTask = new QrtzTask();
  83. BeanUtils.copyProperties(qrtzTaskUpdateDTO, qrtzTask);
  84. List<String> cells = qrtzTaskUpdateDTO.getConfigCells();
  85. if (cells == null) {
  86. qrtzTask.setConfigCells("");
  87. } else {
  88. qrtzTask.setConfigCells(String.join(",", cells));
  89. }
  90. //更新任务条件数据
  91. log.info("更新任务条件数据");
  92. qrtzTask.updateById();
  93. return qrtzTask;
  94. }
  95. public QrtzTask updateState(Integer taskId, Integer state) {
  96. QrtzTask qrtzTask = this.getById(taskId);
  97. qrtzTask.setTaskState(state);
  98. qrtzTask.updateById();
  99. return qrtzTask;
  100. }
  101. /**
  102. * 删除任务
  103. *
  104. * @param taskIds
  105. */
  106. public List<Integer> deleteQuartzTask(List<Integer> taskIds) throws SchedulerException {
  107. List<Integer> reIds = new ArrayList<>();
  108. LambdaQueryWrapper<QrtzTask> wrapper = new LambdaQueryWrapper<>();
  109. wrapper.in(QrtzTask::getId, taskIds);
  110. List<QrtzTask> qrtzTaskList = this.list(wrapper);
  111. for (QrtzTask qrtzTask : qrtzTaskList) {
  112. //根据任务条件id查找是否有正在进行的任务
  113. LambdaQueryWrapper<QrtzTaskDetail> queryWrapper =new LambdaQueryWrapper<>();
  114. queryWrapper.eq(QrtzTaskDetail::getTaskId,qrtzTask.getId())
  115. .in(QrtzTaskDetail::getTaskDetailState, Arrays.asList(1,7,8));
  116. List<QrtzTaskDetail> qrtzTaskDetails =qrTaskDetailService.list(queryWrapper);
  117. if(qrtzTaskDetails.size()==0){
  118. Boolean flag = this.removeById(qrtzTask.getId());
  119. LambdaQueryWrapper<QrtzTaskDetail> deleteWrapper =new LambdaQueryWrapper<>();
  120. queryWrapper.eq(QrtzTaskDetail::getTaskId,qrtzTask.getId());
  121. qrTaskDetailService.removeById(deleteWrapper);
  122. if (!flag) {
  123. reIds.add(qrtzTask.getId());
  124. }
  125. if (qrtzTask.getTaskType().equals(1)) {
  126. jobService.deleteJob(qrtzTask.getId());
  127. }
  128. }
  129. else {
  130. reIds.add(qrtzTask.getId());
  131. }
  132. }
  133. return reIds;
  134. }
  135. public Page<QrtzTask> getTasks(QueryPageDTO queryPageDTO) {
  136. log.info("开始处理【查询任务条件列表】的业务,参数为:{}", queryPageDTO);
  137. String orderBy = queryPageDTO.getOrderBy();
  138. String orderType = queryPageDTO.getOrderType();
  139. QueryWrapper<QrtzTask> queryWrapper = new QueryWrapper<>();
  140. if (orderBy != null && !orderBy.equals("")) {
  141. String regex = "[A-Z]+";
  142. Pattern pattern = Pattern.compile(regex);
  143. Matcher matcher = pattern.matcher(orderBy);
  144. while (matcher.find()) {
  145. orderBy = orderBy.replaceFirst(matcher.group(), "_" + matcher.group().toLowerCase());
  146. }
  147. if (orderType.equals("asc")) {
  148. queryWrapper.orderByAsc(orderBy);
  149. } else {
  150. queryWrapper.orderByDesc(orderBy);
  151. }
  152. } else {
  153. queryWrapper.orderByDesc("modified_time");
  154. }
  155. Page<QrtzTask> page = this.page(new Page<>(queryPageDTO.getCurrent(), queryPageDTO.getSize()), queryWrapper.orderByDesc("modified_time"));
  156. return page;
  157. }
  158. public Page<QrtzTaskDetail> getTaskDetails(QueryTaskDetailsDTO queryTaskDetailsDTO) {
  159. log.info("开始处理【查询任务执行情况列表】的业务,参数为:{}", queryTaskDetailsDTO);
  160. LambdaQueryWrapper<QrtzTaskDetail> queryWrapper = new LambdaQueryWrapper<>();
  161. //根据所属任务条件id查询列表
  162. if (queryTaskDetailsDTO.getTaskId() != null) {
  163. queryWrapper.eq(QrtzTaskDetail::getTaskId, queryTaskDetailsDTO.getTaskId());
  164. }
  165. //根据任务状态查询列表
  166. if (queryTaskDetailsDTO.getTaskDetailStates() != null && queryTaskDetailsDTO.getTaskDetailStates().size() != 0) {
  167. queryWrapper.in(QrtzTaskDetail::getTaskDetailState, queryTaskDetailsDTO.getTaskDetailStates());
  168. }
  169. if(queryTaskDetailsDTO.getOrderBy()!=null){
  170. queryTaskDetailsDTO.setOrderBy(this.formatOrder(queryTaskDetailsDTO.getOrderBy()));
  171. if(queryTaskDetailsDTO.getOrderBy().equals("state")){
  172. queryWrapper.last(" order by FIELD(task_detail_state,1,7,8,0,2,3,4,5,6)");
  173. }
  174. else {
  175. queryWrapper.last(" order by " + queryTaskDetailsDTO.getOrderBy());
  176. if(queryTaskDetailsDTO.getOrderType()!=null){
  177. queryWrapper.last(" order by " + queryTaskDetailsDTO.getOrderBy()+" "+queryTaskDetailsDTO.getOrderType());
  178. }
  179. }
  180. }
  181. Page<QrtzTaskDetail> page = qrTaskDetailService.page(new Page<>(queryTaskDetailsDTO.getCurrent(), queryTaskDetailsDTO.getSize()), queryWrapper);
  182. return page;
  183. }
  184. public String formatOrder(String order){
  185. switch (order)
  186. { case "createTime":
  187. order ="create_time";
  188. break;
  189. }
  190. return order;
  191. }
  192. }