From 4f55d3cb4bc644e4534106336f2047af1a4db5df Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 29 五月 2026 18:09:46 +0800
Subject: [PATCH] feat(config): 添加新环境配置并扩展设备台账功能

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java |  158 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 133 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
index f3d1ef1..4508625 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -1,20 +1,22 @@
 package com.ruoyi.inspectiontask.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.device.mapper.DeviceAreaMapper;
+import com.ruoyi.device.pojo.DeviceArea;
 import com.ruoyi.inspectiontask.dto.TimingTaskDto;
-import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
 import com.ruoyi.inspectiontask.mapper.TimingTaskMapper;
 import com.ruoyi.inspectiontask.pojo.TimingTask;
 import com.ruoyi.inspectiontask.service.TimingTaskService;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.SchedulerException;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -29,25 +31,39 @@
  */
 @Service
 @Slf4j
+@RequiredArgsConstructor
 public class TimingTaskServiceImpl extends ServiceImpl<TimingTaskMapper, TimingTask> implements TimingTaskService {
 
-    @Autowired
-    private TimingTaskMapper timingTaskMapper;
-
-    @Autowired
-    private InspectionTaskMapper inspectionTaskMapper;
-
-    @Autowired
-    private TimingTaskScheduler timingTaskScheduler;
-
-    @Autowired
-    private SysUserMapper sysUserMapper;
+    private final TimingTaskMapper timingTaskMapper;
+    private final TimingTaskScheduler timingTaskScheduler;
+    private final SysUserMapper sysUserMapper;
+    private final DeviceAreaMapper deviceAreaMapper;
+    private static final int ENABLED = 1;
+    private static final int DISABLED = 0;
 
 
     @Override
     public IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask) {
         // 1. 鍏堝垎椤垫煡璇㈠畾鏃朵换鍔℃暟鎹�
-        IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, null);
+        // 鏋勫缓鏌ヨ鏉′欢
+        LambdaQueryWrapper<TimingTask> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(timingTask.getTaskName())) {
+            queryWrapper.like(TimingTask::getTaskName, timingTask.getTaskName());
+        }
+        if (StringUtils.isNotBlank(timingTask.getInspectionProject())) {
+            queryWrapper.like(TimingTask::getInspectionProject, timingTask.getInspectionProject());
+        }
+        if (timingTask.getIsEnabled() != null) {
+            queryWrapper.eq(TimingTask::getIsEnabled, timingTask.getIsEnabled());
+        }
+        if (timingTask.getAreaId() != null) {
+            queryWrapper.eq(TimingTask::getAreaId, timingTask.getAreaId());
+        }
+        if (StringUtils.isNotBlank(timingTask.getTaskIdsStr())) {
+            queryWrapper.like(TimingTask::getTaskIdsStr, timingTask.getTaskIdsStr());
+        }
+        queryWrapper.orderByDesc(TimingTask::getCreateTime);
+        IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, queryWrapper);
 
         // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
         if (taskPage.getRecords().isEmpty()) {
@@ -82,6 +98,17 @@
             users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
         }
 
+        // 4.1 鎵归噺鏌ヨ鍖哄煙鍚嶇О
+        Set<Long> areaIds = taskPage.getRecords().stream()
+                .map(TimingTask::getAreaId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        Map<Long, String> areaNameMap = new HashMap<>();
+        if (!areaIds.isEmpty()) {
+            List<DeviceArea> areas = deviceAreaMapper.selectBatchIds(new ArrayList<>(areaIds));
+            areas.forEach(area -> areaNameMap.put(area.getId(), area.getAreaName()));
+        }
+
         // 5. 杞崲涓篋TO
         List<TimingTaskDto> dtoList = taskPage.getRecords().stream().map(task -> {
             TimingTaskDto dto = new TimingTaskDto();
@@ -105,6 +132,11 @@
                 dto.setInspector(inspectorNickNames);
             }
 
+            // 璁剧疆鍖哄煙鍚嶇О
+            if (task.getAreaId() != null) {
+                dto.setAreaName(areaNameMap.getOrDefault(task.getAreaId(), ""));
+            }
+
             return dto;
         }).collect(Collectors.toList());
 
