From da6b322fb0b3e80ad8bb3e0f5bdbf9e5113dbb5e Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 20 十月 2026 15:22:30 +0800
Subject: [PATCH] feat: 设备保养优化,保养项目拆分
---
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 158 insertions(+), 21 deletions(-)
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
index 0c00da7..5808c73 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -1,22 +1,36 @@
package com.ruoyi.device.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.device.mapper.MaintenanceTaskMapper;
+import com.ruoyi.device.mapper.MaintenanceItemMapper;
+import com.ruoyi.device.mapper.MaintenanceTaskItemMapper;
+import com.ruoyi.device.pojo.MaintenanceItem;
import com.ruoyi.device.pojo.MaintenanceTask;
+import com.ruoyi.device.pojo.MaintenanceTaskItem;
import com.ruoyi.device.service.MaintenanceTaskService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import com.ruoyi.inspectiontask.service.impl.TimingTaskServiceImpl;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
/**
* @author :yys
@@ -24,23 +38,21 @@
*/
@Service
@Slf4j
+@RequiredArgsConstructor
public class MaintenanceTaskServiceImpl extends ServiceImpl<MaintenanceTaskMapper, MaintenanceTask> implements MaintenanceTaskService {
- @Autowired
- private MaintenanceTaskMapper maintenanceTaskMapper;
-
- @Autowired
- private SysUserMapper sysUserMapper;
-
- @Autowired
- private TimingTaskServiceImpl timingTaskService;
-
- @Autowired
- private MaintenanceTaskScheduler maintenanceTaskScheduler;
+ private final MaintenanceTaskMapper maintenanceTaskMapper;
+ private final MaintenanceItemMapper maintenanceItemMapper;
+ private final MaintenanceTaskItemMapper maintenanceTaskItemMapper;
+ private final SysUserMapper sysUserMapper;
+ private final TimingTaskServiceImpl timingTaskService;
+ private final MaintenanceTaskScheduler maintenanceTaskScheduler;
@Override
public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
- Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null);
+ LambdaQueryWrapper<MaintenanceTask> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.orderByDesc(MaintenanceTask::getId);
+ Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper);
// 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
if (taskPage.getRecords().isEmpty()) {
return AjaxResult.success(taskPage);
@@ -68,12 +80,17 @@
task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "鏈煡鐢ㄦ埛"));
}
});
+ taskPage.getRecords().forEach(this::fillTaskItems);
return AjaxResult.success(taskPage);
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public AjaxResult add(MaintenanceTask maintenanceTask) {
- maintenanceTask.setActive(true);
+ List<MaintenanceItem> selectedItems = getSelectedItems(maintenanceTask.getMaintenanceItemIds(), null, maintenanceTask.getTaskId(), maintenanceTask.getFrequencyType());
+ List<MaintenanceTaskItem> customItems = normalizeCustomItems(maintenanceTask.getCustomItems());
+ if (selectedItems == null || selectedItems.size() + customItems.size() == 0)
+ return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�涓湁鏁堢殑淇濆吇椤圭洰");
// 璁$畻棣栨鎵ц鏃堕棿
TimingTask task = new TimingTask();
task.setFrequencyType(maintenanceTask.getFrequencyType());
@@ -82,33 +99,153 @@
maintenanceTask.setNextExecutionTime(firstExecutionTime);
int insert = maintenanceTaskMapper.insert(maintenanceTask);
if (insert > 0) {
- maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+ saveTaskItems(maintenanceTask, selectedItems, customItems);
+ // 鍙湁褰� isActive 涓� 1 鏃舵墠娣诲姞鍒板畾鏃朵换鍔¤皟搴﹀櫒
+ if (maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) {
+ maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+ }
}
return AjaxResult.success("娣诲姞鎴愬姛");
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId());
if (maintenanceTask1 == null) {
return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
}
+ List<MaintenanceItem> selectedItems = getSelectedItems(maintenanceTask.getMaintenanceItemIds(), maintenanceTask1.getId(), maintenanceTask.getTaskId(), maintenanceTask.getFrequencyType());
+ List<MaintenanceTaskItem> customItems = normalizeCustomItems(maintenanceTask.getCustomItems());
+ if (selectedItems == null || selectedItems.size() + customItems.size() == 0)
+ return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�涓湁鏁堢殑淇濆吇椤圭洰");
+
+ // 淇濆瓨鏃х殑 isActive 鐘舵��
+ Integer oldIsActive = maintenanceTask1.getIsActive();
+ Integer newIsActive = maintenanceTask.getIsActive();
+
BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
int update = maintenanceTaskMapper.updateById(maintenanceTask1);
if (update > 0) {
- maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ maintenanceTaskItemMapper.delete(new LambdaQueryWrapper<MaintenanceTaskItem>()
+ .eq(MaintenanceTaskItem::getMaintenanceTaskId, maintenanceTask1.getId()));
+ saveTaskItems(maintenanceTask1, selectedItems, customItems);
+ // 澶勭悊 isActive 鐘舵�佸彉鍖�
+ if (newIsActive != null && newIsActive == 1) {
+ // 鏂扮姸鎬佷负鍚敤锛氭坊鍔犲埌瀹氭椂浠诲姟璋冨害鍣�
+ if (oldIsActive == null || oldIsActive != 1) {
+ // 浠庢湭鍚敤鍙樹负鍚敤锛屾坊鍔犲埌璋冨害鍣�
+ maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask1);
+ } else {
+ // 宸茬粡鍚敤锛屾洿鏂拌皟搴﹀櫒涓殑浠诲姟
+ maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ }
+ } else {
+ // 鏂扮姸鎬佷负鍋滅敤锛氫粠瀹氭椂浠诲姟璋冨害鍣ㄤ腑绉婚櫎
+ if (oldIsActive != null && oldIsActive == 1) {
+ maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask1.getId());
+ }
+ }
}
return AjaxResult.success("鏇存柊鎴愬姛");
}
@Override
public AjaxResult delete(List<Long> ids) {
+ // 鍏堜粠瀹氭椂浠诲姟璋冨害鍣ㄤ腑绉婚櫎鎵�鏈夊緟鍒犻櫎鐨勪换鍔�
+ ids.forEach(id -> {
+ try {
+ maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
+ } catch (Exception e) {
+ log.error("鍒犻櫎瀹氭椂浠诲姟璋冨害澶辫触, id: {}", id, e);
+ }
+ });
+
+ // 鍐嶄粠鏁版嵁搴撲腑鍒犻櫎璁板綍
int delete = maintenanceTaskMapper.deleteBatchIds(ids);
if (delete > 0) {
- ids.forEach(id -> {
- maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
- });
+ maintenanceTaskItemMapper.delete(new LambdaQueryWrapper<MaintenanceTaskItem>()
+ .in(MaintenanceTaskItem::getMaintenanceTaskId, ids));
}
- return AjaxResult.success("鍒犻櫎鎴愬姛");
+ if (delete > 0) {
+ return AjaxResult.success("鍒犻櫎鎴愬姛");
+ }
+ return AjaxResult.error("鍒犻櫎澶辫触");
+ }
+
+ private List<MaintenanceTaskItem> normalizeCustomItems(List<MaintenanceTaskItem> customItems) {
+ if (customItems == null) return new ArrayList<>();
+ return customItems.stream().filter(Objects::nonNull)
+ .filter(item -> item.getItemProject() != null && !item.getItemProject().trim().isEmpty()
+ && item.getItemName() != null && !item.getItemName().trim().isEmpty())
+ .peek(item -> {
+ item.setItemProject(item.getItemProject().trim());
+ item.setItemName(item.getItemName().trim());
+ })
+ .toList();
+ }
+
+ private List<MaintenanceItem> getSelectedItems(List<Long> ids, Long taskId, Long deviceId, String frequencyType) {
+ if (deviceId == null || !List.of("DAILY", "WEEKLY", "MONTHLY", "QUARTERLY").contains(frequencyType)
+ || (ids != null && new HashSet<>(ids).size() != ids.size())) return null;
+ if (ids == null || ids.isEmpty()) return new ArrayList<>();
+ List<MaintenanceItem> items = maintenanceItemMapper.selectList(new LambdaQueryWrapper<MaintenanceItem>()
+ .in(MaintenanceItem::getId, ids));
+ if (items.size() != ids.size()) return null;
+ if (items.stream().anyMatch(item -> (item.getDeviceLedgerId() != null && !deviceId.equals(item.getDeviceLedgerId()))
+ || !(frequencyType.equals(item.getFrequencyType()) || "ALL".equals(item.getFrequencyType()))))
+ return null;
+ Map<Long, MaintenanceItem> itemMap = new HashMap<>();
+ items.forEach(item -> itemMap.put(item.getId(), item));
+ Set<Long> existingIds = taskId == null ? Collections.emptySet() : maintenanceTaskItemMapper.selectList(
+ new LambdaQueryWrapper<MaintenanceTaskItem>()
+ .eq(MaintenanceTaskItem::getMaintenanceTaskId, taskId))
+ .stream().map(MaintenanceTaskItem::getMaintenanceItemId).collect(Collectors.toSet());
+ if (items.stream().anyMatch(item -> (item.getDeleted() != null && item.getDeleted() == 1
+ || item.getIsActive() == null || item.getIsActive() != 1)
+ && !existingIds.contains(item.getId()))) return null;
+ List<MaintenanceItem> sorted = new ArrayList<>();
+ ids.forEach(id -> sorted.add(itemMap.get(id)));
+ return sorted;
+ }
+
+ private void saveTaskItems(MaintenanceTask task, List<MaintenanceItem> selectedItems, List<MaintenanceTaskItem> customItems) {
+ for (int i = 0; i < selectedItems.size(); i++) {
+ MaintenanceItem source = selectedItems.get(i);
+ MaintenanceTaskItem link = new MaintenanceTaskItem();
+ link.setMaintenanceTaskId(task.getId());
+ link.setMaintenanceItemId(source.getId());
+ link.setItemProject(source.getItemProject());
+ link.setItemName(source.getItemName());
+ link.setSortNum(i);
+ link.setTenantId(task.getTenantId());
+ link.setDeptId(task.getDeptId());
+ maintenanceTaskItemMapper.insert(link);
+ }
+ for (int i = 0; i < customItems.size(); i++) {
+ MaintenanceTaskItem link = new MaintenanceTaskItem();
+ link.setMaintenanceTaskId(task.getId());
+ link.setMaintenanceItemId(null);
+ link.setItemProject(customItems.get(i).getItemProject());
+ link.setItemName(customItems.get(i).getItemName());
+ link.setSortNum(selectedItems.size() + i);
+ link.setTenantId(task.getTenantId());
+ link.setDeptId(task.getDeptId());
+ maintenanceTaskItemMapper.insert(link);
+ }
+ task.setMaintenanceItems(maintenanceTaskItemMapper.selectList(new LambdaQueryWrapper<MaintenanceTaskItem>()
+ .eq(MaintenanceTaskItem::getMaintenanceTaskId, task.getId())
+ .orderByAsc(MaintenanceTaskItem::getSortNum)));
+ task.setMaintenanceItemIds(task.getMaintenanceItems().stream()
+ .map(MaintenanceTaskItem::getMaintenanceItemId).filter(Objects::nonNull).collect(Collectors.toList()));
+ }
+
+ private void fillTaskItems(MaintenanceTask task) {
+ List<MaintenanceTaskItem> items = maintenanceTaskItemMapper.selectList(new LambdaQueryWrapper<MaintenanceTaskItem>()
+ .eq(MaintenanceTaskItem::getMaintenanceTaskId, task.getId())
+ .orderByAsc(MaintenanceTaskItem::getSortNum));
+ task.setMaintenanceItems(items);
+ task.setMaintenanceItemIds(items.stream().map(MaintenanceTaskItem::getMaintenanceItemId).filter(Objects::nonNull)
+ .collect(Collectors.toList()));
}
}
--
Gitblit v1.9.3