From d24942ee210bcc108fe9218c3a6c448afa613d00 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 21 四月 2026 14:10:33 +0800
Subject: [PATCH] feat(inspectiontask): 新增巡检结果字段并支持批量操作

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java |  544 ++++++++++++++++++++++++++++++++++--------------
 src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java                    |    4 
 src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java        |   41 ++-
 src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java          |    5 
 src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java    |   42 +--
 5 files changed, 430 insertions(+), 206 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java b/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
index 40445d1..888555a 100644
--- a/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
@@ -12,10 +12,16 @@
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.List;
 
 /**
  * @author :yys
@@ -29,48 +35,34 @@
     @Autowired
     private InspectionTaskService inspectionTaskService;
 
-    /**
-     * 宸℃浠诲姟琛ㄨ〃鏌ヨ
-     */
     @GetMapping("/list")
-    @ApiOperation("宸℃浠诲姟琛ㄨ〃鏌ヨ")
+    @ApiOperation("宸℃浠诲姟鍒楄〃鏌ヨ")
     public R<IPage<InspectionTaskDto>> list(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) {
-        IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page,inspectionTaskDto);
+        IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page, inspectionTaskDto);
         return R.ok(list);
     }
 
-
-    /**
-     * 瀵煎嚭
-     */
     @PostMapping("/export")
-    @ApiOperation(value = "瀵煎嚭瀹氭椂浠诲姟璁板綍")
+    @ApiOperation(value = "瀵煎嚭宸℃浠诲姟璁板綍")
     public void export(HttpServletResponse response) {
-        Page page = new Page<>(-1,-1);
+        Page page = new Page<>(-1, -1);
         InspectionTaskDto timingTask = new InspectionTaskDto();
-        IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page,timingTask);
+        IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page, timingTask);
         ExcelUtil<InspectionTaskDto> util = new ExcelUtil<>(InspectionTaskDto.class);
-        util.exportExcel(response, list.getRecords(), "瀵煎嚭瀹氭椂浠诲姟璁板綍");
+        util.exportExcel(response, list.getRecords(), "瀵煎嚭宸℃浠诲姟璁板綍");
     }
 
-    /**
-     * 宸℃浠诲姟琛ㄦ柊澧炰慨鏀�
-     */
     @PostMapping("/addOrEditInspectionTask")
-    @ApiOperation("宸℃浠诲姟琛ㄦ柊澧炰慨鏀�")
+    @ApiOperation("宸℃浠诲姟鎵归噺鏂板淇敼")
     @Transactional(rollbackFor = Exception.class)
-    public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) throws IOException {
-        return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto));
+    public R addOrEditInspectionTask(@RequestBody List<InspectionTaskDto> inspectionTaskDtoList) throws IOException {
+        return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDtoList));
     }
 
-    /**
-     * 宸℃浠诲姟琛ㄥ垹闄�
-     */
     @DeleteMapping("/delInspectionTask")
-    @ApiOperation("宸℃浠诲姟琛ㄥ垹闄�")
+    @ApiOperation("宸℃浠诲姟鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
     public R remove(@RequestBody Long[] ids) {
         return R.ok(inspectionTaskService.delByIds(ids));
     }
-
 }
diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java b/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
index ccaf969..3f371be 100644
--- a/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
@@ -7,16 +7,26 @@
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.inspectiontask.dto.InspectionTaskDto;
 import com.ruoyi.inspectiontask.dto.TimingTaskDto;
+import com.ruoyi.inspectiontask.pojo.InspectionTask;
 import com.ruoyi.inspectiontask.pojo.TimingTask;
+import com.ruoyi.inspectiontask.service.InspectionTaskService;
 import com.ruoyi.inspectiontask.service.TimingTaskService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * @author :yys