@@ -115,14 +147,25 @@
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException {
+        TimingTask oldTimingTask = null;
+        if (Objects.nonNull(timingTaskDto.getId())) {
+            oldTimingTask = timingTaskMapper.selectById(timingTaskDto.getId());
+            if (oldTimingTask == null) {
+                throw new IllegalArgumentException("瀹氭椂浠诲姟涓嶅瓨鍦�");
+            }
+        }
         TimingTask timingTask = new TimingTask();
         BeanUtils.copyProperties(timingTaskDto, timingTask);
+        timingTask.setIsEnabled(resolveEnabledValue(timingTask.getIsEnabled(), oldTimingTask));
+        timingTask.setActive(ENABLED == timingTask.getIsEnabled());
         // 1. 瑙f瀽瀛楃涓蹭负 LocalDate锛堝彧鍖呭惈骞存湀鏃ワ級
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        LocalDate localDate = LocalDate.parse(timingTaskDto.getDateStr(), formatter);
-
+        LocalDate localDate = LocalDate.now();
+        if(StringUtils.isNotEmpty(timingTaskDto.getDateStr())){
+            localDate = LocalDate.parse(timingTaskDto.getDateStr(), formatter);
+        }
         // 2. 鑾峰彇褰撳墠绯荤粺鐨� LocalTime锛堝寘鍚椂鍒嗙锛�
         LocalTime currentTime = LocalTime.now();
 
@@ -132,13 +175,12 @@
         // 璁剧疆鍒涘缓浜轰俊鎭拰榛樿鍊�
         if (Objects.isNull(timingTaskDto.getId())) {
             timingTask.setRegistrationDate(LocalDate.now());
-            timingTask.setActive(true);
 
             // 璁$畻棣栨鎵ц鏃堕棿
             LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask);
             timingTask.setNextExecutionTime(firstExecutionTime);
             int result = timingTaskMapper.insert(timingTask);
-            if (result > 0) {
+            if (result > 0 && isEnabled(timingTask.getIsEnabled(), timingTask.isActive())) {
                 // 鏂板鎴愬姛鍚庢坊鍔犲埌璋冨害鍣�
                 timingTaskScheduler.scheduleTimingTask(timingTask);
             }
@@ -148,14 +190,51 @@
 
             int result = timingTaskMapper.updateById(timingTask);
             if (result > 0) {
-                // 鏇存柊鎴愬姛鍚庨噸鏂拌皟搴︿换鍔�
-                timingTaskScheduler.rescheduleTimingTask(timingTask);
+                boolean oldEnabled = isEnabled(oldTimingTask == null ? null : oldTimingTask.getIsEnabled(), oldTimingTask != null && oldTimingTask.isActive());
+                boolean newEnabled = isEnabled(timingTask.getIsEnabled(), timingTask.isActive());
+                if (!newEnabled) {
+                    timingTaskScheduler.unscheduleTimingTask(timingTask.getId());
+                } else if (oldEnabled) {
+                    // 鏇存柊鎴愬姛鍚庨噸鏂拌皟搴︿换鍔�
+                    timingTaskScheduler.rescheduleTimingTask(timingTask);
+                } else {
+                    // 浠庣鐢ㄦ敼涓哄惎鐢ㄦ椂閲嶆柊鍒涘缓璋冨害浠诲姟
+                    timingTaskScheduler.scheduleTimingTask(timingTask);
+                }
             }
             return result;
         }
     }
 
-    private LocalDateTime calculateFirstExecutionTime(TimingTask task) {
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int changeEnable(Long id, Integer isEnabled) throws SchedulerException {
+        TimingTask oldTimingTask = timingTaskMapper.selectById(id);
+        if (oldTimingTask == null) {
+            throw new IllegalArgumentException("瀹氭椂浠诲姟涓嶅瓨鍦�");
+        }
+        TimingTask update = new TimingTask();
+        update.setId(id);
+        update.setIsEnabled(resolveEnabledValue(isEnabled, oldTimingTask));
+        update.setActive(ENABLED == update.getIsEnabled());
+
+        int result = timingTaskMapper.updateById(update);
+        if (result <= 0) {
+            return result;
+        }
+
+        boolean enabled = isEnabled(update.getIsEnabled(), update.isActive());
+        if (!enabled) {
+            timingTaskScheduler.unscheduleTimingTask(id);
+        } else if (oldTimingTask.getIsEnabled() != null && oldTimingTask.getIsEnabled() == DISABLED) {
+            timingTaskScheduler.scheduleTimingTask(oldTimingTask);
+        } else {
+            timingTaskScheduler.resumeTimingTask(id);
+        }
+        return result;
+    }
+
+    public LocalDateTime calculateFirstExecutionTime(TimingTask task) {
         // 鏍规嵁棰戠巼绫诲瀷鍜岃鎯呰绠楅娆℃墽琛屾椂闂�
         String frequencyType = task.getFrequencyType();
         if ("DAILY".equals(frequencyType)) {
@@ -289,7 +368,7 @@
     }
 
     private LocalDateTime calculateCustomFirstExecution(String frequencyDetail) {
-        return null;
+        return TimingTaskScheduleUtils.calculateFirstExecutionTime("QUARTERLY", frequencyDetail);
     }
 
     @Override
@@ -395,7 +474,7 @@
     /**
      * 璁$畻姣忓搴︿换鍔$殑涓嬫鎵ц鏃堕棿
      */
-    private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) {
+    private LocalDateTime calculateQuarterlyNextTimeLegacy(String detail, LocalDateTime current) {
         String[] parts = detail.split(",");
         int quarterMonth = Integer.parseInt(parts[0]); // 1=绗�1涓湀锛�2=绗�2涓湀锛�3=绗�3涓湀
         int dayOfMonth = Integer.parseInt(parts[1]);
@@ -431,6 +510,9 @@
     /**
      * 瑙f瀽鏄熸湡鍑犲瓧绗︿覆
      */
+    private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) {
+        return TimingTaskScheduleUtils.calculateNextExecutionTime("QUARTERLY", detail, current);
+    }
     private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) {
         Set<DayOfWeek> days = new HashSet<>();
         String[] dayStrs = dayOfWeekStr.split("\\|");
@@ -451,11 +533,37 @@
         return days;
     }
 
+    private Integer resolveEnabledValue(Integer requestEnabled, TimingTask oldTimingTask) {
+        if (requestEnabled != null) {
+            return requestEnabled;
+        }
+        if (oldTimingTask != null) {
+            if (oldTimingTask.getIsEnabled() != null) {
+                return oldTimingTask.getIsEnabled();
+            }
+            return oldTimingTask.isActive() ? ENABLED : DISABLED;
+        }
+        return ENABLED;
+    }
+
+    private boolean isEnabled(Integer enabledValue, boolean activeFallback) {
+        if (enabledValue != null) {
+            return ENABLED == enabledValue;
+        }
+        return activeFallback;
+    }
+
 
 
     @Override
     public int delByIds(Long[] ids) {
-        return timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
+        int i = timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
+        if(i > 0){
+            for (Long id : ids) {
+                timingTaskScheduler.unscheduleTimingTask(id);
+            }
+        }
+        return i;
     }
 
 }

--
Gitblit v1.9.3