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