@@ -27,36 +37,35 @@
 @RequestMapping("/timingTask")
 public class TimingTaskController extends BaseController {
 
-
     @Autowired
     private TimingTaskService timingTaskService;
 
-    /**
-     * 瀹氭椂宸℃浠诲姟琛ㄦ煡璇�
-     */
+    @Autowired
+    private InspectionTaskService inspectionTaskService;
+
     @GetMapping("/list")
     @ApiOperation(value = "瀹氭椂浠诲姟鍒楄〃")
     public R<IPage<TimingTaskDto>> list(Page<TimingTask> page, TimingTask timingTask) {
-        IPage<TimingTaskDto> list = timingTaskService.selectTimingTaskList(page,timingTask);
+        IPage<TimingTaskDto> list = timingTaskService.selectTimingTaskList(page, timingTask);
         return R.ok(list);
     }
 
-    /**
-     * 瀵煎嚭
-     */
+    @GetMapping("/recordList/{timingId}")
+    @ApiOperation(value = "鏍规嵁瀹氭椂浠诲姟ID鏌ヨ宸℃璁板綍鍒楄〃")
+    public R<List<InspectionTaskDto>> recordList(@PathVariable Long timingId) {
+        return R.ok(inspectionTaskService.selectInspectionTaskRecordListByTimingId(timingId));
+    }
+
     @PostMapping("/export")
     @ApiOperation(value = "瀵煎嚭瀹氭椂浠诲姟")
     public void export(HttpServletResponse response) {
-        Page page = new Page<>(-1,-1);
+        Page page = new Page<>(-1, -1);
         TimingTaskDto timingTask = new TimingTaskDto();
-        IPage<TimingTaskDto> list = timingTaskService.selectTimingTaskList(page,timingTask);
+        IPage<TimingTaskDto> list = timingTaskService.selectTimingTaskList(page, timingTask);
         ExcelUtil<TimingTaskDto> util = new ExcelUtil<>(TimingTaskDto.class);
         util.exportExcel(response, list.getRecords(), "瀵煎嚭瀹氭椂浠诲姟");
     }
 
-    /**
-     * 瀹氭椂宸℃浠诲姟琛ㄦ柊澧炰慨鏀�
-     */
     @PostMapping("/addOrEditTimingTask")
     @ApiOperation(value = "鏂板淇敼瀹氭椂浠诲姟")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
@@ -64,14 +73,10 @@
         return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto));
     }
 
-    /**
-     * 瀹氭椂宸℃浠诲姟琛ㄥ垹闄�
-     */
     @DeleteMapping("/delTimingTask")
     @ApiOperation(value = "鍒犻櫎瀹氭椂浠诲姟")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
     public R remove(@RequestBody Long[] ids) {
         return R.ok(timingTaskService.delByIds(ids));
     }
-
 }
diff --git a/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java b/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
index 2d9bc09..6faf760 100644
--- a/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
+++ b/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
@@ -53,6 +53,10 @@
     @Excel(name = "鎵ц宸℃浜哄憳")
     private String inspector;
 
+    @ApiModelProperty(value = "宸℃缁撴灉 1-姝e父 2-寮傚父")
+    @Excel(name = "宸℃缁撴灉", readConverterExp = "1=姝e父,2=寮傚父")
+    private Integer inspectionResult;
+
     @ApiModelProperty(value = "浠诲姟闄勫姞璇存槑鎴栫壒娈婃儏鍐佃褰�")
     @Excel(name = "澶囨敞")
     private String remarks;
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java b/src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java
index 72ca5e4..318e2cf 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java
@@ -7,6 +7,7 @@
 import com.ruoyi.inspectiontask.pojo.InspectionTask;
 
 import java.io.IOException;
