doc/20261016_É豸Ѳ¼ìÏîÄ¿ÍêÕû½Å±¾.sql
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/controller/InspectionItemController.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/mapper/InspectionItemMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/mapper/InspectionTaskItemMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/mapper/TimingTaskItemMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/pojo/InspectionItem.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
@@ -8,7 +8,6 @@ import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import java.util.List; /** * @author :yys @@ -31,11 +30,12 @@ @Excel(name = "å·¡æ£ä»»å¡åç§°") private String taskName; @Schema(description = "å·¡æ£é¡¹ç®") @Excel(name = "å·¡æ£é¡¹ç®") private String inspectionProject; @Schema(description = "设å¤id") private Integer taskId; @TableField(exist = false) private List<InspectionTaskItem> inspectionItems; @Schema(description = "å·¡æ£äººID") private String inspectorId; src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTaskItem.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
@@ -11,7 +11,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; /** * @author :yys @@ -34,17 +33,12 @@ @Excel(name = "å·¡æ£ä»»å¡åç§°") private String taskName; @Schema(description = "å·¡æ£é¡¹ç®") @Excel(name = "å·¡æ£é¡¹ç®") private String inspectionProject; @Schema(description = "设å¤id") private Integer taskId; @TableField(exist = false) private List<Long> inspectionItemIds; @TableField(exist = false) private List<TimingTaskItem> inspectionItems; @TableField(exist = false) private List<TimingTaskItem> customItems; @Schema(description = "å·¡æ£äºº") @Excel(name = "æ§è¡å·¡æ£äºº") @@ -99,17 +93,17 @@ private String dateStr; @Schema(description = "å建该记å½çç¨æ·") @TableField(fill = FieldFill.INSERT) @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) private Integer createUser; @Schema(description = "è®°å½å建æ¶é´") @TableField(fill = FieldFill.INSERT) @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) // @JsonFormat(pattern = "yyyy-MM-dd") // @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDateTime createTime; @Schema(description = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") @TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) private Integer updateUser; @Schema(description = "è®°å½æåæ´æ°æ¶é´") @@ -117,7 +111,7 @@ private LocalDateTime updateTime; @Schema(description = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) private Long tenantId; src/main/java/com/ruoyi/inspectiontask/pojo/TimingTaskItem.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/service/InspectionItemService.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionItemServiceImpl.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -17,10 +17,8 @@ import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.inspectiontask.dto.InspectionTaskDto; import com.ruoyi.inspectiontask.mapper.InspectionTaskItemMapper; import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper; import com.ruoyi.inspectiontask.pojo.InspectionTask; import com.ruoyi.inspectiontask.pojo.InspectionTaskItem; import com.ruoyi.inspectiontask.service.InspectionTaskService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; @@ -29,18 +27,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; 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.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -51,12 +40,10 @@ @Service @Slf4j @RequiredArgsConstructor public class InspectionTaskServiceImpl extends ServiceImpl<InspectionTaskMapper, InspectionTask> implements InspectionTaskService { public class InspectionTaskServiceImpl extends ServiceImpl<InspectionTaskMapper, InspectionTask> implements InspectionTaskService { private final InspectionTaskMapper inspectionTaskMapper; private final InspectionTaskItemMapper inspectionTaskItemMapper; private final SysUserMapper sysUserMapper; @@ -77,22 +64,17 @@ if (StringUtils.isNotBlank(inspectionTaskDto.getTaskName())) { queryWrapper.like(InspectionTask::getTaskName, inspectionTaskDto.getTaskName()); } if (StringUtils.isNotBlank(inspectionTaskDto.getInspectionProject())) { queryWrapper.like(InspectionTask::getInspectionProject, inspectionTaskDto.getInspectionProject()); } IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper); // æ æ°æ®æåè¿å if (CollectionUtils.isEmpty(entityPage.getRecords())) { return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); } List<Long> inspectionTaskIds = entityPage.getRecords().stream().map(InspectionTask::getId).toList(); Map<Long, List<InspectionTaskItem>> recordItemsByTask = inspectionTaskItemMapper.selectList( new LambdaQueryWrapper<InspectionTaskItem>() .in(InspectionTaskItem::getInspectionTaskId, inspectionTaskIds) .orderByAsc(InspectionTaskItem::getSortNum)) .stream().collect(Collectors.groupingBy(InspectionTaskItem::getInspectionTaskId)); //ç»è®°äººids List<Long> registrantIds = entityPage.getRecords().stream() .map(InspectionTask::getRegistrantId) .collect(Collectors.toList()); List<Long> registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).collect(Collectors.toList()); // æ¹éæ¥è¯¢ç»è®°äºº Map<Long, SysUser> sysUserMap; if (!registrantIds.isEmpty()) { @@ -119,7 +101,8 @@ // 使ç¨SQLæ¹éæ¥è¯¢ç¨æ·ä¿¡æ¯ Map<Long, String> userIdToNameMap = allUserIds.isEmpty() ? Collections.emptyMap() : sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds)).stream() : sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds)) .stream() .collect(Collectors.toMap( SysUser::getUserId, SysUser::getNickName, @@ -127,7 +110,6 @@ List<InspectionTaskDto> dtoList = entityPage.getRecords().stream().map(inspectionTask -> { InspectionTaskDto dto = new InspectionTaskDto(); BeanUtils.copyProperties(inspectionTask, dto); // å¤å¶ä¸»å¯¹è±¡å±æ§ dto.setInspectionItems(recordItemsByTask.getOrDefault(inspectionTask.getId(), Collections.emptyList())); // 设置ç»è®°äºº SysUser sysUser = sysUserMap.get(inspectionTask.getRegistrantId()); @@ -152,12 +134,10 @@ dto.setDateStr(inspectionTask.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); // åå§åä¸ä¸ªéä»¶å表 dto.setCommonFileListVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListAfterVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListBeforeVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListAfterVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListBeforeVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); return dto; }).collect(Collectors.toList()); @@ -195,9 +175,6 @@ if (i <= 0) { return i; } if (inspectionTaskDto.getInspectionItems() != null) { updateInspectionItemStatuses(inspectionTask.getId(), inspectionTaskDto); } Long linkedRepairId = syncRepairOrderIfAbnormal(inspectionTask, oldInspectionTask); if (linkedRepairId != null && !Objects.equals(linkedRepairId, inspectionTask.getDeviceRepairId())) { InspectionTask relationUpdate = new InspectionTask(); @@ -210,33 +187,6 @@ saveInspectionAttachments(inspectionTask.getId(), inspectionTaskDto); return i; } private void updateInspectionItemStatuses(Long inspectionTaskId, InspectionTaskDto request) { List<InspectionTaskItem> requestedItems = request.getInspectionItems(); List<InspectionTaskItem> currentItems = inspectionTaskItemMapper.selectList( new LambdaQueryWrapper<InspectionTaskItem>() .eq(InspectionTaskItem::getInspectionTaskId, inspectionTaskId)); Map<Long, InspectionTaskItem> currentById = currentItems.stream() .collect(Collectors.toMap(InspectionTaskItem::getId, Function.identity())); Set<Long> seenIds = new HashSet<>(); for (InspectionTaskItem requested : requestedItems) { if (requested == null || requested.getId() == null || requested.getItemStatus() == null || (requested.getItemStatus() != 0 && requested.getItemStatus() != 1) || !seenIds.add(requested.getId())) { throw new IllegalArgumentException("å·¡æ£å å®¹ç¶ææ æ"); } InspectionTaskItem current = currentById.get(requested.getId()); if (current == null) { throw new IllegalArgumentException("å·¡æ£å å®¹æ¸ åå·²ååï¼è¯·å·æ°åéè¯"); } current.setItemStatus(requested.getItemStatus()); current.setRemarks(requested.getRemarks()); current.setCompletedBy(requested.getItemStatus() == 1 ? SecurityUtils.getUserId() : null); current.setCompletedTime(requested.getItemStatus() == 1 ? LocalDateTime.now() : null); inspectionTaskItemMapper.updateById(current); } } private void validateInspectionInput(InspectionTaskDto inspectionTaskDto, InspectionTask oldInspectionTask) { @@ -272,24 +222,19 @@ private boolean hasAnyInspectionPhotoAfterSave(InspectionTaskDto inspectionTaskDto, InspectionTask oldInspectionTask) { Long recordId = oldInspectionTask == null ? null : oldInspectionTask.getId(); return hasApplicationPhotoAfterSave( inspectionTaskDto.getCommonFileListDTO(), ApplicationTypeEnum.FILE, recordId) || hasApplicationPhotoAfterSave( inspectionTaskDto.getCommonFileListAfterDTO(), ApplicationTypeEnum.AFTER_FILE, recordId) || hasApplicationPhotoAfterSave( inspectionTaskDto.getCommonFileListBeforeDTO(), ApplicationTypeEnum.BEFORE_FILE, recordId); return hasApplicationPhotoAfterSave(inspectionTaskDto.getCommonFileListDTO(), ApplicationTypeEnum.FILE, recordId) || hasApplicationPhotoAfterSave(inspectionTaskDto.getCommonFileListAfterDTO(), ApplicationTypeEnum.AFTER_FILE, recordId) || hasApplicationPhotoAfterSave(inspectionTaskDto.getCommonFileListBeforeDTO(), ApplicationTypeEnum.BEFORE_FILE, recordId); } private boolean hasApplicationPhotoAfterSave( List<StorageBlobDTO> requestPhotos, ApplicationTypeEnum applicationType, Long recordId) { private boolean hasApplicationPhotoAfterSave(List<StorageBlobDTO> requestPhotos, ApplicationTypeEnum applicationType, Long recordId) { if (requestPhotos != null) { return !requestPhotos.isEmpty(); } if (recordId == null) { return false; } return CollectionUtils.isNotEmpty(fileUtil.getStorageAttachmentsByApplicationAndRecordTypeAndRecordId( applicationType, RecordTypeEnum.INSPECTION_TASK, recordId)); return CollectionUtils.isNotEmpty(fileUtil.getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(applicationType, RecordTypeEnum.INSPECTION_TASK, recordId)); } private void fillAcceptanceInfo(InspectionTask inspectionTask, InspectionTask oldInspectionTask) { @@ -438,8 +383,6 @@ if (ids == null || ids.length == 0) { return 0; } inspectionTaskItemMapper.delete(new LambdaQueryWrapper<InspectionTaskItem>() .in(InspectionTaskItem::getInspectionTaskId, Arrays.asList(ids))); // å 餿件 fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -1,19 +1,10 @@ package com.ruoyi.inspectiontask.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.inspectiontask.mapper.InspectionTaskItemMapper; import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper; import com.ruoyi.inspectiontask.mapper.TimingTaskItemMapper; import com.ruoyi.inspectiontask.pojo.InspectionTask; import com.ruoyi.inspectiontask.pojo.InspectionTaskItem; import com.ruoyi.inspectiontask.pojo.TimingTask; import com.ruoyi.inspectiontask.pojo.TimingTaskItem; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import com.ruoyi.common.utils.StringUtils; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; @@ -31,14 +22,10 @@ @Component @DisallowConcurrentExecution // ç¦æ¢å¹¶åæ§è¡åä¸ä¸ªJob public class TimingTaskJob implements Job, Serializable { private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L; // å¿ é¡»å®ä¹åºååID @Autowired private InspectionTaskMapper inspectionTaskMapper; @Autowired private TimingTaskItemMapper timingTaskItemMapper; @Autowired private InspectionTaskItemMapper inspectionTaskItemMapper; @Autowired private JdbcTemplate jdbcTemplate; @@ -51,7 +38,7 @@ try { // 3. å°è¯æ¥è¯¢ä½ çä¸å¡æ°æ® // éè¿JDBCæ¨¡æ¿æ¥è¯¢å®æ¶ä»»å¡ä¿¡æ¯ï¼ä½¿ç¨åæ°åæ¥è¯¢é²æ¢SQLæ³¨å ¥ String yourSql = "SELECT * FROM timing_task WHERE id = ?"; String yourSql = "SELECT * FROM timing_task where id = ?"; List<TimingTask> tasks = jdbcTemplate.query( yourSql, new BeanPropertyRowMapper<>(TimingTask.class), @@ -72,7 +59,6 @@ // 2. å建并ä¿åå·¡æ£ä»»å¡è®°å½ - è¿å°±æ¯æ¨æä¾ç代ç åºè¯¥æ¾çä½ç½® InspectionTask inspectionTask = createInspectionTask(timingTask); inspectionTaskMapper.insert(inspectionTask); copyTaskItemsToRecord(timingTask.getId(), inspectionTask.getId()); // 3. æ´æ°å®æ¶ä»»å¡çæ§è¡æ¶é´ if (!tasks.isEmpty()) { @@ -89,9 +75,9 @@ ); // æ§è¡æ´æ°æä½ String updateSql = "UPDATE timing_task " + "SET last_execution_time = ?, next_execution_time = ? " + "WHERE id = ?"; String updateSql = "UPDATE timing_task " + "SET last_execution_time = ?, next_execution_time = ? " + "WHERE id = ?"; jdbcTemplate.update( updateSql, @@ -117,6 +103,7 @@ // å¤å¶åºæ¬å±æ§ inspectionTask.setTaskName(timingTask.getTaskName()); inspectionTask.setInspectionProject(timingTask.getInspectionProject()); inspectionTask.setTaskId(timingTask.getTaskId()); inspectionTask.setInspectorId(timingTask.getInspectorIds()); inspectionTask.setInspectionLocation(timingTask.getInspectionLocation()); @@ -131,25 +118,6 @@ inspectionTask.setTenantId(timingTask.getTenantId()); return inspectionTask; } private void copyTaskItemsToRecord(Long timingTaskId, Long inspectionTaskId) { List<TimingTaskItem> taskItems = timingTaskItemMapper.selectList( new LambdaQueryWrapper<TimingTaskItem>() .eq(TimingTaskItem::getTimingTaskId, timingTaskId) .orderByAsc(TimingTaskItem::getSortNum)); for (TimingTaskItem source : taskItems) { InspectionTaskItem recordItem = new InspectionTaskItem(); recordItem.setInspectionTaskId(inspectionTaskId); recordItem.setInspectionItemId(source.getInspectionItemId()); recordItem.setItemProject(source.getItemProject()); recordItem.setItemContent(source.getItemContent()); recordItem.setItemStatus(0); recordItem.setSortNum(source.getSortNum()); recordItem.setTenantId(source.getTenantId()); recordItem.setDeptId(source.getDeptId()); inspectionTaskItemMapper.insert(recordItem); } } @@ -275,27 +243,13 @@ for (String dayStr : dayStrs) { switch (dayStr) { case "MON": days.add(DayOfWeek.MONDAY); break; case "TUE": days.add(DayOfWeek.TUESDAY); break; case "WED": days.add(DayOfWeek.WEDNESDAY); break; case "THU": days.add(DayOfWeek.THURSDAY); break; case "FRI": days.add(DayOfWeek.FRIDAY); break; case "SAT": days.add(DayOfWeek.SATURDAY); break; case "SUN": days.add(DayOfWeek.SUNDAY); break; case "MON": days.add(DayOfWeek.MONDAY); break; case "TUE": days.add(DayOfWeek.TUESDAY); break; case "WED": days.add(DayOfWeek.WEDNESDAY); break; case "THU": days.add(DayOfWeek.THURSDAY); break; case "FRI": days.add(DayOfWeek.FRIDAY); break; case "SAT": days.add(DayOfWeek.SATURDAY); break; case "SUN": days.add(DayOfWeek.SUNDAY); break; default: throw new IllegalArgumentException("æ æçææå : " + dayStr); } } src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -4,16 +4,11 @@ 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.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.inspectiontask.dto.TimingTaskDto; import com.ruoyi.inspectiontask.mapper.InspectionItemMapper; import com.ruoyi.inspectiontask.mapper.TimingTaskItemMapper; import com.ruoyi.inspectiontask.mapper.TimingTaskMapper; import com.ruoyi.inspectiontask.pojo.InspectionItem; import com.ruoyi.inspectiontask.pojo.TimingTask; import com.ruoyi.inspectiontask.pojo.TimingTaskItem; import com.ruoyi.inspectiontask.service.TimingTaskService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; @@ -23,24 +18,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.DayOfWeek; import java.time.DateTimeException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Year; import java.time.YearMonth; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; 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.function.Function; import java.util.*; import java.util.stream.Collectors; /** @@ -55,11 +35,9 @@ private final TimingTaskMapper timingTaskMapper; private final TimingTaskScheduler timingTaskScheduler; private final SysUserMapper sysUserMapper; private final InspectionItemMapper inspectionItemMapper; private final TimingTaskItemMapper timingTaskItemMapper; private static final int ENABLED = 1; private static final int DISABLED = 0; @Override public IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask) { @@ -69,7 +47,9 @@ if (StringUtils.isNotBlank(timingTask.getTaskName())) { queryWrapper.like(TimingTask::getTaskName, timingTask.getTaskName()); } queryWrapper.eq(TimingTask::getDeleted, 0); if (StringUtils.isNotBlank(timingTask.getInspectionProject())) { queryWrapper.like(TimingTask::getInspectionProject, timingTask.getInspectionProject()); } if (timingTask.getIsEnabled() != null) { queryWrapper.eq(TimingTask::getIsEnabled, timingTask.getIsEnabled()); } @@ -133,16 +113,6 @@ dto.setInspector(inspectorNickNames); } List<TimingTaskItem> taskItems = timingTaskItemMapper.selectList( new LambdaQueryWrapper<TimingTaskItem>() .eq(TimingTaskItem::getTimingTaskId, task.getId()) .orderByAsc(TimingTaskItem::getSortNum)); dto.setInspectionItems(taskItems); dto.setInspectionItemIds(taskItems.stream() .map(TimingTaskItem::getInspectionItemId) .filter(Objects::nonNull) .collect(Collectors.toList())); return dto; }).collect(Collectors.toList()); @@ -161,11 +131,6 @@ if (oldTimingTask == null) { throw new IllegalArgumentException("宿¶ä»»å¡ä¸åå¨"); } } List<InspectionItem> selectedItems = resolveSelectedItems(timingTaskDto, oldTimingTask); List<TimingTaskItem> customItems = normalizeCustomItems(timingTaskDto.getCustomItems()); if (selectedItems.isEmpty() && customItems.isEmpty()) { throw new ServiceException("è¯·éæ©ææ·»å è³å°ä¸ä¸ªå·¡æ£å 容"); } TimingTask timingTask = new TimingTask(); BeanUtils.copyProperties(timingTaskDto, timingTask); @@ -191,23 +156,17 @@ LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask); timingTask.setNextExecutionTime(firstExecutionTime); int result = timingTaskMapper.insert(timingTask); if (result > 0) { saveTaskItems(timingTask, selectedItems, customItems); } if (result > 0 && isEnabled(timingTask.getIsEnabled(), timingTask.isActive())) { // æ°å¢æååæ·»å å°è°åº¦å¨ timingTaskScheduler.scheduleTimingTask(timingTask); } return result; } else { int result = timingTaskMapper.updateById(timingTask); if (result > 0) { timingTaskItemMapper.delete(new LambdaQueryWrapper<TimingTaskItem>() .eq(TimingTaskItem::getTimingTaskId, timingTask.getId())); saveTaskItems(timingTask, selectedItems, customItems); boolean oldEnabled = isEnabled( oldTimingTask == null ? null : oldTimingTask.getIsEnabled(), oldTimingTask != null && oldTimingTask.isActive()); 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()); @@ -223,94 +182,8 @@ } } private List<InspectionItem> resolveSelectedItems(TimingTask request, TimingTask oldTask) { List<Long> itemIds = request.getInspectionItemIds(); if (itemIds == null && oldTask != null) { itemIds = timingTaskItemMapper.selectList(new LambdaQueryWrapper<TimingTaskItem>() .eq(TimingTaskItem::getTimingTaskId, oldTask.getId())) .stream().map(TimingTaskItem::getInspectionItemId).filter(Objects::nonNull).toList(); } if (request.getTaskId() == null || StringUtils.isBlank(request.getFrequencyType())) { throw new ServiceException("设å¤åå·¡æ£é¢çä¸è½ä¸ºç©º"); } if (itemIds == null || itemIds.isEmpty()) { return new ArrayList<>(); } if (new HashSet<>(itemIds).size() != itemIds.size()) { throw new ServiceException("å·¡æ£å 容ä¸è½éå¤éæ©"); } List<InspectionItem> items = inspectionItemMapper.selectBatchIds(itemIds); if (items.size() != itemIds.size()) { throw new ServiceException("æéå·¡æ£å 容ä¸åå¨"); } Long deviceId = request.getTaskId().longValue(); String frequency = request.getFrequencyType(); Set<Long> oldItemIds = oldTask == null ? Collections.emptySet() : new HashSet<>(timingTaskItemMapper.selectList(new LambdaQueryWrapper<TimingTaskItem>() .eq(TimingTaskItem::getTimingTaskId, oldTask.getId())) .stream().map(TimingTaskItem::getInspectionItemId).filter(Objects::nonNull).toList()); boolean invalid = items.stream().anyMatch(item -> (item.getDeviceLedgerId() != null && !deviceId.equals(item.getDeviceLedgerId())) || !(frequency.equals(item.getFrequencyType()) || "ALL".equals(item.getFrequencyType())) || (item.getDeleted() != null && item.getDeleted() == 1 || item.getIsActive() == null || item.getIsActive() != 1) && !oldItemIds.contains(item.getId())); if (invalid) { throw new ServiceException("æéå·¡æ£å 容ä¸è®¾å¤æé¢çä¸å¹é "); } Map<Long, InspectionItem> itemMap = items.stream() .collect(Collectors.toMap(InspectionItem::getId, Function.identity())); return itemIds.stream().map(itemMap::get).toList(); } private List<TimingTaskItem> normalizeCustomItems(List<TimingTaskItem> customItems) { if (customItems == null) { return new ArrayList<>(); } return customItems.stream() .filter(Objects::nonNull) .filter(item -> StringUtils.isNotBlank(item.getItemProject()) && StringUtils.isNotBlank(item.getItemContent())) .peek(item -> { item.setItemProject(item.getItemProject().trim()); item.setItemContent(item.getItemContent().trim()); }) .toList(); } private void saveTaskItems( TimingTask task, List<InspectionItem> selectedItems, List<TimingTaskItem> customItems) { for (int index = 0; index < selectedItems.size(); index++) { InspectionItem source = selectedItems.get(index); TimingTaskItem taskItem = new TimingTaskItem(); taskItem.setTimingTaskId(task.getId()); taskItem.setInspectionItemId(source.getId()); taskItem.setItemProject(source.getItemProject()); taskItem.setItemContent(source.getItemContent()); taskItem.setSortNum(index); taskItem.setTenantId(task.getTenantId()); taskItem.setDeptId(task.getDeptId()); timingTaskItemMapper.insert(taskItem); } for (int index = 0; index < customItems.size(); index++) { TimingTaskItem source = customItems.get(index); TimingTaskItem taskItem = new TimingTaskItem(); taskItem.setTimingTaskId(task.getId()); taskItem.setItemProject(source.getItemProject()); taskItem.setItemContent(source.getItemContent()); taskItem.setSortNum(selectedItems.size() + index); taskItem.setTenantId(task.getTenantId()); taskItem.setDeptId(task.getDeptId()); timingTaskItemMapper.insert(taskItem); } } public LocalDateTime calculateFirstExecutionTime(TimingTask task) { // æ ¹æ®é¢çç±»åå详æ 计ç®é¦æ¬¡æ§è¡æ¶é´ if (task == null || StringUtils.isBlank(task.getFrequencyDetail())) { throw new IllegalArgumentException("请填å任塿§è¡æ¥æåæ¶é´"); } String frequencyType = task.getFrequencyType(); if ("DAILY".equals(frequencyType)) { // å¦ææ¯æ¯å¤©æ§è¡ï¼è®¡ç®ä»å¤©ææå¤©çå ·ä½æ¶é´ @@ -341,7 +214,6 @@ // æ å°ææç®åä¸DayOfWeek private static final Map<String, DayOfWeek> WEEK_DAY_MAP = new HashMap<>(); static { WEEK_DAY_MAP.put("MON", DayOfWeek.MONDAY); WEEK_DAY_MAP.put("TUE", DayOfWeek.TUESDAY); @@ -444,31 +316,7 @@ } private LocalDateTime calculateCustomFirstExecution(String frequencyDetail) { String[] parts = frequencyDetail.split(","); if (parts.length != 3) { throw new IllegalArgumentException("å£åº¦é¢çæ ¼å¼é误ï¼åºä¸º'å£åº¦å æä»½,æ¥æ,æ¶é´'"); } int monthInQuarter = Integer.parseInt(parts[0]); int dayOfMonth = Integer.parseInt(parts[1]); LocalTime time = LocalTime.parse(parts[2], DateTimeFormatter.ofPattern("HH:mm")); if (monthInQuarter < 1 || monthInQuarter > 3 || dayOfMonth < 1 || dayOfMonth > 31) { throw new IllegalArgumentException("å£åº¦é¢çæ¥ææ æ"); } LocalDateTime now = LocalDateTime.now(); int currentMonthInQuarter = (now.getMonthValue() - 1) % 3 + 1; int monthsUntilTarget = monthInQuarter - currentMonthInQuarter; if (monthsUntilTarget < 0) { monthsUntilTarget += 3; } YearMonth targetMonth = YearMonth.from(now).plusMonths(monthsUntilTarget); int targetDay = Math.min(dayOfMonth, targetMonth.lengthOfMonth()); LocalDateTime target = targetMonth.atDay(targetDay).atTime(time); if (!target.isAfter(now)) { targetMonth = targetMonth.plusMonths(3); target = targetMonth.atDay(Math.min(dayOfMonth, targetMonth.lengthOfMonth())).atTime(time); } return target; return null; } @Override @@ -616,27 +464,13 @@ for (String dayStr : dayStrs) { switch (dayStr) { case "MON": days.add(DayOfWeek.MONDAY); break; case "TUE": days.add(DayOfWeek.TUESDAY); break; case "WED": days.add(DayOfWeek.WEDNESDAY); break; case "THU": days.add(DayOfWeek.THURSDAY); break; case "FRI": days.add(DayOfWeek.FRIDAY); break; case "SAT": days.add(DayOfWeek.SATURDAY); break; case "SUN": days.add(DayOfWeek.SUNDAY); break; case "MON": days.add(DayOfWeek.MONDAY); break; case "TUE": days.add(DayOfWeek.TUESDAY); break; case "WED": days.add(DayOfWeek.WEDNESDAY); break; case "THU": days.add(DayOfWeek.THURSDAY); break; case "FRI": days.add(DayOfWeek.FRIDAY); break; case "SAT": days.add(DayOfWeek.SATURDAY); break; case "SUN": days.add(DayOfWeek.SUNDAY); break; default: throw new IllegalArgumentException("æ æçææå : " + dayStr); } } @@ -664,15 +498,12 @@ return activeFallback; } @Override public int delByIds(Long[] ids) { if (ids == null || ids.length == 0) { return 0; } int i = timingTaskMapper.deleteBatchIds(Arrays.asList(ids)); if (i > 0) { timingTaskItemMapper.delete(new LambdaQueryWrapper<TimingTaskItem>() .in(TimingTaskItem::getTimingTaskId, Arrays.asList(ids))); for (Long id : ids) { timingTaskScheduler.unscheduleTimingTask(id); }