+import java.util.List;
 
 /**
  * @author :yys
@@ -16,7 +17,9 @@
 
     IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto);
 
-    int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) throws IOException;
+    List<InspectionTaskDto> selectInspectionTaskRecordListByTimingId(Long timingId);
+
+    int addOrEditInspectionTask(List<InspectionTaskDto> inspectionTaskDtoList) throws IOException;
 
     int delByIds(Long[] ids);
 }
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
index 66bc2b8..b49533a 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -5,20 +5,16 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.basic.dto.StorageBlobDTO;
-import com.ruoyi.basic.mapper.StorageAttachmentMapper;
-import com.ruoyi.basic.mapper.StorageBlobMapper;
-import com.ruoyi.basic.pojo.StorageBlob;
-import com.ruoyi.basic.service.StorageAttachmentService;
 import com.ruoyi.common.enums.FileNameType;
-import com.ruoyi.common.utils.MinioUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.device.mapper.DeviceAreaMapper;
 import com.ruoyi.device.mapper.DeviceLedgerMapper;
+import com.ruoyi.device.mapper.DeviceRepairMapper;
 import com.ruoyi.device.pojo.DeviceArea;
 import com.ruoyi.device.pojo.DeviceLedger;
+import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.inspectiontask.dto.InspectionTaskDto;
 import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
 import com.ruoyi.inspectiontask.pojo.InspectionTask;
@@ -36,9 +32,19 @@
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -52,22 +58,13 @@
 
     private static final int INSPECTION_STATUS_PENDING = 1;
     private static final int INSPECTION_STATUS_COMPLETED = 2;
-
+    private static final int INSPECTION_RESULT_NORMAL = 1;
+    private static final int INSPECTION_RESULT_ABNORMAL = 2;
+    private static final int DEVICE_REPAIR_STATUS_PENDING = 0;
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
     @Autowired
     private InspectionTaskMapper inspectionTaskMapper;
-
-    @Autowired
-    private StorageAttachmentService storageAttachmentService;
-
-    @Autowired
-    private StorageBlobMapper storageBlobMapper;
-
-    @Autowired
-    private StorageAttachmentMapper storageAttachmentMapper;
-
-    @Autowired
-    private MinioUtils minioUtils;
 
     @Autowired
     private SysUserMapper sysUserMapper;
@@ -84,6 +81,9 @@
     @Autowired
     private DeviceAreaMapper deviceAreaMapper;
 
+    @Autowired
+    private DeviceRepairMapper deviceRepairMapper;
+
     @Override
     public IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) {
         LambdaQueryWrapper<InspectionTask> queryWrapper = new LambdaQueryWrapper<>();
@@ -95,6 +95,7 @@
         if (inspectionTaskDto.getAreaId() != null) {
             queryWrapper.eq(InspectionTask::getAreaId, inspectionTaskDto.getAreaId());
         }
+
         LocalDateTime createTimeStart = inspectionTaskDto.getCreateTimeStart();
         LocalDateTime createTimeEnd = inspectionTaskDto.getCreateTimeEnd();
         if (createTimeStart == null && createTimeEnd == null) {
@@ -108,107 +109,383 @@
         if (createTimeEnd != null) {
             queryWrapper.le(InspectionTask::getCreateTime, createTimeEnd);
         }
-        IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper);
 
-        //  鏃犳暟鎹彁鍓嶈繑鍥�
-        if (CollectionUtils.isEmpty(entityPage.getRecords())) {
-            return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal());
+        List<InspectionTask> inspectionTasks = inspectionTaskMapper.selectList(queryWrapper);
+        if (CollectionUtils.isEmpty(inspectionTasks)) {
+            return new Page<>(page.getCurrent(), page.getSize(), 0);
         }
-        // 鑾峰彇id闆嗗悎
-        List<Long> ids = entityPage.getRecords().stream().map(InspectionTask::getId).collect(Collectors.toList());
-        Map<Long, String> areaNameMap = buildAreaNameMap(entityPage.getRecords().stream()
+
+        List<InspectionTaskDto> mergedRecords = mergeInspectionTasksByTimingId(inspectionTasks);
+        return buildPagedResult(page, mergedRecords);
+    }
+
+    @Override
+    public List<InspectionTaskDto> selectInspectionTaskRecordListByTimingId(Long timingId) {
+        LambdaQueryWrapper<InspectionTask> queryWrapper = new LambdaQueryWrapper<>();
+        LocalDate today = LocalDate.now();
+        queryWrapper.eq(InspectionTask::getTimingId, timingId);
+        queryWrapper.ge(InspectionTask::getCreateTime, today.atStartOfDay());
+        queryWrapper.le(InspectionTask::getCreateTime, today.atTime(23, 59, 59));
+        queryWrapper.orderByDesc(InspectionTask::getCreateTime);
+        queryWrapper.orderByDesc(InspectionTask::getId);
+
+        List<InspectionTask> records = inspectionTaskMapper.selectList(queryWrapper);
+        if (CollectionUtils.isEmpty(records)) {
+            return new ArrayList<>();
+        }
+        return buildInspectionTaskDtoList(records);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int addOrEditInspectionTask(List<InspectionTaskDto> inspectionTaskDtoList) throws IOException {
+        if (CollectionUtils.isEmpty(inspectionTaskDtoList)) {
+            return 0;
+        }
+
+        int affected = 0;
+        // 鍚屼竴娆℃彁浜ら噷鍚屼竴鍖哄煙鍙繚鐣欎竴鏉″紓甯歌褰曪紝鐢ㄤ簬鍚庣画鐢熸垚涓�寮犵淮淇崟銆�
+        Map<Long, InspectionTaskDto> abnormalAreaTaskMap = new LinkedHashMap<>();
+        for (InspectionTaskDto inspectionTaskDto : inspectionTaskDtoList) {
+            if (inspectionTaskDto == null) {
+                continue;
+            }
+            InspectionTask savedTask = saveOrUpdateInspectionTask(inspectionTaskDto);
+            affected++;
+            if (Objects.equals(savedTask.getInspectionResult(), INSPECTION_RESULT_ABNORMAL) && savedTask.getAreaId() != null) {
+                abnormalAreaTaskMap.putIfAbsent(savedTask.getAreaId(), copyRepairSourceTask(inspectionTaskDto, savedTask));
+            }
+        }
+        createDeviceRepairRecords(abnormalAreaTaskMap);
+        return affected;
+    }
+
+    private InspectionTask saveOrUpdateInspectionTask(InspectionTaskDto inspectionTaskDto) throws IOException {
+        InspectionTask inspectionTask = new InspectionTask();
+        BeanUtils.copyProperties(inspectionTaskDto, inspectionTask);
+        boolean hasUploadedFiles = CollectionUtils.isNotEmpty(inspectionTaskDto.getTempFileIds());
+
+        if (inspectionTask.getAreaId() == null && inspectionTask.getTaskId() != null) {
+            DeviceLedger deviceLedger = deviceLedgerMapper.selectById(Long.valueOf(inspectionTask.getTaskId()));
+            if (deviceLedger != null) {
+                inspectionTask.setAreaId(deviceLedger.getAreaId());
+            }
+        }
+
+        inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId());
+        inspectionTask.setRegistrant(SecurityUtils.getLoginUser().getUsername());
+
+        if (inspectionTaskDto.getId() == null) {
+            inspectionTask.setInspectionStatus(hasUploadedFiles ? INSPECTION_STATUS_COMPLETED : INSPECTION_STATUS_PENDING);
+            inspectionTaskMapper.insert(inspectionTask);
+        } else {
+            if (hasUploadedFiles) {
+                inspectionTask.setInspectionStatus(INSPECTION_STATUS_COMPLETED);
+            } else if (inspectionTask.getInspectionStatus() == null) {
+                InspectionTask existingTask = inspectionTaskMapper.selectById(inspectionTaskDto.getId());
+                if (existingTask != null) {
+                    inspectionTask.setInspectionStatus(existingTask.getInspectionStatus());
+                }
+            }
+            inspectionTaskMapper.updateById(inspectionTask);
+        }
+
+        commonFileService.migrateTempFilesToFormal(inspectionTask.getId(), inspectionTaskDto.getTempFileIds());
+        return inspectionTask;
+    }
+
+    private InspectionTaskDto copyRepairSourceTask(InspectionTaskDto sourceDto, InspectionTask savedTask) {
+        InspectionTaskDto taskDto = new InspectionTaskDto();
+        BeanUtils.copyProperties(sourceDto, taskDto);
+        taskDto.setId(savedTask.getId());
+        taskDto.setAreaId(savedTask.getAreaId());
+        taskDto.setTaskId(savedTask.getTaskId());
+        taskDto.setTaskName(savedTask.getTaskName());
+        taskDto.setRemarks(savedTask.getRemarks());
+        taskDto.setInspectionLocation(savedTask.getInspectionLocation());
+        return taskDto;
+    }
+
+    private void createDeviceRepairRecords(Map<Long, InspectionTaskDto> abnormalAreaTaskMap) {
+        if (abnormalAreaTaskMap.isEmpty()) {
+            return;
+        }
+
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay();
+        LocalDateTime endOfDay = today.atTime(23, 59, 59);
+
+        for (Map.Entry<Long, InspectionTaskDto> entry : abnormalAreaTaskMap.entrySet()) {
+            Long areaId = entry.getKey();
+            InspectionTaskDto inspectionTaskDto = entry.getValue();
+
+            // 褰撳ぉ璇ュ尯鍩熷凡缁忔湁寰呯淮淇崟鏃剁洿鎺ヨ烦杩囷紝閬垮厤閲嶅鐢熸垚銆�
+            Long count = deviceRepairMapper.selectCount(new LambdaQueryWrapper<DeviceRepair>()
+                    .eq(DeviceRepair::getAreaId, areaId)
+                    .eq(DeviceRepair::getStatus, DEVICE_REPAIR_STATUS_PENDING)
+                    .ge(DeviceRepair::getCreateTime, startOfDay)
+                    .le(DeviceRepair::getCreateTime, endOfDay));
+            if (count != null && count > 0) {
+                continue;
+            }
+
+            DeviceRepair deviceRepair = new DeviceRepair();
+            deviceRepair.setAreaId(areaId);
+            if (inspectionTaskDto.getTaskId() != null) {
+                deviceRepair.setDeviceLedgerId(Long.valueOf(inspectionTaskDto.getTaskId()));
+            }
+            deviceRepair.setRepairName(SecurityUtils.getLoginUser().getUsername());
+            deviceRepair.setRepairTime(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()));
+            deviceRepair.setStatus(DEVICE_REPAIR_STATUS_PENDING);
+            deviceRepair.setRemark(buildRepairRemark(inspectionTaskDto));
+            deviceRepairMapper.insert(deviceRepair);
+        }
+    }
+
+    private String buildRepairRemark(InspectionTaskDto inspectionTaskDto) {
+        List<String> parts = new ArrayList<>();
+        if (StringUtils.isNotBlank(inspectionTaskDto.getTaskName())) {
+            parts.add("宸℃浠诲姟:" + inspectionTaskDto.getTaskName());
+        }
+        if (StringUtils.isNotBlank(inspectionTaskDto.getInspectionLocation())) {
+            parts.add("宸℃鍦扮偣:" + inspectionTaskDto.getInspectionLocation());
+        }
+        if (StringUtils.isNotBlank(inspectionTaskDto.getRemarks())) {
+            parts.add("寮傚父璇存槑:" + inspectionTaskDto.getRemarks());
+        } else {
+            parts.add("寮傚父璇存槑:宸℃寮傚父鑷姩鐢熸垚缁翠慨鍗�");
+        }
+        return String.join("锛�", parts);
+    }
+
+    private IPage<InspectionTaskDto> buildPagedResult(Page<InspectionTask> page, List<InspectionTaskDto> mergedRecords) {
+        long requestedSize = page.getSize();
+        long size = requestedSize <= 0 ? mergedRecords.size() : requestedSize;
+        long current = page.getCurrent() <= 0 ? 1 : page.getCurrent();
+        int fromIndex = (int) Math.min((current - 1) * size, mergedRecords.size());
+        int toIndex = (int) Math.min(fromIndex + size, mergedRecords.size());
+
+        Page<InspectionTaskDto> resultPage = new Page<>(current, size, mergedRecords.size());
+        resultPage.setRecords(mergedRecords.subList(fromIndex, toIndex));
+        return resultPage;
+    }
+
+    private List<InspectionTaskDto> mergeInspectionTasksByTimingId(List<InspectionTask> inspectionTasks) {
+        Map<Long, String> areaNameMap = buildAreaNameMap(inspectionTasks.stream()
                 .map(InspectionTask::getAreaId)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet()));
-        //鐧昏浜篿ds
-        List<Long> registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).collect(Collectors.toList());
-        // 鎵归噺鏌ヨ鐧昏浜�
-        Map<Long, SysUser> sysUserMap;
-        if (!registrantIds.isEmpty()) {
-            List<SysUser> sysUsers = sysUserMapper.selectUsersByIds(registrantIds);
-            sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
-        } else {
-            sysUserMap = new HashMap<>();
-        }
-        //宸℃浜篿ds
-        List<String> inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).collect(Collectors.toList());
+        Map<Long, SysUser> registrantMap = buildRegistrantMap(inspectionTasks);
+        Map<Long, String> inspectorNameMap = buildInspectorNameMap(inspectionTasks);
+        Map<Long, List<CommonFile>> commonFileMap = buildCommonFileMap(inspectionTasks);
 
-        //鑾峰彇鎵�鏈変笉閲嶅鐨勭敤鎴稩D
-        Set<Long> allUserIds = entityPage.getRecords().stream()
-                .map(InspectionTask::getInspectorId) // 鑾峰彇"2,3"杩欐牱鐨勫瓧绗︿覆
+        Map<String, List<InspectionTask>> groupedTasks = inspectionTasks.stream()
+                .collect(Collectors.groupingBy(this::buildTimingGroupKey, LinkedHashMap::new, Collectors.toList()));
+
+        // 鍒楄〃鎺ュ彛鎸� timingId 鑱氬悎锛屽悓涓�涓畾鏃朵换鍔″彧杩斿洖涓�鏉°��
+        return groupedTasks.values().stream()
+                .map(tasks -> buildMergedInspectionTaskDto(tasks, areaNameMap, registrantMap, inspectorNameMap, commonFileMap))
+                .sorted(Comparator.comparing(InspectionTaskDto::getTimingId, Comparator.nullsLast(Long::compareTo))
+                        .thenComparing(InspectionTaskDto::getCreateTime, Comparator.nullsLast(Comparator.reverseOrder())))
+                .collect(Collectors.toList());
+    }
+
+    private List<InspectionTaskDto> buildInspectionTaskDtoList(List<InspectionTask> records) {
+        Map<Long, String> areaNameMap = buildAreaNameMap(records.stream()
+                .map(InspectionTask::getAreaId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet()));
+        Map<Long, SysUser> registrantMap = buildRegistrantMap(records);
+        Map<Long, String> inspectorNameMap = buildInspectorNameMap(records);
+        Map<Long, List<CommonFile>> commonFileMap = buildCommonFileMap(records);
+
+        return records.stream()
+                .map(task -> buildInspectionTaskDto(task, areaNameMap, registrantMap, inspectorNameMap, commonFileMap))
+                .collect(Collectors.toList());
+    }
+
+    private Map<Long, SysUser> buildRegistrantMap(List<InspectionTask> tasks) {
+        List<Long> registrantIds = tasks.stream()
+                .map(InspectionTask::getRegistrantId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        if (registrantIds.isEmpty()) {
+            return new HashMap<>();
+        }
+        return sysUserMapper.selectUsersByIds(registrantIds).stream()
+                .collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+    }
+
+    private Map<Long, String> buildInspectorNameMap(List<InspectionTask> tasks) {
+        Set<Long> allUserIds = tasks.stream()
+                .map(InspectionTask::getInspectorId)
                 .filter(StringUtils::isNotBlank)
                 .flatMap(idsStr -> Arrays.stream(idsStr.split(",")))
-                .map(idStr -> {
-                    try {
-                        return Long.parseLong(idStr.trim());
-                    } catch (NumberFormatException e) {
-                        return null;
-                    }
-                })
+                .map(String::trim)
+                .map(this::parseLongSafely)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
+        if (allUserIds.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        return sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds)).stream()
+                .collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName, (left, right) -> left));
+    }
 
-        // 浣跨敤SQL鎵归噺鏌ヨ鐢ㄦ埛淇℃伅
-        Map<Long, String> userIdToNameMap = allUserIds.isEmpty()
-                ? Collections.emptyMap()
-                : sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds))
-                .stream()
-                .collect(Collectors.toMap(
-                        SysUser::getUserId,
-                        SysUser::getNickName,
-                        (existing, replacement) -> existing));
-
-        //澶勭悊闄勪欢
+    private Map<Long, List<CommonFile>> buildCommonFileMap(List<InspectionTask> tasks) {
+        List<Long> ids = tasks.stream()
+                .map(InspectionTask::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (ids.isEmpty()) {
+            return Collections.emptyMap();
+        }
         List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                 .in(CommonFile::getCommonId, ids)
-                .in(CommonFile::getType, Arrays.asList(FileNameType.INSPECTION.getValue(), FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue(), FileNameType.INSPECTION_PRODUCTION_AFTER.getValue())));
-        if(commonFiles == null){
-            commonFiles = new ArrayList<>();
+                .in(CommonFile::getType, Arrays.asList(
+                        FileNameType.INSPECTION.getValue(),
+                        FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue(),
+                        FileNameType.INSPECTION_PRODUCTION_AFTER.getValue()
+                )));
+        if (commonFiles == null || commonFiles.isEmpty()) {
+            return Collections.emptyMap();
         }
-        AtomicReference<List<CommonFile>> finalCommonFiles = new AtomicReference<>(commonFiles);
+        return commonFiles.stream().collect(Collectors.groupingBy(CommonFile::getCommonId));
+    }
 
-        List<InspectionTaskDto> dtoList = entityPage.getRecords().stream().map(inspectionTask -> {
-            InspectionTaskDto dto = new InspectionTaskDto();
-            BeanUtils.copyProperties(inspectionTask, dto);  // 澶嶅埗涓诲璞″睘鎬�
+    private String buildTimingGroupKey(InspectionTask inspectionTask) {
+        return inspectionTask.getTimingId() != null ? "TIMING_" + inspectionTask.getTimingId() : "TASK_" + inspectionTask.getId();
+    }
 
-            // 璁剧疆鐧昏浜�
-            SysUser sysUser = sysUserMap.get(inspectionTask.getRegistrantId());
-            if (sysUser != null) {
-                dto.setRegistrant(sysUser.getNickName());
-            }
-            dto.setAreaName(areaNameMap.get(inspectionTask.getAreaId()));
-            // 澶勭悊宸℃浜哄悕绉�
-            if (StringUtils.isNotBlank(inspectionTask.getInspectorId())) {
-                String inspectorNames = Arrays.stream(inspectionTask.getInspectorId().split(","))
-                        .map(String::trim)
-                        .map(idStr -> {
-                            try {
-                                Long userId = Long.parseLong(idStr);
-                                return userIdToNameMap.getOrDefault(userId, "鏈煡鐢ㄦ埛(" + idStr + ")");
-                            } catch (NumberFormatException e) {
-                                return "鏃犳晥ID(" + idStr + ")";
-                            }
-                        })
-                        .collect(Collectors.joining(","));
-                dto.setInspector(inspectorNames);
-            }
+    private InspectionTaskDto buildMergedInspectionTaskDto(List<InspectionTask> tasks,
+                                                           Map<Long, String> areaNameMap,
+                                                           Map<Long, SysUser> registrantMap,
+                                                           Map<Long, String> inspectorNameMap,
+                                                           Map<Long, List<CommonFile>> commonFileMap) {
+        List<InspectionTask> sortedTasks = tasks.stream()
+                .sorted(Comparator.comparing(InspectionTask::getCreateTime, Comparator.nullsLast(Comparator.reverseOrder()))
+                        .thenComparing(InspectionTask::getId, Comparator.nullsLast(Comparator.reverseOrder())))
+                .collect(Collectors.toList());
+        InspectionTask latestTask = sortedTasks.get(0);
 
-            dto.setDateStr(inspectionTask.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-            finalCommonFiles.set(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getCommonId().equals(inspectionTask.getId())).collect(Collectors.toList()));
-            // 鍒濆鍖栦笁涓檮浠跺垪琛�
-            dto.setCommonFileList(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION.getValue())).collect(Collectors.toList()));
-            dto.setCommonFileListAfter(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_AFTER.getValue())).collect(Collectors.toList()));
-            dto.setCommonFileListBefore(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue())).collect(Collectors.toList()));
+        InspectionTaskDto dto = new InspectionTaskDto();
+        BeanUtils.copyProperties(latestTask, dto);
+        dto.setAreaName(areaNameMap.get(latestTask.getAreaId()));
+        dto.setTaskName(joinDistinctValues(sortedTasks.stream().map(InspectionTask::getTaskName).collect(Collectors.toList())));
+        dto.setInspectorId(joinDistinctValues(sortedTasks.stream()
+                .map(InspectionTask::getInspectorId)
+                .filter(StringUtils::isNotBlank)
+                .flatMap(idsStr -> Arrays.stream(idsStr.split(",")))
+                .map(String::trim)
+                .collect(Collectors.toList())));
+        dto.setInspector(joinDistinctValues(sortedTasks.stream()
+                .map(InspectionTask::getInspectorId)
+                .filter(StringUtils::isNotBlank)
+                .flatMap(idsStr -> Arrays.stream(idsStr.split(",")))
+                .map(String::trim)
+                .map(idStr -> resolveInspectorName(idStr, inspectorNameMap))
+                .collect(Collectors.toList())));
+        dto.setRegistrant(joinDistinctValues(sortedTasks.stream()
+                .map(InspectionTask::getRegistrantId)
+                .filter(Objects::nonNull)
+                .map(registrantMap::get)
+                .filter(Objects::nonNull)
+                .map(SysUser::getNickName)
+                .collect(Collectors.toList())));
+        dto.setRemarks(joinDistinctValues(sortedTasks.stream().map(InspectionTask::getRemarks).collect(Collectors.toList())));
+        dto.setInspectionLocation(joinDistinctValues(sortedTasks.stream().map(InspectionTask::getInspectionLocation).collect(Collectors.toList())));
+        dto.setFrequencyType(joinDistinctValues(sortedTasks.stream().map(InspectionTask::getFrequencyType).collect(Collectors.toList())));
+        dto.setFrequencyDetail(joinDistinctValues(sortedTasks.stream().map(InspectionTask::getFrequencyDetail).collect(Collectors.toList())));
+        dto.setInspectionStatus(sortedTasks.stream().allMatch(task -> Objects.equals(task.getInspectionStatus(), INSPECTION_STATUS_COMPLETED))
+                ? INSPECTION_STATUS_COMPLETED : INSPECTION_STATUS_PENDING);
 
+        List<Integer> inspectionResults = sortedTasks.stream()
+                .map(InspectionTask::getInspectionResult)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (inspectionResults.isEmpty()) {
+            dto.setInspectionResult(null);
+        } else {
+            dto.setInspectionResult(inspectionResults.stream().anyMatch(result -> Objects.equals(result, INSPECTION_RESULT_ABNORMAL))
+                    ? INSPECTION_RESULT_ABNORMAL : INSPECTION_RESULT_NORMAL);
+        }
 
-            return dto;
-        }).collect(Collectors.toList());
+        if (dto.getCreateTime() != null) {
+            dto.setDateStr(dto.getCreateTime().format(DATE_FORMATTER));
+        }
 
-        // 7. 鏋勫缓杩斿洖鍒嗛〉瀵硅薄
-        IPage<InspectionTaskDto> resultPage = new Page<>();
-        BeanUtils.copyProperties(entityPage, resultPage);
-        resultPage.setRecords(dtoList);
-        return resultPage;
+        List<CommonFile> mergedFiles = sortedTasks.stream()
+                .map(InspectionTask::getId)
+                .filter(Objects::nonNull)
+                .map(commonFileMap::get)
+                .filter(Objects::nonNull)
+                .flatMap(List::stream)
+                .collect(Collectors.toList());
+        dto.setCommonFileList(filterCommonFilesByType(mergedFiles, FileNameType.INSPECTION.getValue()));
+        dto.setCommonFileListBefore(filterCommonFilesByType(mergedFiles, FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue()));
+        dto.setCommonFileListAfter(filterCommonFilesByType(mergedFiles, FileNameType.INSPECTION_PRODUCTION_AFTER.getValue()));
+        return dto;
+    }
+
+    private InspectionTaskDto buildInspectionTaskDto(InspectionTask task,
+                                                     Map<Long, String> areaNameMap,
+                                                     Map<Long, SysUser> registrantMap,
+                                                     Map<Long, String> inspectorNameMap,
+                                                     Map<Long, List<CommonFile>> commonFileMap) {
+        InspectionTaskDto dto = new InspectionTaskDto();
+        BeanUtils.copyProperties(task, dto);
+        dto.setAreaName(areaNameMap.get(task.getAreaId()));
+
+        SysUser registrant = registrantMap.get(task.getRegistrantId());
+        if (registrant != null) {
+            dto.setRegistrant(registrant.getNickName());
+        }
+        if (StringUtils.isNotBlank(task.getInspectorId())) {
+            dto.setInspector(Arrays.stream(task.getInspectorId().split(","))
+                    .map(String::trim)
+                    .map(idStr -> resolveInspectorName(idStr, inspectorNameMap))
+                    .collect(Collectors.joining("锛�")));
+        }
+        if (task.getCreateTime() != null) {
+            dto.setDateStr(task.getCreateTime().format(DATE_FORMATTER));
+        }
+
+        List<CommonFile> commonFiles = commonFileMap.getOrDefault(task.getId(), Collections.emptyList());
+        dto.setCommonFileList(filterCommonFilesByType(commonFiles, FileNameType.INSPECTION.getValue()));
+        dto.setCommonFileListBefore(filterCommonFilesByType(commonFiles, FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue()));
+        dto.setCommonFileListAfter(filterCommonFilesByType(commonFiles, FileNameType.INSPECTION_PRODUCTION_AFTER.getValue()));
+        return dto;
+    }
+
+    private Long parseLongSafely(String value) {
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    private String resolveInspectorName(String idStr, Map<Long, String> inspectorNameMap) {
+        Long userId = parseLongSafely(idStr);
+        if (userId == null) {
+            return "鏃犳晥ID(" + idStr + ")";
+        }
+        return inspectorNameMap.getOrDefault(userId, "鏈煡鐢ㄦ埛(" + idStr + ")");
+    }
+
+    private String joinDistinctValues(List<String> values) {
+        return values.stream()
+                .filter(StringUtils::isNotBlank)
+                .map(String::trim)
+                .distinct()
+                .collect(Collectors.joining("锛�"));
+    }
+
+    private List<CommonFile> filterCommonFilesByType(List<CommonFile> commonFiles, Integer type) {
+        return commonFiles.stream()
+                .filter(commonFile -> Objects.equals(commonFile.getType(), type))
+                .collect(Collectors.toList());
     }
 
     private Map<Long, String> buildAreaNameMap(Set<Long> areaIds) {
@@ -219,72 +496,15 @@
                 .collect(Collectors.toMap(DeviceArea::getId, DeviceArea::getAreaName, (left, right) -> left));
     }
 
-    // 鎻愬彇鍒涘缓BlobDTO鐨勫叕鍏辨柟娉�
-    private StorageBlobDTO createBlobDto(StorageBlob blob) {
-        StorageBlobDTO dto = new StorageBlobDTO();
-        BeanUtils.copyProperties(blob, dto);
-
-        // 璁剧疆URL
-        dto.setUrl(minioUtils.getPreviewUrls(
-                blob.getBucketFilename(),
-                blob.getBucketName(),
-                true
-        ));
-
-        // 璁剧疆涓嬭浇URL
-        dto.setDownloadUrl(minioUtils.getDownloadUrls(
-                blob.getBucketFilename(),
-                blob.getBucketName(),
-                blob.getOriginalFilename(),
-                true
-        ));
-        return dto;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) throws IOException {
-        InspectionTask inspectionTask = new InspectionTask();
-        BeanUtils.copyProperties(inspectionTaskDto, inspectionTask);
-        boolean hasUploadedFiles = CollectionUtils.isNotEmpty(inspectionTaskDto.getTempFileIds());
-        if (inspectionTask.getAreaId() == null && inspectionTask.getTaskId() != null) {
-            DeviceLedger deviceLedger = deviceLedgerMapper.selectById(Long.valueOf(inspectionTask.getTaskId()));
-            if (deviceLedger != null) {
-                inspectionTask.setAreaId(deviceLedger.getAreaId());
-            }
-        }
-        inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId());
-        inspectionTask.setRegistrant(SecurityUtils.getLoginUser().getUsername());
-        int i;
-        if (Objects.isNull(inspectionTaskDto.getId())) {
-            inspectionTask.setInspectionStatus(hasUploadedFiles ? INSPECTION_STATUS_COMPLETED : INSPECTION_STATUS_PENDING);
-            i = inspectionTaskMapper.insert(inspectionTask);
-        } else {
-            if (hasUploadedFiles) {
-                inspectionTask.setInspectionStatus(INSPECTION_STATUS_COMPLETED);
-            } else if (inspectionTask.getInspectionStatus() == null) {
-                InspectionTask existingTask = inspectionTaskMapper.selectById(inspectionTaskDto.getId());
-                if (existingTask != null) {
-                    inspectionTask.setInspectionStatus(existingTask.getInspectionStatus());
-                }
-            }
-            i = inspectionTaskMapper.updateById(inspectionTask);
-        }
-        commonFileService.migrateTempFilesToFormal(inspectionTask.getId(),inspectionTaskDto.getTempFileIds());
-        return i;
-    }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int delByIds(Long[] ids) {
-        // 妫�鏌ュ弬鏁�
         if (ids == null || ids.length == 0) {
             return 0;
         }
-        commonFileService.deleteByBusinessIds(Arrays.asList(ids),FileNameType.INSPECTION.getValue());
-        commonFileService.deleteByBusinessIds(Arrays.asList(ids),FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue());
-        commonFileService.deleteByBusinessIds(Arrays.asList(ids),FileNameType.INSPECTION_PRODUCTION_AFTER.getValue());
+        commonFileService.deleteByBusinessIds(Arrays.asList(ids), FileNameType.INSPECTION.getValue());
+        commonFileService.deleteByBusinessIds(Arrays.asList(ids), FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue());
+        commonFileService.deleteByBusinessIds(Arrays.asList(ids), FileNameType.INSPECTION_PRODUCTION_AFTER.getValue());
         return inspectionTaskMapper.deleteBatchIds(Arrays.asList(ids));
     }
-
 }

--
Gitblit v1.9.3